Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Пересечение треугольников

Автор: feniks25 16.01.2008 20:21

Здравствуйте, есть у кого функция для определения пересечения двух треугольников. Результат булевый да\нет? можно и чисто математическое решение, но функцией будет лучше.


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Client 16.01.2008 21:39

Сначала определяешь, пересекаются ли хоть какие-то стороны стороны, определяешь координаты этой точки, и проверяешь ее на принадлежность к одному из треугольников.

Автор: feniks25 16.01.2008 22:06

Цитата(Client @ 16.01.2008 16:39) *

Сначала определяешь, пересекаются ли хоть какие-то стороны стороны


Но у меня ни одна сторона не пересекается, а треугольники да.
есть просто функция типа function trianglecheck(p1,p2,p3,p4,p5,p6):boolean;
p1=x,y,z

Автор: volvo 16.01.2008 22:09

Цитата
есть у кого функция для определения пересечения двух треугольников

Тебе сюда: http://algolist.manual.ru/maths/geom/intersect/tritri3d.php

Автор: feniks25 16.01.2008 22:39

Цитата(volvo @ 16.01.2008 17:09) *

Тебе сюда: http://algolist.manual.ru/maths/geom/intersect/tritri3d.php


Благодарю, конечно, там много полезной информации, тока я ничего не понял.
Читаю как какие-то иероглифы.

int tri_tri_intersect(float V0[3],float V1[3],float V2[3],
* float U0[3],float U1[3],float U2[3])
это то?

Автор: volvo 16.01.2008 23:26

Угу... То самое... В начале (в комментариях же написано:

Цитата
* int tri_tri_intersect(float V0[3],float V1[3],float V2[3],
* float U0[3],float U1[3],float U2[3])
*
* parameters: vertices of triangle 1: V0,V1,V2
* vertices of triangle 2: U0,U1,U2
* result : returns 1 if the triangles intersect, otherwise 0
)

Автор: feniks25 17.01.2008 0:07

Цитата(volvo @ 16.01.2008 18:26) *

Угу... То самое... В начале (в комментариях же написано:)


Ну не знаааю я Си.
float V0[3] это типа вершина с тремя координатами в виде массива?

Для Delphi ничего нет? wink.gif


Автор: volvo 17.01.2008 4:45

Цитата
Для Delphi ничего нет?
Есть же программа готовая - неужели так сложно переконвертировать ее в Дельфи? Я где-то на форуме (в разделе ОС и ПО, кажется) давал ссылку на конвертер, да там и вручную - дел на полчаса максимум: все макросы сделать процедурами (а лучше - функциями) и все...

Update:
Вот набросок, вроде бы нигде не ошибся - тестируй...




Прикрепленные файлы
Прикрепленный файл  __tri_tri.pas ( 8.11 килобайт ) Кол-во скачиваний: 249

Автор: feniks25 18.01.2008 0:49

volvo, класс, работает!!! good.gif Огромнейшее спасибо!
И код довольно быстрый.
turion64-100 000 итераций за 50 мс

только стало интересно как работает такое описание типа через case:


type
TMyPoint = record
case boolean of
false: (X, Y, Z: double);
true: (arr: array[0 .. 2] of double);
end;




Прикрепленные файлы
Прикрепленный файл  triangle_check.rar ( 12.12 килобайт ) Кол-во скачиваний: 181

Автор: volvo 18.01.2008 1:09

Цитата
как работает такое описание типа через case
Обычная http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr4.shtml#15 с вариантной частью: одновременно можешь обращаться к координатам точки как через поля X, Y, Z, так и через элементы массива arr[i], фактически поля, описанные в разных метках селектора (false и true) находятся в одном месте памяти. На X "накладывается" arr[0], на Y - накладывается arr[1], и на Z - arr[2].

Я очень часто такое использую, если мне надо в разных местах обращаться по-разному к полям записи. Где-то удобнее работать с именованными полями, где-то с массивом значений. Это - универсальный способ...

Автор: feniks25 18.01.2008 1:46

Цитата(volvo @ 17.01.2008 20:09) *

Обычная http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr4.shtml#15 с вариантной частью:

понял, ещё интересней