Задать вопрос
@i_v

Как увеличить высоту повернутого прямоугольника математически (быстрый алгоритм)?

В 2D системе координат существуют 4 точки, определяющие координаты повернутого на неизвестный угол прямоугольника. Необходимо увеличить высоту этого прямоугольника на некий коэффициент scale и получить новые координаты вершин. Посоветуйте пожалуйста как это сделать и сделать, желательно, быстро (с минимумом тригонометрических функций).

A,B,C,D даны - требуется найти A1, B1, C1, D1
e1f4865a6efd435dbef7eecf0210e7f9.png
  • Вопрос задан
  • 617 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
MAD = ((x1 + x4)/2, (y1 + y4)/2)
A' = MAD + (A - MAD) * scale
B' = MAD + (B - MAD) * scale
Ответ написан
Комментировать
DmitryITWorksMakarov
@DmitryITWorksMakarov
При рисовании повернутых фигур можно применять афинные преобразования. Компьютер умеет это делать быстро.

Например, при рисовании прямоугольника рисуем его неповернутым (стороны паралельны краям экрана), задаем матрицу преобразования (которая определяет смещение, поворот, масштабирование по X и по Y) и вот мы уже имеем нужный нам прямоугольник в нужном месте под нужным углом.

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

Либо можно соответствующим образом модифицировать матрицу преобразования. Матрица преобразования определяет в том числе и растяжение/сжати по осям.

В .NET в GDI+ есть готовые возможности для работы с афинными преобразованиями:
Матричное представление преобразований
Использование преобразований в управляемом GDI+

P.S.:
Если ваша задача - это лабораторная из цикла: сделал и забыл, то все это городить не имеет смысла.
Но в больших проектах, где много графических элементов повернутых друг относительно друга иерархически связанных, лучше освоить математику афинных преобразований и перестроить в соответствии с ними архитектуру. Проще жить будет.
Ответ написан
1) находим середину отрезка AD - среднее арифметическое по x и по y
2) для простоты будем считать середину отрезка началом координат
3) находим k, которое из уравнения прямой y = kx: k = y1/x1
4) решаем систему:
- у = kx
- sqrt(x^2 + y^2) / sqrt(x_1^2 + y_1^2) = scale
Ответ написан
Комментировать
BuriK666
@BuriK666
Компьютерный псих
Комментировать
@idap
интересуюсь python, latex, linux, ML, AI
Можно воспользоваться формулой деления отрезка в данном отношении (первая попавшаяся ссылка). Как предложил Станислав Макаров, сначала находим серидину AD, обозначим её через M. Далее, рассматриваем отрезки MA и MD (порядок точек важен), и применяем формулу деления отрезка в отношении lambda < 0 (некоторое отрицательное число, аналог вашего scale). Аналогичную процедуру делаем с BC.

UPD. Точка M, кстати, тоже получается по формуле деления отрезка AD в данном отношении при lambda=1.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы