Вычисление центра прямоугольника с координатами, длиной, шириной и углом - PullRequest
0 голосов
/ 19 июня 2020

Я хочу определить центр повернутого прямоугольника. Этот прямоугольник необходимо сначала вычислить (см. Рисунок). Для этого известно расстояние во всех четырех направлениях от существующей координаты p (x1, y1) (нос, левый борт, звезда, корма). Ориентация квадрата также указывается в градусах.

enter image description here

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

Кто-нибудь знает, как вычислить координаты вершин с этими входными данными (предпочтительно в Java)? Если кто-то знает другой более простой подход, буду очень признателен. Большое спасибо!

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Если ось star имеет вращение phi относительно оси OX, то вектор направления для нее равен

sx, sy = cos(phi), sin(phi)   //don't forget about radians and degrees

перпендикулярный (bow направление) вектор равен

bx, by = -sy, sx

Итак, самая верхняя вершина на картинке имеет координаты

tx = px + star * sx + bow * bx
ty = py + star * sy + bow * by

Нижняя вершина:

ux = px - port * sx - stern * bx
uy = py - port * sy - stern * by

Центр прямоугольника находится в середине этих вершин

cx = px + sx * (star - port) / 2 + bx * (bow - stern) / 2
cy = py + sy * (star - port) / 2 + by * (bow - stern) / 2

И возвращение b* переменные в sx, sy: и с учетом желаемого направления угла:

cx = px + sx * (star - port) / 2 + sy * (bow - stern) / 2
cy = py - sy * (star - port) / 2 + sx * (bow - stern) / 2
0 голосов
/ 22 июня 2020

Альтернативная формула (источник: https://www.researchgate.net/publication/238090180_A_Study_on_the_efficiency_enhancement_of_automatic_radar_tracking_and_analyses_of_marine_traffic_in_Tokyo_Bay):

c_cog = Math.toRadians(course);
double xc = pos_x + (bow - stern) * Math.sin(course) / 2 + (star-port) * Math.sin(course+90) / 2;
double yc = pos_y + (bow - stern) * Math.cos(course)/2 + (star-port) * Math.cos(course+90) / 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...