Рассчитать ширину и высоту по 4 точкам многоугольника

У меня есть четыре точки, которые образуют прямоугольник, и я позволяю пользователю перемещать любую точку и поворачивать прямоугольник на угол (который поворачивает каждую точку вокруг центральной точки). Он остается почти идеальной прямоугольной формы (насколько позволяет точность PointF). Вот пример моего «прямоугольника», нарисованного из четырех точек:

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

Однако мне нужно иметь возможность получить ширину и высоту между точками. Это легко, когда прямоугольник не повернут, но как только я поверну его, моя математика возвращает ширину и высоту, показанные красным контуром здесь:

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

Предполагая, что я знаю порядок точек (например, по часовой стрелке от верхнего левого угла), как мне получить ширину и высоту прямоугольника, который они представляют?


person Trevor Elliott    schedule 19.09.2011    source источник
comment
Это действительно больше проблема геометрии. Вы можете взять первые три точки и вычислить длины ребер. Если вы хотите немного повысить точность, вы можете усреднить длины с двумя другими длинами ребер. Формулу см. здесь: en.wikipedia.org/wiki/Pythagorean_theorem   -  person Dan Bryant    schedule 19.09.2011
comment
Можете ли вы точно определить, что вы подразумеваете под шириной повернутого прямоугольника?   -  person Eric Lippert    schedule 19.09.2011
comment
Это то же самое, что и не повернутый прямоугольник. Например, если вы возьмете прямоугольник из четырех точек шириной 100, а затем повернете его, ширина не должна измениться. Вы должны быть в состоянии вычислить это значение 100 независимо от поворота прямоугольника.   -  person Trevor Elliott    schedule 19.09.2011


Ответы (3)


Если под «шириной» и «высотой» вы просто имеете в виду длину ребер, и у вас есть 4 структуры PointF в списке или массиве, вы можете сделать:

double width = Math.Sqrt( Math.Pow(point[1].X - point[0].X, 2) + Math.Pow(point[1].Y - point[0].Y, 2));
double height = Math.Sqrt( Math.Pow(point[2].X - point[1].X, 2) + Math.Pow(point[2].Y - point[1].Y, 2));
person Reed Copsey    schedule 19.09.2011

Просто используйте алгоритм для расстояния между двумя точками. Если у вас есть точки A, B, C, D, вы получите два расстояния.

sqrt((Bx-Ax)^2 + (By-Ay)^2) будет равно sqrt((Dx-Cx)^2 + (Dy-Cy)^2)

sqrt((Cx-Bx)^2 + (Cy-By)^2) будет равно sqrt((Ax-Dx)^2 + (Ay-Dy)^2)

Выберите один, который будет вашей шириной, и один, чтобы быть вашим ростом.

person Alain    schedule 19.09.2011

Допустим, самый верхний угол - это A. Затем назовите другие ребра против часовой стрелки как ABCD.

ширина прямоугольника = расстояние между A и B
высота прямоугольника = расстояние между B и C

Формула для нахождения расстояния между двумя точками, скажем, A(x1,y1) и B(x2,y2):

d = sqrt( (x2 - x1)^2 + ( y2 - y1)^2 )

где d — расстояние.

person Arslan Ahson    schedule 19.09.2011