Метод кривой Безье неправильно рисует в Java

По сути, я сделал код для рисования кривых Безье, но с ним что-то не так, он не рисует так, как предполагалось. Ядро этого кода должно быть правильным, оно было из одного из моих классов.

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

person David Augusta    schedule 04.02.2021    source источник
comment
Добро пожаловать в СО! Не могли бы вы предоставить [stackoverflow.com/help/ пример), пожалуйста? Я попытался скомпилировать ваш код, но он не находит класс G_Graphics. Кроме того, является ли матричное умножение внутри класса Util?   -  person Dominik Mokriš    schedule 06.02.2021
comment
Обратите внимание, что числовые массивы в Java уже инициализируются нулями, поэтому вам не нужен этот первый двойной цикл for. Сказав это: вы тестировали свой код умножения матриц? Потому что либо у вас есть, и вы знаете, что это не часть проблемы, либо нет, и вам, вероятно, следует сначала проверить, работает ли он правильно =) Сказав это, матрицу T необходимо вычислить для каждого шага< /i>, потому что это ваша переменная.   -  person Mike 'Pomax' Kamermans    schedule 08.02.2021


Ответы (1)


Проблема с этим кодом:

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

Эта матрица tValues является переменной, ее необходимо пересчитывать каждый раз, когда вы вычисляете точку для нового значения t. И это значение t определенно не должно храниться на уровне объекта, и очень определенно не должно инвертироваться каждый раз, когда вы запускаете функцию рисования. В качестве переменной цикла оставьте ее локальной для цикла 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
person Mike 'Pomax' Kamermans    schedule 08.02.2021
comment
я выполнял in в каждом цикле for, но немного по-другому. Проблема заключалась в том, что в этом коде я выполнял j ‹ 3 вместо j ‹ 4. - person David Augusta; 13.02.2021
comment
Бит t = 1/t; мне тоже показался странным. @DavidAugusta, этот ответ - решение твоей проблемы? Если да, рассмотрите возможность его принятия, пожалуйста. - person Dominik Mokriš; 26.02.2021