Ученик
(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
- Активный участник
- Откуда: Молдова
- На форуме с 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
- Активный участник
- Откуда: Молдова
- На форуме с 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
- Активный участник
- Откуда: Молдова
- На форуме с 29 сентября 2005г.
- Сообщений: 464
- Спасибо: 1
Re: Как найти координаты вершин прямоугольника по координатам его диагонали и углу?
> Shogun
Угол то как раз и не известен, т.е. он известен относительно оси а не относительно диагонали. Так что Ваш метод не подходит. Конечно можно угол пересчитать, но это другой путь который не короче моего, описанного выше.
Конечно при одном условии, если есть возможность в AutoCAD -е (Как) узнать координату пересечения окружности и линии. Либо найти координату точки на линии.
#6 Ответ от SmeL 1 ноября 2005г. 21:21:32
- 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
- Активный участник
- Откуда: Молдова
- На форуме с 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
- Активный участник
- Откуда: Молдова
- На форуме с 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
Чтобы отправить ответ, вы должны войти или зарегистрироваться
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) на угол α и найти координаты всех вершин после поворота.
Теория
Используем аффинные матрицу поворота и матрицу переноса. Формулы для нахождения координат при повороте следующие:
Точка вокруг которой хотим повернуть изображение имеет координаты O (x0, y0) . Чтобы получить значение x и y для формул выше, необходимо их нормализовать.
Смещение D(x,y) определяет, куда хотим поместить точку вращения после поворота. В подавляющем большинстве случаев оно равно точке вращения.
Окончательный вид формул:
Интерактив
На интерактиве ниже работают только эти формулы. «Произвольная» точка вращения зазывно мигает. Дескать, можно таскать. За вершины «не-повернутого» серого прямоугольника также можно таскать, меняя тем самым исходные координаты. При изменении координат происходит масштабирование с таким расчетом, чтобы «влез» процесс поворота. Делать на всю ширь возможных орбит смысла не увидел, т.к. они могут быть астрономически большими.
Переключатель «Математическая координатная сетка» показывает родную для математиков систему координат с центром координат посередине и осью 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.X–ACenter.X) * cs – (APoint.Y–ACenter.Y) * sn + ACenter.X; Result.Y := (APoint.X–ACenter.X) * sn + (APoint.Y–ACenter.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; } |
Вращение прямоугольника вокруг произвольной точки и нахождение координат вершин производится таким незамысловатым кодом. Стоит отметить, что функции применимы к любому количеству вершин. Таким образом можно посчитать координаты любого многоугольника.
Друзья, спасибо за внимание!
Подписывайтесь на телегу.
Пишите комментарии.
Спрашивайте.
Поискать похожие темы на сайте.