问题描述
基本上我已经编写了绘制贝塞尔曲线的代码,但是它有问题,它没有绘制它的样子。这段代码的核心应该是正确的,它来自我的一个类。
public class Bezier {
double[][] pointsY;
double[][] pointsX;
double t;
public Bezier(double[][] pointsX,double[][] pointsY,double t) {
this.pointsY = pointsY;
this.pointsX = pointsX;
this.t = t;
}
public void drawCurvenormalize (G_Graphics graphic){
double[][] constants = {{1,0},{-3,3,{3,-6,{-1,-3,1} };
t = 1/t;
double[][] tValues = {{1,t,t*t,t*t*t}};
double[][] multix = Util.matrixMultiplication(constants,pointsX);
double[][] multiY = Util.matrixMultiplication(constants,pointsY);
double[][] multi1;
double[][] multi2;
int dY = 0;
int dX = 0;
int xBeginning = (int)pointsX[0][0];
int yBeginning = (int)pointsY[0][0];
/*graphic.DDA(pointsX[0][0],pointsY[0][0],pointsX[1][0],pointsY[1][0],G_Color.G_cBlack);
graphic.DDA(pointsX[1][0],pointsX[2][0],pointsY[2][0],G_Color.G_cBlack);
graphic.DDA(pointsX[2][0],pointsX[3][0],pointsY[3][0],G_Color.G_cBlack);*/
for (double i = t; i < 1; i+=t) {
double z = 1;
for (int j = 0; j < 3; j++) {
tValues[0][j] = z;
z = z*i;
}
multi1 = Util.matrixMultiplication(tValues,multix);
dX = (int)multi1[0][0];
multi2 = Util.matrixMultiplication(tValues,multiY);
dY = (int)multi2[0][0];
graphic.DDA(xBeginning,yBeginning,dX,dY,G_Color.G_cBlack);
xBeginning = dX;
yBeginning = dY;
}
}
输入点在这里
double pointsX[][] = new double[][]
{ {10},{100},{350},};
double pointsY[][] = new double[][]
{ {10},{10},{200},};
Bezier bezier = new Bezier(pointsX,pointsY,10);
它绘制了这个
但它应该在这些线之间画
这里也是我的矩阵乘法代码
public static double[][] matrixMultiplication(double[][] matrix1,double[][] matrix2) {
if (matrix1[0].length != matrix2.length) {
throw new RuntimeException("Matrix column/row fail");
}
double[][] matrixRet = new double[matrix1.length][matrix2[0].length];
for (int i = 0; i < matrix1.length; i++) {
for (int j = 0; j < matrix2[0].length; j++) {
matrixRet[i][j] = 0.0;
}
}
for (int i = 0; i < matrix1.length; i++) {
for (int j = 0; j < matrix2[0].length; j++) {
for (int k = 0; k < matrix1[0].length; k++) {
matrixRet[i][j] += matrix1[i][k] * matrix2[k][j];
}
}
}
return matrixRet;
}
解决方法
问题出在这段代码上:
t = 1/t;
double[][] tValues = {{1,t,t*t,t*t*t}};
...
for (double i = t; i < 1; i+=t) {
...
}
那个 tValues
矩阵是一个变量,每次为新的 t
值计算一个点时都需要重新计算。并且该 t
值绝对不应该存储在对象级别,并且 super 绝对 不会在您运行绘制函数时反转。作为您的循环变量,请将其保留在您的 for
循环本地。充其量,将您的 step
大小存储在对象级别。
beginDrawing(); // whatever is your API's equivalent of this
double[][] xVal,yVal;
for(double t=0,step=0.01; t<1.0; t+=step) {
double[][] tValues = {{1,t*t*t}};
// get the x coordinate **for this t value**
xVal = Util.matrixMultiplication(tValues,multiX);
// get the y coordinate **for this t value**
yVal = Util.matrixMultiplication(tValues,multiY);
addVertex(xVal[0][0],yVal[0][0]); // or equivalent
}
endDrawing(); // or equivalent