有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);

它就是这个

and it drawes this

但它应该在这些界限之间划清界限 but it should draw betwen those lines

这是我的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) 个答案

  1. # 1 楼答案

    问题在于此代码:

    t = 1/t;
    double[][] tValues = {{1,t,t*t,t*t*t}};
    ...
    for (double i = t; i < 1; i+=t) {
      ...
    }
    

    因为tValues矩阵是一个变量,所以每当你为一个新的t值计算一个点时,都需要重新计算它。而且t值绝对不应该存储在对象级别,而且无论何时运行draw函数,超级绝对都不会反转。作为循环变量,将其保持在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,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