java中矩阵Bezier曲线绘制错误
基本上,我已经编写了绘制贝塞尔曲线的代码,但它有一些问题,它没有绘制出它是如何工作的。这段代码的核心应该是正确的,它来自我的一门课
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,0,0},
{-3,3,0,0},
{3,-6,3,0},
{-1,3,-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],pointsY[1][0],pointsX[2][0],pointsY[2][0],G_Color.G_cBlack);
graphic.DDA(pointsX[2][0],pointsY[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},
{100},
{350},
};
double pointsY[][] = new double[][]
{ {10},
{10},
{200},
{200},
};
Bezier bezier = new Bezier(pointsX, pointsY,10);
它就是这个
这是我的MatrixMultiplication代码
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;
}
# 1 楼答案
问题在于此代码:
因为
tValues
矩阵是一个变量,所以每当你为一个新的t
值计算一个点时,都需要重新计算它。而且t
值绝对不应该存储在对象级别,而且无论何时运行draw函数,超级绝对都不会反转。作为循环变量,将其保持在for
循环的本地。充其量,将step
大小存储在对象级别