Як обчислити, чи 2 лінії звернені назустріч чи в сторону?


10

З огляду на 4 бали, що описують 2 відрізки рядка, як обчислити, чи пряма А знаходиться в бік від лінії Б?

Дві лінії мають фіксовану довжину і можуть вимірюватися як відстань від x1 / y1 до x2 / y2.

введіть тут опис зображення


Чим випадок із кривою Безьє відрізняється від випадку з прямими? Чи є у вас крива, яка могла б повністю закрити іншу лінію (щоб кожен напрямок вказував "назустріч")?
bummzack

1
Можливо, вам потрібно буде уточнити свої умови. У геометрії "лінія" простягається нескінченно в будь-якому напрямку, на відміну від півлінії або відрізка, тому 2 лінії завжди перетинаються, якщо вони не паралельні. Про кого ви питаєте? Ви намалювали стрілку, яка має на увазі напрямок, який для мене передбачає відрізок або максимум піврядку. І яке ваше визначення "назустріч" і "вдалині"?
Хакворт

Кривій Безьє може бути важче представити рівність, необхідну для вирішення тесту пересічення променевої лінії. До речі, я зміню слово, яке представляє вашу стрілку, на "промінь". Ви можете отримати швидшу відповідь. Я відповім на це, якщо встигну під час обіду, якщо ніхто інший цього не зробить. Якщо ні, це надзвичайно поширене завдання в іграх. Google "Тест пересічення відрізка лінії променя". Я підозрюю, що тест кривої Безьє схожий, але я ніколи його не пробував.
Брендон

3
Ви повинні розділити своє питання надвоє. Частина з відрізками рядків дуже проста. Частина з кривими Безьє надзвичайно складна і має лише приблизне числове рішення.
sam hocevar

Я розділив своє запитання на 2, як вимагали. Друга частина тут: gamedev.stackexchange.com/questions/21463 / ...
Robinicks

Відповіді:


11

Нехай Aі Bбуде дві точки на чорній лінії. Нехай Cі Dбуде вашим синім сегментом. Знак zкоординати перехресного добутку AB^ACговорить вам, чи Cє "лівою" чи "правою" чорної лінії. Аналогічно, перехресний продукт AB^CDповідомляє вам, чи CDспрямовують "ліворуч" або "праворуч" чорної лінії.

Ми насправді не хочемо знати, це ліворуч чи праворуч; все, що ми хочемо, - це переконатися, що вони однакові або протилежні, тому ми множимо два значення.

Отже, такий псевдокод повинен працювати:

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

Боюся, мені потрібен певний час, щоб написати правильне рішення для кривої Безьє. Чи є така ситуація назустріч чи поза?

Проблема?


Щодо кривої, я вважаю, що ви могли знайти дотичну криву в точці, найближчій до вашого сегмента лінії, і використовувати це так само, як ви тестуєте інші сегменти лінії. Напевно, трохи важче, ніж це звучить :)
notlesh

@stephelton: Подивіться ще раз на другу картину кривих Безьє, вказуючи на криву, яка вигинається. Або розглянемо криву з дотичною, паралельною можливо пересічному сегменту, але яка криве до відрізка і перетинається.
Каскабель

+1 за тролліф, і хороша математика :). Однак у діаграмі "назустріч" насправді все ще є "геть" - просто перемістіть початкову точку над лінією.
Джонатан Дікінсон

@JonathanDickinson дякую, я оновив зображення, щоб було трохи зрозуміліше, що таке мій допит!
sam hocevar

2

Припустимо, що початковою точкою є зелене коло, а кінцевою - червона стрілка

Обчисліть відстань між початковою точкою, як DS, і чорним відрізком, і зробіть те ж саме для кінцевої точки (червона стрілка), як DE. Якщо DS> DE, то сегмент спрямований у бік. якщо DE> DS, він вказує. Якщо обидва рівні, два - паралелі.

Ви можете знайти , як обчислити відстань від точки до відрізка тут і квадратичної кривої Безьє тут . Однак, залежно від форми кривої Безьє, вона може повернути дивні результати (крива може перетинати себе)


DS> DE гарантовано працює лише для прямих ліній. Це може провалитися для Безьє. Крім того, ви не знаєте його визначення "назустріч". Якщо розширення стрілки переходило б лінію, визначену двома точками, але не відрізок, визначений тими самими точками, це все ще "назустріч"?
Хакворт

Я говорю про два сегменти, а не лінії, тому немає "подовження стрілки". Крім того, не важливо, де стрілка вказує, як ми говоримо про відстані тут. Найближча точка на чорній лінії може бути початковою / кінцевою точкою чорної лінії, це не має значення. Два сегменти можуть бути колінеарними, цей метод все ще працює за призначенням. Для кривих Безьє я згадував, що це дасть дивні результати залежно від форми кривої.
Равачол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.