Как сделать корректное вращение полигона? (в C#, хотя это относится к чему-либо),

Привет я использую этот код C# для вращения полигонов в моем приложении - они действительно вращаются, но также и скашиваются по пути, который не является тем, что я хочу произойти. Все полигоны являются прямоугольниками с четырьмя углами, определенными как 2D Векторы,

    public Polygon GetRotated(float radians)
    {

        Vector origin = this.Center;
        Polygon ret = new Polygon();
        for (int i = 0; i < points.Count; i++)
        {
            ret.Points.Add(RotatePoint(points[i], origin, radians));
        }
        return ret;
    }

    public Vector RotatePoint(Vector point, Vector origin, float angle)
    {
        Vector ret = new Vector();
        ret.X = (float)(origin.X + ((point.X - origin.X) * Math.Cos((float)angle)) - ((point.Y - origin.Y) * Math.Sin((float)angle)));
        ret.Y = (float)(origin.Y + ((point.X - origin.X) * Math.Sin((float)angle)) - ((point.Y - origin.Y) * Math.Cos((float)angle)));
        return ret;
    }
8
задан bharling 10 August 2010 в 16:13
поделиться

5 ответов

Похоже, ваше преобразование вращения неверно. Вам следует использовать:

x' = x*Cos(angle) - y*Sin(angle)
y' = x*Sin(angle) + y*Cos(angle)

Для получения дополнительной информации проверьте различные источники в Интернете. :)

7
ответ дан 5 December 2019 в 10:00
поделиться

У меня пока нет ответа на вопрос, почему он искажается, но у меня действительно есть предложение сделать код более понятным:

public Vector RotatePoint(Vector point, Vector origin, float angle)
{
    Vector translated = point - origin;
    Vector rotated = new Vector
    {
        X = translated.X * Math.Cos(angle) - translated.Y * Math.Sin(angle),
        Y = translated.X * Math.Sin(angle) + translated.Y * Math.Cos(angle)
    };
    return rotated + origin;
}

(Предполагается, что В векторе определены соответствующие операторы +/-.)

Вам может понадобиться несколько приведений к float , но вы все равно получите меньше скобок, запутывающих вещи. О, и вам определенно не нужно преобразовывать angle в float , учитывая, что он уже объявлен как float .

РЕДАКТИРОВАТЬ: Примечание о задействованных матрицах вращения - это зависит от того, выбираете ли вы угол по часовой стрелке или против часовой стрелки. Я не удивлюсь, если узнаю, что матрица действительно идет не так (я пытался ее проверить, но, видимо, испортился) ... но «другое» не обязательно означает "неправильный". Надеюсь, матрица что не так, правда :)

6
ответ дан 5 December 2019 в 10:00
поделиться

Думаю, ваша матрица вращения неверна. Во втором уравнении должно быть + вместо - :

+cos  -sin
+sin  +cos
3
ответ дан 5 December 2019 в 10:00
поделиться

Просто дикое предположение - уверены ли вы, что соотношение сторон разрешения вашего рабочего стола такое же, как у физического экрана? То есть, являются ли пиксели квадратными? Если нет, то при повороте прямоугольников на произвольный угол они могут выглядеть перекошенными.

0
ответ дан 5 December 2019 в 10:00
поделиться

Предполагая, что происхождение равно 0,0. Из вашей формулы я бы получил: X '= (X + ((X - 0) * Cos (угол)) - ((Y - 0) * Sin (угол))); X '= X + (X * Cos (угол)) - (Y * Sin (угол));

Что отличается от исходной формулы x '= x * cos angle - y * cos angle

Так что я думаю, что ответ Джона Скита правильный и ясный.

1
ответ дан 5 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: