Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Пересечение двух лучей по заданным углам (http://www.flasher.ru/forum/showthread.php?t=171482)

leo150 16.11.2011 22:01

Пересечение двух лучей по заданным углам
 
Подскажите пожалуйста, как найти координату точки пересечения двух лучей (даны две точки) если известны их углы наклона?

Psycho Tiger 16.11.2011 22:12

Уравнение прямой -
ax + c = y.

a - тангенс угла наклона.

Пересечение происходит когда x0=x1, y0=y1. 2 уравнение прямых, 2 неизвестных.
a1 * x + c1 = y
a2 * x + c2 = y
Где a1,a2,c1,c2 - Вам известны. Удачи!

leo150 16.11.2011 22:38

a1,a2,c1,c2 - их тоже нужно найти?

goodguy 16.11.2011 22:41

У вас условие не понятное. Что за 2 точки даны?

leo150 16.11.2011 22:45

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

Psycho Tiger 16.11.2011 23:00

Цитата:

a1,a2,c1,c2 - их тоже нужно найти?
Нет же!
Цитата:

Где a1,a2,c1,c2 - Вам известны.
Насколько я помню из курса геометрии, a1 и a2 - это тангенсы угла наклона. c1, c2 - просто числа. Скорее всего, это координата y у этих двух точек.

willis83 16.11.2011 23:02

а какое отношение данный топ имеет к ActionScripts3? Чистой воды геометрия.

iNils 16.11.2011 23:12

Цитата:

Сообщение от willis83 (Сообщение 1046516)
а какое отношение данный топ имеет к ActionScripts3? Чистой воды геометрия.

Вопрос задан в нужном месте.

Ookami 17.11.2011 00:11

Тангенс меня в формуле засмущал... полез на педивикиювикипедию освежить знания. Прямую можно описать рядом формул, основные из них:

x*cos(a) + y*sin(a)=p, где р - перпендикуляр из точки (0,0) к лучу, угол а - угол между осью Ох и прямой р

y = x*tg(a) + b, где a - угол между осью Ох и прямой, b - точка пересечения прямой и оси Ох

leo150 17.11.2011 00:41

не могли бы немного кода?
а то я с пяти часов над этим сижу, у меня уже мозг опух

Ookami 17.11.2011 00:47

прежде чем писать код, надо вывести уравнение для точки пересечения по вашему условию =) За вас это сделать?

Будет уравнение - помогу с кодом, хотя это уже элементарно.

Добавлено через 2 минуты
Начать код надо с этого, я думаю.
Код AS3:

function findPoint(point1:Point, point2:Point, angle1:Number, angle2:Number):Point
{
...
return ...
}


GBee 17.11.2011 00:59

Возможно надо представить b через искомую точку?
b1 = y0 - x0*tg(a1)
b2 = y0 - x0*tg(a2)

И тогда:


y1 - x1*tg(a1) = y0 - x0*tg(a1)
y2 - x2*tg(a2) = y0 - x0*tg(a2)

y1 - y0 = x1*tg(a1) - x0*tg(a1)
y1 - y0 = (x1 - x0)*tg(a1)
y0 = y1 - (x1 - x0) * tg(a1)

y2 - x2*tg(a2) = y1 - (x1 - x0) * tg(a1) - x0 * tg(a2)
y2 - x2*tg(a2) = y1 - x1 * tg(a1) - x0 * (tg(a1) - tg(a2))
x0 * (tg(a1) - tg(a2)) = y2 - x2*tg(a2) - y1 + x1 * tg(a1)

x0 = (y2 - y1 - x2*tg(a2) + x1*tg(a1))/(tg(a1) - tg(a2))
y0 = y1 - (x1 - x0) * tg(a1)

Вроде нигде не ошибся.

Ookami 17.11.2011 01:09

Цитата:

y = x*tg(a) + b, где a - угол между осью Ох и прямой, b - точка пересечения прямой и оси Ох
точка пересечения двух прямых:
х = (b1 - b2) / (tg(a2) - tg(a1))
y = (b1*tg(a2) - b2*tg(a1)) / (tg(a2) - tg(a1))

Но т.к. это точка пересечения двух прямых, а не лучей (помним в чем разница, да?) то надо проверить принадлженость этой точки каждому из лучей.

Добавлено через 1 минуту
А, да, перед вычислениями было бы еще неплохо проверить что а1 != а2, иначе деление на ноль возникнет (прямые/лучи параллельны)

Добавлено через 26 минут
Цитата:

Возможно надо представить b через искомую точку?
b1 = y0 - x0*tg(a1)
b2 = y0 - x0*tg(a2)
Эта точка - место пересечения прямой и оси Ох, у нее всегда у = 0

Добавлено через 45 минут
Код AS3:

package 
{
        import flash.geom.Point;
 
        /**
        * ...
        * @author Ookami
        */

        public class Ololo
        {
                public function findPoint(point1:Point, point2:Point, angle1:Number, angle2:Number):Point
                {
                        var x:Number;
                        var y:Number;
                        var k1:Number = Math.tan(toRadians(angle1));
                        var k2:Number = Math.tan(toRadians(angle2));
 
                        if (angle1 == angle2)
                        {
                                trace("Прямые параллельны");
                                return null;
                        } else {
                                x = (point1.x - point2.x) / (k2 - k1);
                                y = (point1.x * k2 - point2.x * k1) / (k2 - k1);
                                trace("Прямые пересекаются в точке [" + x + ";" + y + "]");
                                return new Point(x, y);
                        }
 
                }
 
                private function toRadians(degrees:Number):Number
                {
                        return degrees * (Math.PI / 180);
                }
        }
 
}

В данном коде нет проверки на принадлежность найденной точки заданным лучам - это Вам остается как домашнее задание )

leo150 17.11.2011 09:29

в моей задаче лучи всегда пересекаются :D
спасибо!

feelgood66 17.11.2011 11:24

еще перед поиском пересечения неплохо проверить лучи на взаимную паралельность. А то при подсчете может случится деление на ноль. Это раз. А уж если это лучи... то даже пре их непаралельности они иногда не могут пересечься. Это тоже надо как-то проверять

Ookami 17.11.2011 11:27

Цитата:

Сообщение от Ookami
...
А, да, перед вычислениями было бы еще неплохо проверить что а1 != а2, иначе деление на ноль возникнет (прямые/лучи параллельны)
...
Но т.к. это точка пересечения двух прямых, а не лучей (помним в чем разница, да?) то надо проверить принадлженость этой точки каждому из лучей.
...

Как-то так ) Писали уже об этом


Часовой пояс GMT +4, время: 23:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.