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

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

Закрытая тема
 
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Пересечение векторов
В общем нужна помощь. Что то у меня криво получается. Надо найти точку пересечения двух прямых, параллельных векторам (vectorA\vectorB) и проходящих через точку (startA\startB). Помоги с формулой, плз
((код cpp
public static Vector2D Cross(Vector2D startA, Vector2D vectorA, Vector2D startB, Vector2D vectorB)
{
Vector2D outVector = new Vector2D();
double k1 = vectorA.y / vectorA.x;
double k2 = vectorB.y / vectorB.x;
outVector.x = (startA.y - startB.y - startA.x * k1 + startB.x * k2) / (k1 - k2);
outVector.y = (startA.x + outVector.x) * k1 - startA.y;
return outVector;
}
))
Старый 06.08.2012, 17:15
Fakov
Viva la Fa
offline
Опыт: 102,058
Активность:
я ничерта в этом не смыслю, но чисто теретически - циклом проверять координаты каждой прямой - если совпали, значит пересеклись
Старый 06.08.2012, 17:17
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Fakov, по мойму это изврат
Старый 06.08.2012, 17:20
Fakov
Viva la Fa
offline
Опыт: 102,058
Активность:
а гугл юзал??
Старый 06.08.2012, 17:30
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Fakov, очередной раз вывел сам, но блин первый раз мне не фортануло, ща второй раз попробую
alexprey добавил:
public static Vector2D Cross(Vector2D startA, Vector2D vectorA, Vector2D startB, Vector2D vectorB)
        {
            Vector2D outVector = new Vector2D();

            double a1 = startA.y;
            double a2 = startB.y;
            double b1 = vectorA.y;
            double b2 = vectorB.y;
            double c1 = startA.x;
            double c2 = startB.x;
            double d1 = vectorA.x;
            double d2 = vectorB.x;
            double k1 = b1 * d2;
            double k2 = b2 * d1;

            outVector.x = (d1 * d2 * (a2 - a1) + k1 * c1 - k2 * c2) / (k1 - k2);
            outVector.y = (b1 * (outVector.x - c1) / d1) + a1;

            return outVector;
        }
alexprey добавил:
во вроде работает
Старый 06.08.2012, 17:53
ScorpioT1000
Работаем
online
Опыт: отключен
Старый 06.08.2012, 18:05
Doc

offline
Опыт: 63,163
Активность:
private static Vec intersectionVec = new Vec(0., 0.);

private static Vec lineIntersection(Vec s1, Vec e1, Vec s2, Vec e2){
        double denom = ((e1.x - s1.x) * (e2.y - s2.y)) - ((e1.y - s1.y) * (e2.x - s2.x));
        //  AB & CD are parallel 
        if (denom == 0)
        	return null;
        double numer = ((s1.y - s2.y) * (e2.x - s2.x)) - ((s1.x - s2.x) * (e2.y - s2.y));
        double r = numer / denom;
        double numer2 = ((s1.y - s2.y) * (e1.x - s1.x)) - ((s1.x - s2.x) * (e1.y - s1.y));
        double s = numer2 / denom;
        if ((r < 0 || r > 1) || (s < 0 || s > 1))
        	return null;
        // Find intersection point
        intersectionVec.x = s1.x + (r * (e1.x - s1.x));
        intersectionVec.y = s1.y + (r * (e1.y - s1.y));
        return intersectionVec;
}
Старый 06.08.2012, 18:29
ScorpioT1000
Работаем
online
Опыт: отключен
double
if (denom == 0)
bool Maths::RealEq(real a, real b) {
    return std::fabs(a-b) < std::numeric_limits<real>::epsilon();
}

// ...

if (RealEq(denom, 0))
Старый 06.08.2012, 18:42
Doc

offline
Опыт: 63,163
Активность:
ScorpioT1000, ну float. Сравнение тоже да. Писал давно, тогда не шарил. В версии для стратегии у меня все так и сделано норм как ты написал, взял из спин делюкс.
Старый 06.08.2012, 18:46
ScorpioT1000
Работаем
online
Опыт: отключен
Просто это условие никогда не выполнится, кроме того случая, когда все переданные аргументы строго равны 0
ScorpioT1000 добавил:
Дело не в флоат, а в том что это плавающий тип)
ScorpioT1000 добавил:
Вот читайте "внимание"
Старый 06.08.2012, 18:52
Doc

offline
Опыт: 63,163
Активность:
ScorpioT1000, я знаю, что не во float, я это к тому написал, что флоат быстрее. Ну на практике линии редко когда будут абсолютно параллельны. Выполнится, если вектора одинаковые.
Старый 06.08.2012, 19:13
ScorpioT1000
Работаем
online
Опыт: отключен
ты кстати еще упарываешься в том, что вернул null вместо православного NaN
Старый 06.08.2012, 19:15
Doc

offline
Опыт: 63,163
Активность:
ScorpioT1000, какой может быть нан лолка ты, если в ретурн типе объект?
Старый 06.08.2012, 19:17
ScorpioT1000
Работаем
online
Опыт: отключен
православный вектор нанов
ScorpioT1000 добавил:
#define NaV2 Vector2(NaN,NaN) // Not a Vector2: Not a Number, Not a Number
<3
Старый 06.08.2012, 19:19
Doc

offline
Опыт: 63,163
Активность:
Фигня это и не нужно. Гораздо проще и быстрее проверить на нуль.
Старый 06.08.2012, 19:20
ScorpioT1000
Работаем
online
Опыт: отключен
часто ты все математические операции проверяешь на нуль? а они тоже возвращают нан)
Старый 06.08.2012, 19:21
Doc

offline
Опыт: 63,163
Активность:
ScorpioT1000, нет. Короче предлагаю закрыть флейм, это уже алексу решать.
Старый 06.08.2012, 19:29
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Doc, я уже вывел (пост №5), функция конечно написана криво, но находит верно.
Старый 06.08.2012, 19:31
Закрытая тема

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

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

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

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



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