Изменить происхождение экрана PrintEventArgs.Графика на C#

#c# #matrix #rotation #screen

#c# #матрица #поворот #экран

Вопрос:

Я возился с рисованием 3D-объектов на C # с помощью PaintEventArgs.Графика и следующий код

 public void findPoints()
{
    xp1 = (p1x * 1000) / (p1z   1000);
    xp2 = (p2x * 1000) / (p2z   1000);
    xp3 = (p3x * 1000) / (p3z   1000);
    xp4 = (p4x * 1000) / (p4z   1000);
    yp1 = (p1y * 1000) / (p1z   1000);
    yp2 = (p2y * 1000) / (p2z   1000);
    yp3 = (p3y * 1000) / (p3z   1000);
    yp4 = (p4y * 1000) / (p4z   1000);
    xp5 = (p5x * 1000) / (p5z   1000);
    xp6 = (p6x * 1000) / (p6z   1000);
    xp7 = (p7x * 1000) / (p7z   1000);
    xp8 = (p8x * 1000) / (p8z   1000);
    yp5 = (p5y * 1000) / (p5z   1000);
    yp6 = (p6y * 1000) / (p6z   1000);
    yp7 = (p7y * 1000) / (p7z   1000);
    yp8 = (p8y * 1000) / (p8z   1000);
}

private void drawCube(PaintEventArgs e)
{
    /*
     * Bottom left = 1
     * Bottom right = 2
     * Top right = 3
     * Top left = 4
     * Back Top left = 5
     * Back Top right = 6
     * Back bottom right = 7
     * Back bottom left = 8
     */
    findPoints();
    Graphics g = e.Graphics;
    g.DrawLine(pen, xp1, yp1, xp2, yp2);
    g.DrawLine(pen, xp2, yp2, xp3, yp3);
    g.DrawLine(pen, xp3, yp3, xp4, yp4);
    g.DrawLine(pen, xp4, yp4, xp1, yp1);
    g.DrawLine(pen, xp1, yp1, xp8, yp8);
    g.DrawLine(pen, xp8, yp8, xp7, yp7);
    g.DrawLine(pen, xp7, yp7, xp2, yp2);
    g.DrawLine(pen, xp2, yp2, xp7, yp7);
    g.DrawLine(pen, xp7, yp7, xp6, yp6);
    g.DrawLine(pen, xp6, yp6, xp3, yp3);
    g.DrawLine(pen, xp3, yp3, xp6, yp6);
    g.DrawLine(pen, xp6, yp6, xp5, yp5);
    g.DrawLine(pen, xp5, yp5, xp4, yp4);
    g.DrawLine(pen, xp4, yp4, xp5, yp5);
    g.DrawLine(pen, xp5, yp5, xp8, yp8);
}
  

Проблема возникает, когда я пытаюсь манипулировать кубом, нарисованным с помощью Matrix.Rotate и вложенных циклов for .

Например, я могу сделать круг с помощью следующего кода.

 private void rotateCube(PaintEventArgs e, int value)
{
    Matrix myMatrix = new Matrix();
    myMatrix.Rotate(value, MatrixOrder.Append);
    e.Graphics.Transform = myMatrix;
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
    for (int x = 0; x < 360;   x)
    {
        rotateCube(e, x);
        Thread.Sleep(3);
        drawCube(e);
    }
}
  

Когда я использую этот код для рисования круга, я получаю только нижнюю правую часть круга, потому что начало экрана (и центр круга) равно 0,0 в системе координат или в верхнем левом углу монитора. Мой вопрос … есть ли способ переместить начало экрана или окружность, возможно, в середину экрана?

Ответ №1:

Умножьте свою матрицу вращения на матрицу преобразования.

Имейте в виду, что перемещение камеры на (100 пикселей, 100 пикселей) эквивалентно перемещению вашей модели на (-100 пикселей, — 100 пикселей).

Комментарии:

1. Так просто, но я об этом не думал. Большое спасибо!