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



Ученик

(94),
закрыт



8 лет назад

Globe

Просветленный

(24815)


8 лет назад

Получаете координаты трех вершин: (x1, y1) (x2, y2) (x3, y3)
Выясняете, какой угол – прямой:

(x2-x1)*(x3-x1)+(y2-y1)*(y3-y1) = 0, значит, прямой угол – при вершине (x1, y1)
тогда координаты четвертой вершины равны:
x = x1 + (x2-x1) + (x3-x1)
y = y1 + (y2-y1) + (y3-y1)

(x1-x2)*(x3-x2)+(y1-y2)*(y3-y2) = 0, значит, прямой угол – при вершине (x2, y2)
тогда координаты четвертой вершины равны:
x = x2 + (x1-x2) + (x3-x2)
y = y2 + (y1-y2) + (y3-y2)

(x1-x3)*(x2-x3)+(y1-y3)*(y2-y3) = 0, значит, прямой угол – при вершине (x3, y3)
тогда координаты четвертой вершины равны:
x = x3 + (x1-x3) + (x2-x3)
y = y3 + (y1-y3) + (y2-y3)

????
PROFIT!

Великий ЗомбиниУченик (94)

8 лет назад

“Выясняете, какой угол – прямой: “
Вот честно даже читать дальше не стала.. . я же написала ПРЯМОУГОЛьник

Великий ЗомбиниУченик (94)

8 лет назад

вот знаешь.. . это все хоть и работает, а я всеравно не знаю откуда ты все это взял. но я разберусь. спасибо)

Максим (Некромант)

Просветленный

(28838)


8 лет назад

это же элементарно

просишь в вести координаты вершины (их всего три)

это значит по два числа на вершину (Х и У) – создаешь при этом масив двух мерный

и загоняешь туда последовательно 3 отданых числа х и у

далее создаем некую логику

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

проверяем что бы х1 не равнялся x3 (тоесть проверяем что бы х первого числа не ровнялся х терьего числа ) – если не ровняется тогда х ровняется первому введеному чеслу х – а у третьему введенному числу Y – далее если все же Х третьего числа равняется Х первого числа тогда Х ровняется второго введенного числа Х а У третьего !

вот и вся логика

Великий ЗомбиниУченик (94)

8 лет назад

Что-то не сходится.

Если нам вводят координаты

1; 1
1; 3
3; 3

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

Сергей Марков

Мудрец

(10063)


8 лет назад

Добрый день.
Немного теории.

Исходя из свойств прямоугольника в общем виде координаты вершин (обозначим их А, B, C, D) можно представить в таком виде:

A(x, y); B(x+a,y)

C(x. y+b); D(x+a, y+b)

Можно видеть, что множество значений x имеет значения {x, x+a, x, x+a}, и множество значений y имеет значения {y, y, y+b, y+b}

Теперь представим, что мы получаем в произвольном порядке значения координат трех вершин, и если они принадлежат прямоугольнику, то они будут принадлежать указанным выше множествам и подчиняться их свойствам. Другими словами, из трех значений x – два значения обязательно будут равны, то же самое со значениями y.

Теперь дело техники.

Немного практики.

На Паскале это можно реализовать, например так:

Исходные значения координат я задал в программе, Вы же можете использовать команду ввода с клавиатуры, но тогда необходимо задать проверку координат на принадлежность их прямоугольнику.

Успехов.

Великий ЗомбиниУченик (94)

8 лет назад

“из трех значений x – два значения обязательно будут равны, то же самое со значениями y.”
Вот здесь вы наверно ошибаетесь. Если прямоугольник будет наклонен? Что-то типа этого)

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

#1 1 ноября 2005г. 12:36:43

  • SmeL
  • SmeL
  • Активный участник
  • Откуда: Молдова
  • На форуме с 29 сентября 2005г.
  • Сообщений: 464
  • Спасибо: 1

Тема: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

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

#2 Ответ от JS 1 ноября 2005г. 18:28:16

  • JS
  • Восстановленный участник
  • На форуме с 8 сентября 2005г.
  • Сообщений: 70
  • Спасибо: 0

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

Sub aa()
Dim pACD As AcadDocument
Dim pRect As New TRectangle
Dim pAngle As Double
Dim pT1, pT2
    Set pACD = ThisDrawing
    pAngle = Pi * 30 / 180
    PrintMessage vbCrLf & "Пусть будет угол " & 30 & " градусов."
    PrintMessage vbCrLf & "Первая точка "
    pT1 = pACD.Utility.GetPoint
    PrintMessage vbCrLf & "Вторая точка "
    pT2 = pACD.Utility.GetPoint(pT1)
    pRect.InitTTA pT1, pT2, pAngle
    pRect.CreateLWPolyLine pACD.ModelSpace
End Sub

Класс TRectangle

'Class TRectangle
Option Explicit
Private mTS(1) As Double, mTE(1) As Double
Private mT(3, 1) As Double
Private Angle As Double, hw As Double, L As Double
Private mTmin(1) As Double, mTmax(1) As Double
Public Sub InitSEW(Tstart, Tend, Width As Double)
Dim pT As Variant
    mTS(0) = Tstart(0): mTS(1) = Tstart(1)
    mTE(0) = Tend(0): mTE(1) = Tend(1)
    Angle = AngleFromXAxis(mTS, mTE)
    hw = Width / 2
    pT = PolarPoint(mTS, Angle - Pi_2, hw)
    mT(0, 0) = pT(0): mT(0, 1) = pT(1)
    pT = PolarPoint(mTE, Angle - Pi_2, hw)
    mT(1, 0) = pT(0): mT(1, 1) = pT(1)
    pT = PolarPoint(mTE, Angle + Pi_2, hw)
    mT(2, 0) = pT(0): mT(2, 1) = pT(1)
    pT = PolarPoint(mTS, Angle + Pi_2, hw)
    mT(3, 0) = pT(0): mT(3, 1) = pT(1)
    SearchMinMaxMultyCol mT, 0, mTmin(0), mTmax(0)
    SearchMinMaxMultyCol mT, 1, mTmin(1), mTmax(1)
End Sub
Public Sub InitTTA(TLeftBottom, TRightTop, Angle As Double)
Dim pT(1) As Double, L As Double, m As Double, d As Double
Dim t1(1) As Double, t2(1) As Double, t3(1) As Double, t4(1) As Double
    PolarPoint TLeftBottom, Angle, 100, pT
    L = pT(0) - TLeftBottom(0): m = pT(1) - TLeftBottom(1)
    d = -(m * (TRightTop(0) - TLeftBottom(0)) _
        - L * (TRightTop(1) - TLeftBottom(1))) _
        / Sqr(L * L + m * m)
    If d < 0 Then
        PolarPoint TLeftBottom, Angle + Pi_2, d, t1
        t4(0) = TLeftBottom(0): t4(1) = TLeftBottom(1)
        PolarPoint TRightTop, Angle - Pi_2, d, t3
        t2(0) = TRightTop(0): t2(1) = TRightTop(1)
    Else
        PolarPoint TLeftBottom, Angle + Pi_2, d, t4
        t1(0) = TLeftBottom(0): t1(1) = TLeftBottom(1)
        PolarPoint TRightTop, Angle - Pi_2, d, t2
        t3(0) = TRightTop(0): t3(1) = TRightTop(1)
    End If
    mT(0, 0) = t1(0): mT(0, 1) = t1(1)
    mT(1, 0) = t2(0): mT(1, 1) = t2(1)
    mT(2, 0) = t3(0): mT(2, 1) = t3(1)
    mT(3, 0) = t4(0): mT(3, 1) = t4(1)
    mTS(0) = (t1(0) + t4(0)) / 2: mTS(1) = (t1(1) + t4(1)) / 2
    mTE(0) = (t2(0) + t3(0)) / 2: mTE(1) = (t2(1) + t3(1)) / 2
    SearchMinMaxMultyCol mT, 0, mTmin(0), mTmax(0)
    SearchMinMaxMultyCol mT, 1, mTmin(1), mTmax(1)
    hw = Distance(t2, t3) / 2
    L = Distance(t1, t2)
End Sub
Public Sub GetBoundingBox(TMin, TMax, Optional DX, Optional DY)
    TMin = mTmin: TMax = mTmax
    If Not IsMissing(DX) Then DX = mTmax(0) - mTmin(0)
    If Not IsMissing(DY) Then DY = mTmax(1) - mTmin(1)
End Sub
Public Function CreateLWPolyLine(acBlock As AcadBlock, Optional CenterLine As Boolean = False) As AcadLWPolyline
Dim pLWP As AcadLWPolyline
Dim pVrtx() As Double
Dim W As Double
    If CenterLine Then
        ReDim pVrtx(0 To 3)
        pVrtx(0) = mTS(0): pVrtx(1) = mTS(1): pVrtx(2) = mTE(0): pVrtx(3) = mTE(1)
        Set pLWP = acBlock.AddLightWeightPolyline(pVrtx)
        W = 2 * hw
        pLWP.SetWidth 0, W, W
    Else
        ReDim pVrtx(0 To 7)
        pVrtx(0) = mT(0, 0): pVrtx(1) = mT(0, 1): pVrtx(2) = mT(1, 0): pVrtx(3) = mT(1, 1)
        pVrtx(4) = mT(2, 0): pVrtx(5) = mT(2, 1): pVrtx(6) = mT(3, 0): pVrtx(7) = mT(3, 1)
        Set pLWP = acBlock.AddLightWeightPolyline(pVrtx)
        pLWP.Closed = True
    End If
    Set CreateLWPolyLine = pLWP
End Function
Public Property Get startPoint() As Variant
    startPoint = mTS
End Property
'Public Property Let StartPoint(ByVal vNewValue As Variant)
'End Property
Public Property Get endPoint() As Variant
    endPoint = mTE
End Property
'Public Property Let EndPoint(ByVal vNewValue As Variant)
'End Property
Public Function BorderPoint(Index As Long) As Variant
    BorderPoint = Array(mT(Index, 0), mT(Index, 1))
End Function
Public Property Get HalfWidth() As Double
    HalfWidth = hw
End Property
'Public Property Let HalfWidth(ByVal vNewValue As Variant)
'End Property

Используемые процедуры:

Public Const Pi = 3.14159265358979
Public Const Pi2 = 6.28318530717959
Public Const Pi_2 = 1.5707963267949
Public Const Pi_3 = 4.71238898038469
Public Const Pi_4 = 0.785398163397448
Public Const Sin_Pi_4 = 0.707106781186548
Public Const Tan_Pi_8 = 0.414213562373095
Public Sub SearchMinMaxMultyCol(ByRef ArrayOfNumbers, ncol As Long, _
            ByRef MinVal, ByRef MaxVal)
Dim i As Long, n1 As Long, n2 As Long
    n1 = LBound(ArrayOfNumbers, 1): n2 = UBound(ArrayOfNumbers, 1)
    MinVal = ArrayOfNumbers(n1, ncol): MaxVal = ArrayOfNumbers(n2, ncol)
    For i = n1 + 1 To n2
        If MinVal > ArrayOfNumbers(i, ncol) Then MinVal = ArrayOfNumbers(i, ncol)
        If MaxVal < ArrayOfNumbers(i, ncol) Then MaxVal = ArrayOfNumbers(i, ncol)
    Next i
End Sub
Public Function PolarPoint(ByVal t0 As Variant, ByVal ang As Double, _
            ByVal Dist As Double, Optional Result) As Variant
Dim pVal(2) As Double
    pVal(0) = t0(0) + Cos(ang) * Dist
    pVal(1) = t0(1) + Sin(ang) * Dist
    pVal(2) = 0
    PolarPoint = pVal
    If Not IsMissing(Result) Then
        Result(0) = pVal(0)
        Result(1) = pVal(1)
    End If
End Function
Public Function AngleFromXAxis(t0 As Variant, t1 As Variant)
Dim x As Double, y As Double
    x = t1(0) - t0(0): y = t1(1) - t0(1)
    If x >= Abs(y) Then
        AngleFromXAxis = Atn(y / x)
    ElseIf -x >= Abs(y) Then
        AngleFromXAxis = Pi + Atn(y / x)
    ElseIf y >= Abs(x) Then
        AngleFromXAxis = Pi_2 + Atn(-x / y)
    Else
        AngleFromXAxis = Pi_3 + Atn(-x / y)
    End If
End Function

Класс TRectangle можно инициализировать двумя способами: так как ты спрашиваешь – две диагональные точки и угол, или – две противоположные точки и ширина. После этого построить прямоугольник. Построить можно либо контур, либо полилинию с ненулевой шириной сегмента.

#3 Ответ от SmeL 1 ноября 2005г. 19:00:30

  • SmeL
  • SmeL
  • Активный участник
  • Откуда: Молдова
  • На форуме с 29 сентября 2005г.
  • Сообщений: 464
  • Спасибо: 1

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

Спасибо, в данном вводятся те данные которыми я не обладаю. Я придумал другой ввод прямоугольника. Я не ввожу угол вообще т.к. у меня прямоугольник т.е. 90. Исходные данные диагональ, и угол который нужен для того чтоб показать, что на нем именно лежит одна из сторон.
А вот как построить прямоугольник. диагональ это диаметр окружности, угол это косательная, ее пересечение с окружностью и соединение с другой стороной диаметра и дает угол 90градусов, а для того чтоб найти вторую вершину есть еще несколько вариантов. Осталось настрочить 🙂 вот не знаю как узнать координату пересечения. окружности с косательной.
р.s. колизия насчет того, что все равно 90градусов не получится т.к. окружность это набор прямых. не особо важна.

#4 Ответ от Shogun 1 ноября 2005г. 20:03:14

  • Shogun
  • Восстановленный участник
  • На форуме с 19 августа 2005г.
  • Сообщений: 10
  • Спасибо: 0

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

> SmeL
В Cad 2006 команда rectangle уже делает всё что нужно.
Ну а если не устраивает,
то Пифагор Вам поможет: угол известен, гипотенуза тоже.

#5 Ответ от SmeL 1 ноября 2005г. 21:13:12

  • SmeL
  • SmeL
  • Активный участник
  • Откуда: Молдова
  • На форуме с 29 сентября 2005г.
  • Сообщений: 464
  • Спасибо: 1

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

> Shogun
Угол то как раз и не известен, т.е. он известен относительно оси а не относительно диагонали. Так что Ваш метод не подходит. Конечно можно угол пересчитать, но это другой путь который не короче моего, описанного выше.
Конечно при одном условии, если есть возможность в AutoCAD -е (Как) узнать координату пересечения окружности и линии. Либо найти координату точки на линии.

#6 Ответ от SmeL 1 ноября 2005г. 21:21:32

  • SmeL
  • SmeL
  • Активный участник
  • Откуда: Молдова
  • На форуме с 29 сентября 2005г.
  • Сообщений: 464
  • Спасибо: 1

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

#7 Ответ от Shogun 2 ноября 2005г. 12:35:30

  • Shogun
  • Восстановленный участник
  • На форуме с 19 августа 2005г.
  • Сообщений: 10
  • Спасибо: 0

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

> SmeL
По моему легче чем построение прямоугольника (при условии что дана диагональ) через правильный треугольник ещё никто не придумал.
Как бы там не было, для построения прямоугольника нужны как минимум две велечины:
диагональ и угол или диагональ и одна из сторон.
Вы же пишете “Я не ввожу угол вообще т.к. у меня прямоугольник т.е. 90” и тут же “Исходные данные диагональ, и угол который нужен для того чтоб показать, что на нем именно лежит одна из сторон.”
И ещё, касательная не может пересекать окружность, на то она и касательная. И если касательная проходит через одну из конечных точек диагонали, тогда она перпендикулярна этой диагонале.
Надеюсь я Вас ничем не обидел. Просто не совсем понятно какие данные Вы собираетесь вводить для построения фигуры. Ваши действия по пунктам, если можно.
P.S. Вариант JS-а очень неплох.

#8 Ответ от SmeL 2 ноября 2005г. 13:14:50

  • SmeL
  • SmeL
  • Активный участник
  • Откуда: Молдова
  • На форуме с 29 сентября 2005г.
  • Сообщений: 464
  • Спасибо: 1

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

> Shogun
Все делаю маусом!
1. два клика (запоминаем координаты) они являются противоположными вершинами нашего прямоуголиника.
2. на основе второй координаты делаем вот что
retAngle = ThisDrawing.Utility.GetAngle(Pnt2).
все все данные для построения прямоугольника введены.
___________
Теперь начинается геометрия.
данные действия проделывает уже VBA
1. На основе двух координат (введенных выше) чертим окружность, таким образом чтоб они образовали диаметр.
2. На основе угла ведем прямую от Pnt2, которая пересекет нашу окружность. (Ваша заметка, что касательная не пересекает окружность принимается но точка соприкосновения существует 😉 я так написал чтоб проще было объяснить)
3. Узнаем координату пересечения окружности и построенной прямой. Теперь у нас есть три вершины, которые образуют прямоугольный трейгольник!
4. Для того как найти четвертую вершину есть несколько вариантов.
___________
Вот весь алгоритм 😉
Вариант JS не плох но у меня другие данные вводятся.

#9 Ответ от Shogun 2 ноября 2005г. 17:33:10

  • Shogun
  • Восстановленный участник
  • На форуме с 19 августа 2005г.
  • Сообщений: 10
  • Спасибо: 0

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

> SmeL
По пунктам:
1. Вы фиксируете положение прямоугольника “двумя кликами”, т.е вращять прямоугольник после этого не собираетесь.
Верно?
2. Получили угол, без вопросов.
Геометрия:
1. Без вопросов.
2. Прямые, также как полилинии, лучи и Х-линии строятся по точкам, а не по углу. Но не в этом суть, применим PolarPoint(Point, Angle, Distance) и найдем Pnt3 нужную для построения прямой, а ещё лучше луча который должен будет пересечь окружность. Только вот никакого пересечения может и не быть!
Для наглядности округлимся до 1-ого градуса.
Так вот:
1. Если угол между диагональю и лучом в пределах 1-89 градусов, то пересечение состоится.
2. При угле в 0 или 90, Ваша диагональ становится одной из сторон.
3. Угл свыше 90 делает пересечение невозможным.

> SmeL
Не помню себя в 7-ом классе, но даже визуально (логически) формула подходит для определения точек из центра окружности, а не из точки касательной.

#10 Ответ от SmeL 2 ноября 2005г. 18:39:22

  • SmeL
  • SmeL
  • Активный участник
  • Откуда: Молдова
  • На форуме с 29 сентября 2005г.
  • Сообщений: 464
  • Спасибо: 1

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

Shogun пишет:

Вы фиксируете положение прямоугольника “двумя кликами”, т.е вращять прямоугольник после этого не собираетесь.

Нет, но было бы не плохо до 3 клика перересовывать прямоугольник, т.е пока двигается маус меняются длины сторон, но это пока только в мечтах.
Крнечно стоящее описание колизии на счет угла равному 0 or 90, но не сомневайтесь я это учел бы и так.

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

Пока только такие формулы, т.е. я думаю пересчитать данные таким образом, чтоб привести задачу к данному виду 🙂 Может кто то имеет формулы по лучше не стесняйтесь поделитесь.

#11 Ответ от Boxa 2 ноября 2005г. 23:32:04

  • Boxa
  • Восстановленный участник
  • На форуме с 16 августа 2005г.
  • Сообщений: 60
  • Спасибо: 0

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

Я может и не оригинален но, по-моему, надо открыть любой вузовский учебник математики и посмотреть раздел “Аналитическая геометрия” и по формулам все решать, без всяких построений
1 По имеющемуся углу и точке находите уравнение одной из сторон
в общем виде выглядит это уравнение так
У=КнХ+Ув
где Кн=tg(угла),
       Ув-координата У той точки от которой откладывался угол(здесь от точки В)
2 По имеющемуся уравнению и точке(А) нахожу уравнение прямой перпендикулярной заданной и проходящей через заданную точку
в общем виде это уравнение выглядит так
У-Уа=(-1/Кн)*(Х-Ха)
3 имея 2 уравнения  решаю их через систему и получаю точку пересечения сторон прямоугольника, т.е. получаю 3 вершину.
4 нахожу уравнение прямой проходящей через точку В и параллельной найденной в п.3
У-Ув=(-1/Кн)*(Х-Хв)
5 нахожу уравнение прямой параллельной найденной в п.2 и проходящей  через точку А
У-Уа=Кн(Х-Ха)
6 Решая систему из уравнений пунктов 5 и 6 получаю координаты еще одной вершины
вот собственно и все. Опускаю все выкладки и причесывания. Привел только теорию.
Все преобразования в уравнениях на уровне 5 класса

#12 Ответ от Boxa 2 ноября 2005г. 23:37:45

  • Boxa
  • Восстановленный участник
  • На форуме с 16 августа 2005г.
  • Сообщений: 60
  • Спасибо: 0

Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?

ИзвИзвиняюсь в пунктах 4 и 5 забыл поправить ссылки, там соответственно
4 – найденной в п.2
5 – найденной в п.1
и забыл вставить условие задачки
ДАно: А(Ха,Уа); В(Хв,Ув); Угол

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Illustration

If $gamma = 0$, vector $vec{u} = ( w, 0 )$ and vector $vec{v} = ( 0, b )$.

Rotating a 2D vector $(x , y)$ counterclockwise yields
$$begin{cases} x^, = x cosgamma – y singamma \ y^, = x singamma + y cosgamma end{cases} tag{1}label{na1}$$
therefore
$$vec{u} = ( w cosgamma ,, w singamma ) tag{2}label{na2}$$
and
$$vec{v} = ( -b singamma ,, b cosgamma ) tag{3}label{na3}$$

If we know $gamma$, $w$, $b$, and $vec{z_c}$, then the four vertices of the rotated rectangle are
$$begin{cases}
vec{z_1} = vec{z_c} – vec{u} + vec{v} \
vec{z_2} = vec{z_c} + vec{u} + vec{v} \
vec{z_3} = vec{z_c} + vec{u} – vec{v} \
vec{z_4} = vec{z_c} – vec{u} – vec{v} end{cases} tag{4}label{na4}$$
or equivalently,
$$begin{cases}
x_1 = x_c – w cosgamma – b singamma \
x_2 = x_c + w cosgamma – b singamma \
x_3 = x_c + w cosgamma + b singamma \
x_4 = x_c – w cosgamma + b singamma end{cases}, qquad begin{cases}
y_1 = y_c – w singamma + b cosgamma \
y_2 = y_c + w singamma + b cosgamma \
y_3 = y_c + w singamma – b cosgamma \
y_4 = y_c – w singamma – b cosgamma end{cases} tag{5}label{na5}$$

Так, как я понял задачу. Есть обычная декартова система координат, прямоугольник, стороны a и b, одна его точка, и он повернут относительно этой точки на угол.

Вопрос в том, как он располагался ранее, что за длины a и b.

  A3
  -------a------<- A2
  |            |
  b            |
  |            |
  --------------
  ^            ^
  A0           A1

Если представить картину таким образом, то все предельно просто. A0, естественно, остается на месте.

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

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

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

Если это то, что нужно вам. Но в общем случае прямоугольник-то уже мог быть изначально ориентирован как угодно. Вам нужно четко ставить задачу – даже для самого себя, а иначе получается “мне надо что-то посчитать!” – “ну возьмите какие-нибудь формулы…”

Есть прямоугольник, чьи вершины заданы левой верхней точкой (x1, y1) и правой нижней (x2, y2). Необходимо произвести вращение прямоугольника вокруг произвольной точки (x0, y0) на угол α и найти координаты всех вершин после поворота.

Теория

Используем аффинные матрицу поворота и матрицу переноса. Формулы для нахождения координат при повороте следующие:

Latex formula

Latex formula

Точка вокруг которой хотим повернуть изображение имеет координаты O (x0, y0) . Чтобы получить значение x и y для формул выше, необходимо их нормализовать.

Latex formula

Latex formula

Смещение D(x,y) определяет, куда хотим поместить точку вращения после поворота. В подавляющем большинстве случаев оно равно точке вращения.

Окончательный вид формул:

Latex formula

Latex formula

Интерактив

На интерактиве ниже работают только эти формулы. «Произвольная» точка вращения зазывно мигает. Дескать, можно таскать. За вершины «не-повернутого» серого прямоугольника также можно таскать, меняя тем самым исходные координаты. При изменении координат происходит масштабирование с таким расчетом, чтобы «влез» процесс поворота. Делать на всю ширь возможных орбит смысла не увидел, т.к. они могут быть астрономически большими.

Переключатель «Математическая координатная сетка» показывает родную для математиков систему координат с центром координат посередине и осью Y, направленной вверх. Если режим выключен, демонстрируется координатная сетка, привычная для программистов — начало координат в левом верхнем углу и ось Y направлена вниз.

Переключатель «Анимация» включает плавное изменение угла с целью медитативного эффекта познания сущего.


Вращать вокруг центра прямоугольника

Все координаты находятся в отрицательном секторе!
При отключенном режиме математической сетки данные могут быть не видны!


Чтобы их увидеть включите режим математической сетки и сдвиньте точку вращения в положительный сектор, который находится в правом верхнем квадранте.

Get a better browser, bro…

Математическая координатная сетка

Немного кода

Delphi

//   Посчитать координаты точки повернутой на Angle радиан

function CalcAnglePoint(const ACenter, APoint: TPointF;

const Angle: Single): TPointF;

var

  sn,cs: single;

begin

  SinCos(Angle, sn, cs);

  Result.X := (APoint.XACenter.X) * cs

    (APoint.YACenter.Y) * sn + ACenter.X;

  Result.Y := (APoint.XACenter.X) * sn +

    (APoint.YACenter.Y) * cs + ACenter.Y;

end;

JavaScript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

    // расчет координат вершин по углу и центру вращения

    // angle – угол в радианах

    // center – точка, вокруг которой происходит вращение

    // points – массив с координатами вершин прямоугольника

    // vpoints – массив с повернутыми координатами вершин

    // массивы points и vpoints должны быть одной размерности

ssin = Math.sin(angle);

scos = Math.cos(angle);

for (let i = 0; i < points.length; i++) {

vpoints[i].x = center.x + (points[i].x center.x) * scos

                (points[i].y center.y) * ssin;

vpoints[i].y = center.y + (points[i].x center.x) * ssin +

                (points[i].y center.y) * scos;

}

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


Друзья, спасибо за внимание!

Подписывайтесь на телегу.

Пишите комментарии.

Спрашивайте.

Поискать похожие темы на сайте.

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