LINUX.ORG.RU

Поворот фигуры на угол

 , ,


0

1

Если неправильно выбрал раздел, перенесите, пожалуйста.

Последнее время дико туплю, чувствую, что в геометрии меня любой школьник уделает.
Есть четыре прямоугольника, которые нужно повернуть таким образом. Общий центр (чёрная точка) не меняется. Сами прямоугольники поворачиваю таким образом:

ctx.move_to(ZOOM * (r.x + (r.s_x / 2) * Math.cos(r.angle) - (r.s_y / 2) * Math.sin(r.angle)) - X_OFFSET,
            ZOOM * (r.y + (r.s_y / 2) * Math.cos(r.angle) + (r.s_x / 2) * Math.sin(r.angle)) - Y_OFFSET);
            
ctx.line_to(ZOOM * (r.x - (r.s_x / 2) * Math.cos(r.angle) - (r.s_y / 2) * Math.sin(r.angle)) - X_OFFSET,
            ZOOM * (r.y + (r.s_y / 2) * Math.cos(r.angle) - (r.s_x / 2) * Math.sin(r.angle)) - Y_OFFSET);
            
ctx.line_to(ZOOM * (r.x - (r.s_x / 2) * Math.cos(r.angle) + (r.s_y / 2) * Math.sin(r.angle)) - X_OFFSET,
            ZOOM * (r.y - (r.s_y / 2) * Math.cos(r.angle) - (r.s_x / 2) * Math.sin(r.angle)) - Y_OFFSET);
            
ctx.line_to(ZOOM * (r.x + (r.s_x / 2) * Math.cos(r.angle) + (r.s_y / 2) * Math.sin(r.angle)) - X_OFFSET,
            ZOOM * (r.y - (r.s_y / 2) * Math.cos(r.angle) + (r.s_x / 2) * Math.sin(r.angle)) - Y_OFFSET);
Где r — прямоугольник, x — позиция по X, y — позиция по Y, s_x — размер по X, s_y — размер по Y, angle — угол поворота в радианах.
Я знаю координаты центров прямоугольников до поворота (белые точки относительно чёрной точки). А как вычислить координаты центров прямоугольников после поворота?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Перенос в начало координат, поворот, перенос обратно. Перемножь матрицы и получи одну.

Deleted
()

Перевести все вершины в одну систему координат и повернуть одним преобразованием.

amaora ★★
()
Ответ на: комментарий от Deleted

Перенос в начало координат, поворот, перенос обратно

Если я правильно понимаю, то перенос мне не нужен, ибо я имею координаты белых точек относительно чёрной (центра вращения). А вот поворот меня и интересует.

CYB3R ★★★★★
() автор топика

Последнее время дико туплю, чувствую, что в геометрии меня любой школьник уделает

Ну это ещё не самое печально. Мы тут вчера за чашечкой кофе не могли вспомнить 8*9...

http://en.wikipedia.org/wiki/Rotation_matrix оно?

Stil ★★★★★
()

Перевести в полярную систему координат при помощи atan2 (угол поворота) и теоремы Пифагора (расстояние до начала координат), прибавить нужный угол, перевести обратно в декартовы при помощи синуса и косинуса.

prischeyadro ★★★☆☆
()
Ответ на: комментарий от Stil

Да нет же проще, все точки лежат на одной окружности. Нужно пройти этой точкой по этой окружности определённое расстояние, которое зависит от угла поворота и радиуса окружности и получить новые точки.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

/* посмотрел на картинку ещё раз */

Знаешь, мне кажется, что со своими «проще» ты как раз и переизобретаешь матрицу поворота...

Stil ★★★★★
()

Смотри. Всё, что ты делаешь - это поворот плоскости относительно некоторой зафиксированной неподвижной точки. Будем рассматривать твою плоскость как комплексную, соответственно координата на ней - это некое комплексное число z. Как повернуть что-то на заданный угол (обозначим его как Ф, т.к. я не могу в греческие буквы на ЛОРе)? Домножим координату на exp(i*Ф): f(z)=z*exp(i*Ф) - функция, поворачивающая всю твою комплексную плоскость. Она имеет неподвижную точку z=0+i*0 (тот самый центр твоего поворота). Если тебе нужен поворот с центром не в нуле, то распиши экспоненту по формуле Эйлера, подставь в формулу и подбери свободный член так, чтобы точка с необходимыми координатами была решением получающегося уравнения.
Соответственно, координаты центров квадратов можно найти подставив их в функцию f(z), предполагая, разумеется, что ты знаешь, на какой угол поворачиваешь.

Hasek ★★
()

На DirectX и на OpenGL это делается через матрицу поворота. Чтобы не изобретать ничего нового и не писать такие монструозные выражения, используй матрицы. На сясярпе такая библиотека умеет в матрицы: http://numerics.mathdotnet.com/docs/Matrix.html

nikolnik ★★★
()
Ответ на: комментарий от Bioreactor

У ТСа никакого упоминания по поводу языка программирования. Вот я и решил, что пишет он на дерьме каком-то. Так оно и оказалось. Жабка. Буээээ... Это надо ж так...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Bioreactor

обмазываться дерьмищем ради денег? мде... Человек явно так делать не будет. Только животное какое-нибудь. Гнусное.

Eddy_Em ☆☆☆☆☆
()

1. перенос центра поворота в начало координат.

2. поворот.

3. перенос обратно.

Сначала считаем три матрицы, потом их перемножаем, потом умножаем каждую точку на произведение всех матриц.

Сами прямоугольники поворачиваю таким образом

лучше-бы ты подрочил, чем такое вбивать…

emulek
()
Ответ на: комментарий от Eddy_Em

Ну так ИНОГДА же!

ага. Редко, да метко.

Изучать говно вместо ЯП сюда явно не относится

если-бы. Я тут говнопитон осилил. Вот теперь думаю осилить на досуге Rust.

emulek
()
Ответ на: комментарий от emulek

Я тут говнопитон осилил

Это же вообще надо кардинально свои мозги перелопатить.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.