XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Печатник lvl1
Typo
offline
Опыт: 4,157
Активность:
нахождение длины перпендикуляра
Математика огого как давно была. Ничего уже не понимаю.
Нужна функция нахождения длины перпендикуляра.
Например три точки A, B, C, o. Все координаты (кроме o) известны. Нужно узнать длину отрезка oC если о лежит на отрезке AB, oC перпендикулярен AB, Аo и oB могут быть не равной длины.
Сам не пробывал. Но думал об этом. Хотел искать через 2 окружности. Зашёл в тупик. Ъз как найти точки пересечения окружностей.
итак..
real perpendicular(Xa,Ya,Xb,Yb,Xc,Yc) {
    real Xo = ?????
    real Yo = ?????
    return SquareRoot(Xc - Xo * Xc - Xo + Yc - Yo * Yc - Yo)
}
Миниатюры
Кликните на картинку для увеличения
Название:  Без имени-1.gif
Просмотров: 14
Размер:  944 байт  

Отредактировано Печатник lvl1, 15.04.2010 в 11:02.
Старый 15.04.2010, 01:08
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
строй прямоугольный треугольник АСо, по которому можно найти катет Со.
у самого математика была очень давно, завтра если найду блокнотик с формулами, то выложу способ решения
Старый 15.04.2010, 02:12
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
Тебе ведь известна точка С? если да то строишь прямоугольный треугольник и находишь длинну СВ по формуле (xC-xB)^2 + (yC - yB) ^2 и из всего этого корень(не помню как находится) патом также находишь BO и по этой же формуле находишь CO только зачем тебе это?
Хотя...В общем если тебе известны координаты O тогда делай проще (xC - xO) ^2 + (yC - yO) ^2 и корень из всего етого.
^2 это значит в квадрате=)
Старый 15.04.2010, 07:20
McKenzza
Qt
offline
Опыт: 4,054
Активность:
можно найти координаты центра АВ (если конечно АО=ОВ), координаты О((Xb+Xa)/2; (Yb+Ya)/2)
Xo=(Xb+Xa)/2
Yo=(Yb-Ya)/2
ну и собственно:
(xC - xO) ^2 + (yC - yO) ^2
OC = sqrt((Xc-Xo)(Xc-Xo)+(Yc-Yo)(Yc-Yo))

Отредактировано F1shkA, 15.04.2010 в 07:41.
Старый 15.04.2010, 07:34
krosaf4eg

offline
Опыт: 1,859
Активность:
СО=АС*sin а
где а - угол между АС и АВ
еще через уравнения прямых можно только точно не помню как
Старый 15.04.2010, 09:28
Печатник lvl1
Typo
offline
Опыт: 4,157
Активность:
Обновил первый пост.
Как находить расстояние между точками я знаю.
Нужно найти координаты oC.
krosaf4eg:
СО=АС*sin а
Как это понимать? Длину АС на синус угла между АС и АВ?
Старый 15.04.2010, 11:10
krosaf4eg

offline
Опыт: 1,859
Активность:
Как это понимать? Длину АС на синус угла между АС и АВ?
Да. зная длину, можно найти координаты о через полярки, однако сложновато получается, может кто-нибудь подскажет способ менее трудоемкий (давно эти темы были, на первом курсе :) )
Старый 15.04.2010, 11:54
McKenzza
Qt
offline
Опыт: 4,054
Активность:
хз.. можно попробовать через площадь..
...........|xa ya 1|
S(abc)=|xb yb 1|=1/2[xa(yb-yc)-xb(ya-yb)+xc(ya-yc)]
...........|xc yc 1|

потом таким же образом найти сумму (ACO) и (COB), т.е.

...........|xa ya 1|
S(aco)=|xc yc 1|=... детерминант короче посчитать тут надо (выразить)
...........|xo yo 1|

...........|xb yb 1|
S(cob)=|xc yc 1|=...
...........|xo yo 1|

затем приравнять и выразить xo и yo..
п.с.у меня чего-то не вышло..
Старый 15.04.2010, 12:10
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
А мой чем не хорош то?=)
Старый 15.04.2010, 14:28
Печатник lvl1
Typo
offline
Опыт: 4,157
Активность:
F1shkA, Воще обракадабры какието)
Windrunner, как я найду точку О ты не описал.
Старый 15.04.2010, 14:40
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
ну через площадь вполне можно:
S=(AB*CO)/2=sqr(p*(p-AB)*(p-BC)*(p-AC))
слева одна формула получения площади (половина произведния стороны на высоту, проведенную к ней), справа формула площади треугольника через полупериметр, приравнивем и получаем:
CO = (2*sqr(p*(p-AB)*(p-BC)*(p-AC)))/AB
Точку О этот способ вроде не даст, но длину высоты найдеш)
Старый 15.04.2010, 16:28
Печатник lvl1
Typo
offline
Опыт: 4,157
Активность:
JimALIEN:
CO = (2*sqr(p*(p-AB)*(p-BC)*(p-AC)))/AB
Гда взять р? (AB+BC+AC)/2?
Вместо AB например его длину подставлять?
Старый 15.04.2010, 17:00
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
ну да
Старый 15.04.2010, 17:00
Печатник lvl1
Typo
offline
Опыт: 4,157
Активность:
Спасибо буду тестить)
    real distcord (real Xa, real Ya, real Xb, real Yb) { 
        real dx = Xb - Xa
        real dy = Yb - Ya
        return SquareRoot(dx * dx + dy * dy)
    }

    real perpendicular(real Xa,real Ya,real Xb,real Yb,real Xc,real Yc) {
        real AB=distcord(Xa,Ya,Xb,Yb)
        real BC=distcord(Xb,Yb,Xc,Yc)
        real AC=distcord(Xa,Ya,Xc,Yc)
        real p=(AB+BC+AC)/2
        return (2*SquareRoot(p*(p-AB)*(p-BC)*(p-AC)))/AB
    }
Старый 15.04.2010, 17:50
McKenzza
Qt
offline
Опыт: 4,054
Активность:
F1shkA, Воще обракадабры какието)
Это матрицы :D
>_<
Старый 15.04.2010, 18:09
Печатник lvl1
Typo
offline
Опыт: 4,157
Активность:
Ну и?
Если искать этим методом выйдет меньше действий?
Старый 15.04.2010, 18:23
McKenzza
Qt
offline
Опыт: 4,054
Активность:
Печатник lvl1, думаю, что нет)) просто это уже окольными путями я пошел, т.к. другого метода не нашел.. О.о Хотя были идеи через длины.
F1shkA добавил:
    real distcord (real Xa, real Ya, real Xb, real Yb) { 
        real dx = Xb - Xa
        real dy = Yb - Ya
        return SquareRoot(dx * dx + dy * dy)
    }

    real perpendicular(real Xa,real Ya,real Xb,real Yb,real Xc,real Yc) {
        real AB=distcord(Xa,Ya,Xb,Yb)
        real BC=distcord(Xb,Yb,Xc,Yc)
        real AC=distcord(Xa,Ya,Xc,Yc)
        real p=(AB+BC+AC)/2
        return (2*SquareRoot(p*(p-AB)*(p-BC)*(p-AC)))/AB
    }
этот получился?
Старый 15.04.2010, 18:44
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
там вроде над еще модулей добавить, т.к. может получица что под корнем будет отрицательное число, т.е.:
Код:
real dx = Abs(Xb - Xa)
real dy = Abs(Yb - Ya)

аддед: фигню написал, не обращайте внимания)

Отредактировано JimALIEN, 15.04.2010 в 19:12.
Старый 15.04.2010, 18:57
silumin

offline
Опыт: 11,153
Активность:
Печатник lvl1,
(угол)САо = Atan2(Cy-Ay,Cx-Ax) - Atan2(By-Ay,Bx-Ax)
(отрезок)AC = DistanceBetweenPoints(A,C)
(отрезок)Co = AC*Sin(CAo) //<--- Нужный отрезок
(угол)ACo = 1.5708 - CAo
(угол)х = Atan2(Ay-Cy,Ax-Cx) + ACo //<--- Нужный угол (в радианах)
(угол)х1 = х*57.29582 //<--- Нужный угол (в градусах)

Точку (о) нужно будет отложить полярными координатами от точки (С), используя длинну отрезка Со и угол х1 (ну или угол х, если угол будешь считать в радианах).

При редактировании учти, что все углы в радианах!!!

Отредактировано silumin, 16.04.2010 в 03:17.
Старый 15.04.2010, 22:45
DioD

offline
Опыт: 45,134
Активность:
через полярные координаты это делается даже на гуи...
Старый 15.04.2010, 22:55
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 07:31.