Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Геометрические объекты. (http://forum.oszone.net/showthread.php?t=30049)

Vlad Drakula 04-01-2004 21:47 207000

вопрос в следующем:

как наыти точку пересечения геометрического объекта(примитива) и луча?

примитивы:
плоскость
сфера
цилинтр
конус
паралелепипед
полигон

и как это будет выглядеть в коде.
или хотябы с математической форме?

shurikan 05-01-2004 01:35 207001

Vlad Drakula
Это задача из курса аналитической геометрии. Луч (т.е. прямая) описывается парой уравнений плоскостей:
ax+by+cz=d,
Ax+By+Cz=D.
Это два уравнения из трех. Твой примитив д.б. описан в виде уравнения:
F(x,y,z)=E.
Вот тебе третье уравнение. Решаешь их совместно, получаешь общие точки.
:)

Vlad Drakula 06-01-2004 19:41 207002

это понятно, это самое простое.

Если кому интересно то вот реализация:

int Plane::Intersect( Ray& ray, double& t)
{
 double vd = n&ray.Dir;

 if(vd > -EPS && vd < EPS)
   return 0;

 t = - (( n&ray.Org ) + D )/vd;

 return t > GeomThreshold;
}

Соответственно для сферы:

int Sphere::Intersect( Ray& ray, double& t)
{
 Vector l = Loc - ray.Org;
 double L2OC = l&l;
 double tca = l&ray.Dir;
 double t2hc = Radius - L2OC + tca*tca;
 double t2;

 if( t2hc <= 0.0 )
   return 0;

 t2hc = sqrt( t2hc );

 if ( tca < t2hc)
 {
   t = tca + t2hc;
   t2 = tca - t2hc;
 }
 else
 {
   t = tca - t2hc;
   t2 = tca + t2hc;
 }

 if( fabs (t) < GeomThreshold )
   t = t2;

 return t > GeomThreshold;
}

а для остальных объектов???

Guest 09-01-2004 20:00 207003

2 Vlad Drakula
вот уж не знаю самому проще написать или попробовать догадаться кто такие Ray и ему подобные ... ;))


Время: 23:55.

Время: 23:55.
© OSzone.net 2001-