2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Как представить повёрнутый прямоугольник?
Сообщение16.06.2017, 23:19 
Заслуженный участник
Аватара пользователя


02/08/11
6156
Ищу удобный способ работать в коде с произвольными прямоугольниками на плоскости. Ищу и не нахожу.

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

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

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

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение16.06.2017, 23:26 
Заслуженный участник
Аватара пользователя


06/10/08
6400
Вершина $A$, вектор $\overrightarrow{AB}$ и aspect ratio?

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение16.06.2017, 23:45 
Заслуженный участник
Аватара пользователя


02/08/11
6156
Xaositect, да, пока писал сообщение что-то похожее мне в голову пришло. Правда возникает сложность с прямоугольниками с нулевой шириной, так что лучше наверно так: вершина $A$, орт $\vec e_{AB}$ и длины сторон. Тогда всё вроде даже красиво получается: чтобы повернуть мы вертим орт, чтобы отмасштабировать мы масштабируем длины сторон, чтобы передвинуть меняем точку $A$. А матрица поворота одного прямоугольника в другой легко получается из скалярного и второго скалярного произведения ортов.

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение16.06.2017, 23:58 
Заслуженный участник
Аватара пользователя


04/09/14
4337
ФТИ им. Иоффе СПб
Я бы попробовал площадь, сторону и вектор трансляции вершины.

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 00:06 
Заслуженный участник
Аватара пользователя


01/09/13
3052
Вершина, диагональ и скалярное произведение ребра на диагональ?...
Вершина, ребро, площадь?...
Различимы ли "идентичные" прямоугольники с разной ориентацией?

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

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 00:14 
Заслуженный участник
Аватара пользователя


04/09/14
4337
ФТИ им. Иоффе СПб
Geen в сообщении #1226418 писал(а):
Вершина, ребро, площадь?
IMHO, эта комбинация предпочтительней, поскольку площадь - инвариант, а вершина и ребро - пара векторов из начала координат, для которых работает стандартный векторный пакет.

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 00:23 
Заслуженный участник
Аватара пользователя


01/09/13
3052
amon в сообщении #1226419 писал(а):
Geen в сообщении #1226418 писал(а):
Вершина, ребро, площадь?
IMHO, эта комбинация предпочтительней, поскольку площадь - инвариант, а вершина и ребро - пара векторов из начала координат, для которых работает стандартный векторный пакет.

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

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 00:36 
Заслуженный участник


27/04/09
28128
Плюсую вариант «вершина, направленная сторона, ориентированная площадь». Последняя тоже вектор, кстати (бивектор): $\mathbf a\wedge\mathbf b$. Можно, кроме того, определить какую-нибудь билинейную функцию от вектора и бивектора, позволяющую, например, получить вектор второй стороны по вектору первой и данной площади.

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


16/02/13
3835
Владивосток
Ээээ... Вопрос «как представить» без предварительного «как работать», как по мне, вообще смысла особого не имеет, не?

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение17.06.2017, 09:32 
Заслуженный участник
Аватара пользователя


02/08/11
6156
Спасибо, варианты в самом деле интересные. Если ни один не подойдёт, тогда уже можно будет отталкиваться от этого.

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


31/10/08
1244
Не нравится синусы и косинусы?
Учить ООП, принцип сокрытия.

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

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


27/04/09
28128

(Оффтоп)

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


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

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

 Профиль  
                  
 
 Re: Как представить повёрнутый прямоугольник?
Сообщение26.09.2017, 16:55 
Экс-модератор
Аватара пользователя


23/12/05
11610
warlock66613 в сообщении #1226398 писал(а):
Ищу удобный способ работать в коде с произвольными прямоугольниками на плоскости. Ищу и не нахожу.
Пять координат — ни вектор, ни матрица, ни кватернион. Вместо красивых векторно-матричных операций в коде появляются какие-то страшные синусы-косинусы, в общем низкоуровневая возня с координатами.

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group