2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Как представить повёрнутый прямоугольник?
Сообщение16.06.2017, 23:19 
Ищу удобный способ работать в коде с произвольными прямоугольниками на плоскости. Ищу и не нахожу.

Несложно описать прямоугольник со сторонами, параллельными осям координат: он описывается четырьмя числами — две координаты левого верхнего угла + длина + ширина, либо вместо длины и ширины можно использовать две координаты правого нижнего угла. У этих представлений есть важное свойство: они по сути векторные (в первом случае имеем радиус-вектор и вектор, во втором два радиус-вектора), что позволяет писать более лаконичный и понятный код. Так, чтобы перейти от первого представления ко второму, мне нужно просто прибавить один вектор к другому.

А есть ли аналогичный способ описать прямоугольник, повёрнутый на произвольный угол? Простейший вариант — прямогульник + угол — весьма коряв. Пять координат — ни вектор, ни матрица, ни кватернион. Вместо красивых векторно-матричных операций в коде появляются какие-то страшные синусы-косинусы, в общем низкоуровневая возня с координатами.

Я подозреваю, что должен быть способ красиво представить произвольный прямоугольник, но мои попытки скомбинировать эти пять чисел во что-то приличное не увенчались успехом. Не знаю, удалось ли мне внятно объяснить, чего я хочу, но может у кого-нибудь есть идеи?

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение16.06.2017, 23:26 
Аватара пользователя
Вершина $A$, вектор $\overrightarrow{AB}$ и aspect ratio?

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение16.06.2017, 23:45 
Xaositect, да, пока писал сообщение что-то похожее мне в голову пришло. Правда возникает сложность с прямоугольниками с нулевой шириной, так что лучше наверно так: вершина $A$, орт $\vec e_{AB}$ и длины сторон. Тогда всё вроде даже красиво получается: чтобы повернуть мы вертим орт, чтобы отмасштабировать мы масштабируем длины сторон, чтобы передвинуть меняем точку $A$. А матрица поворота одного прямоугольника в другой легко получается из скалярного и второго скалярного произведения ортов.

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение16.06.2017, 23:58 
Аватара пользователя
Я бы попробовал площадь, сторону и вектор трансляции вершины.

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 00:06 
Аватара пользователя
Вершина, диагональ и скалярное произведение ребра на диагональ?...
Вершина, ребро, площадь?...
Различимы ли "идентичные" прямоугольники с разной ориентацией?

Думаю, всё же, от задачи зависит :-)

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 00:14 
Аватара пользователя
Geen в сообщении #1226418 писал(а):
Вершина, ребро, площадь?
IMHO, эта комбинация предпочтительней, поскольку площадь - инвариант, а вершина и ребро - пара векторов из начала координат, для которых работает стандартный векторный пакет.

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 00:23 
Аватара пользователя
amon в сообщении #1226419 писал(а):
Geen в сообщении #1226418 писал(а):
Вершина, ребро, площадь?
IMHO, эта комбинация предпочтительней, поскольку площадь - инвариант, а вершина и ребро - пара векторов из начала координат, для которых работает стандартный векторный пакет.

Вполне возможно. Единственное что мне не очень нравится - некоторая несимметричность :-) и мне трудно представить задачу где бы был именно прямоугольник... А вот если параллелограм, то три вектора "хорошо" всё описывают :mrgreen:

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 00:36 
Плюсую вариант «вершина, направленная сторона, ориентированная площадь». Последняя тоже вектор, кстати (бивектор): $\mathbf a\wedge\mathbf b$. Можно, кроме того, определить какую-нибудь билинейную функцию от вектора и бивектора, позволяющую, например, получить вектор второй стороны по вектору первой и данной площади.

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 07:18 
Ээээ... Вопрос «как представить» без предварительного «как работать», как по мне, вообще смысла особого не имеет, не?

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 09:32 
Спасибо, варианты в самом деле интересные. Если ни один не подойдёт, тогда уже можно будет отталкиваться от этого.

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 09:48 
Аватара пользователя
Не нравится синусы и косинусы?
Учить ООП, принцип сокрытия.

Если хотите матрицы, то можно хранить вершины 3-х или 4-ре.
А если хоте сохранить сохранить Евклидовасть, то хранить обычный прямоугольник плюс кватернион.

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 20:07 

(Оффтоп)

Кстати, какая польза от кватернионов на плоскости?


-- Сб июн 17, 2017 22:10:51 --

Кстати, представление с бивектором будет работать и в пространстве произвольной размерности. Там у него, конечно, будет больше одной компоненты.

 
 
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение26.09.2017, 16:55 
Аватара пользователя
warlock66613 в сообщении #1226398 писал(а):
Ищу удобный способ работать в коде с произвольными прямоугольниками на плоскости. Ищу и не нахожу.
Пять координат — ни вектор, ни матрица, ни кватернион. Вместо красивых векторно-матричных операций в коде появляются какие-то страшные синусы-косинусы, в общем низкоуровневая возня с координатами.

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

Upd
Сорри за некропостинг - недалеко в топе была, хотя прошло несколько месяцев.

 
 
 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group