2015-07-27 2 views
1

Скажем, у меня есть прямоугольник (R) и внутри указанного прямоугольника, у меня есть две точки, A и B. Мне нужно повернуть прямоугольник вокруг центральной точки (C) до точки A и B имеют равные y координаты. Поскольку решение этого вопроса могло бы дать два отдельных ответа (где Ax - < Bx, а где Ax> Bx), я хотел бы ограничить это, чтобы разрешить решение, где Ax < Bx.Поверните прямоугольник до тех пор, пока две точки не будут иметь одинаковые координаты y

Моим решением является решение для тета при вращении вокруг M (средняя точка между A и B), а затем для поворота вокруг C по тете (ниже).

Будет ли это работать во всех случаях/является ли это оптимальным? Заранее спасибо!

CGPoint m = CGPointMake(a.x/2 + b.x/2, a.y/2 + b.y/2); 
float dx = m.x - a.x; 
float dy = m.y - a.y; 
float radians = -atan2f(dy, dx) 
+0

Очень удобно размещать свой код. Доверьтесь мне! – Olaf

+1

Угол, который вам нужно вращать, тот же, независимо от того, в какой точке вы его вращаете. – caf

+0

caf5 - Я считаю, что вы правы. Я отправлю свой код, как только вернусь к моему компьютеру. – eurekabeacon

ответ

1

Можно выполнить вращение вокруг С, но определить угол поворота, исследуя отношения между точками А и В. Угол поворота будет -atan2(dy, dx), где dy = B.y-A.y и dx = B.x-A.x.

Диапазон atan2 равен до M_PI, поэтому выражение всегда будет обеспечивать наименьшее вращение, чтобы линия AB параллельна оси x. Чтобы получить результат, где A.x < B.x, рассмотрите знак dx. Отрицательный dx означает, что A.x> B.x. В этом случае ваше вращение должно быть отрегулировано с помощью pi. Подводя итог:

CGPoint A = // some point 
CGPoint B = // some point 

CGFloat dx = B.x - A.x; 
CGFloat dy = B.y - A.y; 
CGFloat rotation = (dx < 0)? M_PI+atan2(dy,dx) : -atan2(dy,dx); 

Примените поворот к любой точке, которую вы хотите, в системе координат прямоугольника. Прямоугольник будет повернут вокруг этой точки, чтобы линия AB была параллельна оси x, оставляя A.x < B.x.

+0

Можете ли вы объяснить, почему это уравнение не является: CGFloat rotation = (dx <0)? M_PI + atan2 (powf (dy, 2), powf (dx, 2)): -atan2 (powf (dy, 2), powf (dx, 2)); – eurekabeacon

+0

Нам нужен простой наклон для вычисления arctan, это изменение x, деленное на изменение y. – danh

+0

Я считаю, что метод выше также работает, используя середину, так как он дает тот же результат. – eurekabeacon

Смежные вопросы