Матрица вращения в C # рисует странную форму

#c# #.net #graphics #rotation

#c# #.net #графика #вращение

Вопрос:

Я пытаюсь перевести точку по окружности круга.

Чтобы протестировать свой код, я просто перевожу точку и провожу линию от центра до переведенной точки для каждого приращения угла.

Это должно выглядеть как велосипедное колесо, однако оно больше похоже на лопату. Как ни странно, она выглядит одинаково, независимо от того, использовал ли я радианы или градусы в математических функциях.

 for (double degrees = 0; degrees <= 360; degrees  = 1)
{
    double radians = Math.PI * degrees / 180.0;
    Console.Write("degrees = "   degrees   " radians = "   radians);
    double sx = 0.0;
    double sy = -100.0;
    sx = ((sx * Math.Cos(radians))   (sy * Math.Sin(radians)));
    sy = (-(sx * Math.Sin(radians))   (sy * Math.Cos(radians)));

    Console.WriteLine(", sx = "   sx   ", sy = "   sy);

    g.DrawLine(new Pen(Brushes.GhostWhite), 200, 200, (int)sx 200, (int)sy 200);
}
  

Ответ №1:

Итак, ваша математика верна. Вы вычисляете вращение, используя эту матрицу.

 [cos(r)  sin(r)]
[-sin(r) cos(r)]
  

Но ваше кодирование неверно!

Вы уже изменили sx значение поворота, прежде чем использовать его для вычисления sy !

Вы выполняете вычисления для x и y последовательно, тогда как в матрице они выполняются одновременно. Таким образом, ваша координата y вычисляется неправильно, используя, так сказать, искаженную систему координат…

Вам нужно сделать это:

 double sx = 0.0;
double sy = -100.0;
double nsx = ((sx * Math.Cos(radians))   (sy * Math.Sin(radians)));
double nsy = (-(sx * Math.Sin(radians))   (sy * Math.Cos(radians)));

g.DrawLine(new Pen(Brushes.GhostWhite), 200, 200, (int)nsx 200, (int)nsy 200);
  

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

1. блин, почему я этого не видел / facepalm

Ответ №2:

     double radius = 200;

    for (double degrees = 0; degrees <= 360; degrees  = 1)
    {
        double radians = Math.PI * degrees / 180.0;

        int sx = (int) (200    radius * Math.Cos(radians));
        int sy = (int) (200    radius * Math.Sin(radians));

        g.DrawLine(new Pen(Brushes.GhostWhite), 200, 200, sx, sy);
    }
  

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

1. Объяснение изменений кода, которые вы сделали, сделало бы это реальным ответом.

Ответ №3:

Я думаю, что это чисто математическая проблема. Попробуйте:

 double radius = 100;
double sx = radius * Math.Cos(radians);
double sy = radius * Math.Sin(radians);