Как найти координаты углов прямоугольника

Методы определения углов прямоугольника по координатам его вершин

Прямоугольник – это четырехугольник, у которого противоположные стороны параллельны и имеют равные длины, а углы при смежных сторонах прямые.

Для определения углов прямоугольника необходимо знать координаты его вершин. На данный момент существует несколько методов для решения этой задачи:

1. Метод с помощью теоремы Пифагора

Этот метод основан на теореме Пифагора, гласящей, что в прямоугольном треугольнике квадрат гипотенузы равен сумме квадратов катетов. Расстояние между двумя точками в прямоугольной системе координат может быть вычислено с помощью этой теоремы – это длина гипотенузы такого треугольника, а координаты вершин являются координатами катетов. Определив длины всех сторон прямоугольника, можно легко вычислить все углы.

2. Метод с помощью тангенсов

Этот метод основан на использовании тангенсов углов. Если известны координаты двух точек прямоугольника, можно вычислить тангенс угла между отрезком, соединяющим эти точки, и осью абсцисс (или осью ординат). Зная тангенс угла, можно определить его значение и, следовательно, все углы прямоугольника.

3. Метод с помощью скалярного произведения векторов

Этот метод основан на использовании скалярного произведения векторов. Его применение заключается в построении векторов для каждой пары точек прямоугольника и вычислении скалярного произведения между ними. Используя свойство скалярного произведения, можно определить угол между векторами, что дает возможность определить угол между прямыми, проходящими через эти точки. Зная угол между двумя сторонами прямоугольника, можно вычислить все остальные углы.

Заключение

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

Зная координаты центра, ширину, длину, угол поворот прямоугольника. Как теперь найти координаты всех углов повернутого прямоугольника?

Kromster's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 17 фев 2021 в 15:09

егор щербанов's user avatar

4

Не понятно, что такое “длина” – обычно у прямоугольника выделяют ширину и высоту. Для них и отвечаю…

введите сюда описание изображения

Kromster's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

ответ дан 17 фев 2021 в 15:23

Harry's user avatar

HarryHarry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

1

One simple way would be to:

  1. find all connected components
  2. calculate the convex hull for each component
  3. pick the component where the convex hull has the largest area
  4. simplify the convex hull polygon
  5. the vertices of the simplified polygon are the points you’re looking for

Quick&dirty Mathematica solution:

(* find all connected components, calculate the convex hull for each component *)
convexHulls = ComponentMeasurements[ColorNegate[Binarize[src]], {"ConvexArea", "ConvexVertices"}];

(* pick the component where the convex hull has the largest area *)
vertices = SortBy[convexHulls[[All, 2]], First][[-1, 2]]

(* simplify the convex hull polygon, by iteratively removing the vertex with the lowest distance to the line through the vertex before and after it *)
distanceToNeighbors[vertices_] := MapThread[Abs[(#1 - #2).Cross[#1 - #3]/Norm[#1 - #3]]&, RotateLeft[vertices, #] & /@ {-1, 0, 1}]
removeVertexWithLowestDistance[vertices_] := With[{removeIndex = Ordering[distanceToNeighbors[vertices], 1]}, Drop[vertices, removeIndex]]
verticesSimplified = NestWhile[removeVertexWithLowestDistance, vertices, Min[distanceToNeighbors[#]] < 10&]

(* the vertices of the simplified polygon are the points you're looking for *)
Show[src, Graphics[
  {
   {EdgeForm[Red], Transparent, Polygon[verticesSimplified]},
   {Red, PointSize[Large], Point[verticesSimplified]}
   }]]

Result

1) Не забываем условие, что стороны прямоугольника паралельны координатным осям – это возможно только в случае, когда у нас для 4-х точек (x1,y1), (x2,y2), (x3,y3), (x4,y4) выполняются сразу 4 условия:
x1=x2, x3=x4, y1=y3, y2=y4

2) Выбираем все уникальные х-координаты, которые представлены более чем в 1 экземпляре – это набор прямых проходящий через точки нашего набора параллельно оси Oy.
Для этих прямых выбираем все точки из исходного списка, которые на них лежат.

3) По аналогии с пунктом 2 делаем тоже самое для y

4) В итоге, мы имеем два набора точек – один рассчитанный в пункте 2 и второй в пункте 3, причем, сразу заметим, что часть точек присутствуют в обеих, а часть только в одном из них и эту вторую часть можно будет сразу отбросить, так как они не находятся на пересечении прямых.

5) Дальше используя комбинаторику перебираем все варианты пар точек по горизонтали и аналогичный по вертикали, считая площади, не забывая проверять пункт 1.
Вот этот пункт самый ресурсоёмкий и его можно оптимизировать.

6) Площади считаем из координат по простой формуле: S = (x3-x1) * (y2-y1)

Может кто-нибудь дать мне алгоритм, который находит положение всех четырех углов прямоугольника, если я знаю его центральную точку (в глобальном координатном пространстве), ширину и высоту и его вращение вокруг этой центральной точки?

Редактирование пояснения: ширина и высота, о которых я говорю, – это длина сторон прямоугольника.

3 ответа

Лучший ответ

Верхний правый угол имеет координаты w / 2, h / 2 относительно центра. После поворота его абсолютные координаты

 x = cx + w/2 * Cos(Phi) - h/2 * Sin(Phi)
 y = cy + w/2 * Sin(Phi) + h/2 * Cos(Phi)


5

MBo
27 Янв 2017 в 17:01

Если вам нужны все углы, может быть быстрее создать два перпендикулярных вектора из центра прямоугольника к обеим его сторонам, а затем сложить / вычесть эти векторы в / из центра прямоугольника, чтобы сформировать точки ,

Это может быть быстрее, так как вам не нужно повторно вызывать функции sin () и cos () (вы делаете это только один раз для каждой).

Предполагая, что у нас есть библиотека Vector (для более чистого кода – помогает только с векторной арифметикой), вот код на Python:

def get_corners_from_rectangle(center: Vector, angle: float, dimensions: Vector):
   # create the (normalized) perpendicular vectors
   v1 = Vector(cos(angle), sin(angle))
   v2 = Vector(-v1[1], v1[0])  # rotate by 90

   # scale them appropriately by the dimensions
   v1 *= dimensions[0] / 2
   v2 *= dimensions[1] / 2

   # return the corners by moving the center of the rectangle by the vectors
   return [
      center + v1 + v2,
      center - v1 + v2,
      center - v1 - v2,
      center + v1 - v2,
   ]


2

Tomáš Sláma
2 Июл 2019 в 08:16

Координаты каждой вершины:

 Center point = (center.x, center.y)
 Angle        = angle
 Height       = height
 Width        = width      



TOP RIGHT VERTEX:
Top_Right.x = center.x + ((width / 2) * cos(angle)) - ((height / 2) * sin(angle))
Top_Right.y = center.y + ((width / 2) * sin(angle)) + ((height / 2) * cos(angle))



TOP LEFT VERTEX:
Top_Left.x = center.x - ((width / 2) * cos(angle)) - ((height / 2) * sin(angle))
Top_Left.y = center.y - ((width / 2) * sin(angle)) + ((height / 2) * cos(angle))



BOTTOM LEFT VERTEX:
Bot_Left.x = center.x - ((width / 2) * cos(angle)) + ((height / 2) * sin(angle))
Bot_Left.y = center.y - ((width / 2) * sin(angle)) - ((height / 2) * cos(angle))



BOTTOM RIGHT VERTEX:
Bot_Right.x = center.x + ((width / 2) * cos(angle)) + ((height / 2) * sin(angle))
Bot_Right.y = center.y + ((width / 2) * sin(angle)) - ((height / 2) * cos(angle))

Этот алгоритм является сжатой версией этих 3 шагов:

Шаг 1: Сосредоточьте прямоугольник вокруг источника

Шаг 2: применить матрицу вращения к каждой вершине

Шаг 3: Переместите повернутый прямоугольник в правильное положение, добавив центральную точку к каждой координате

Это объясняется более подробно здесь https://math.stackexchange.com / вопросы / 126967 / поворотно- а- прямоугольник – через – а- матрица поворота


0

Toni
7 Май 2020 в 18:00

Добавить комментарий