Форум: Форум C++Разное
Новые темы: 00
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Пересечение луча и полигона
 
 автор: alex19921992   (07.04.2007 в 20:49)   письмо автору
 
 

Криво работает функция, считающая пересечение луча и полигона(треуг-ка)
помогите! пожалуйста! можете написать свою, если можно)))

bool comparefloat(float a,float b)
{
if(a-b<pogreshnost || a-b>-pogreshnost)return true;else return false;
}
float length(MyPoint a,MyPoint b)
{
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z));
}

float ploshad(MyPoint a,MyPoint b,MyPoint c)
{
float p=(length(a,b)+length(b,c)+length(c,a))/2;
return sqrt(p*(p-length(a,b))*(p-length(a,c))*(p-length(b,c)) );
}

bool PeresecLuchPoly(MyPoint beg,MyPoint end,MyPoint a,MyPoint b,MyPoint c)
{
//&#241;òðîèì óðàâíåíèå ïëîñêîñòè
float A = a.y *(b.z - c.z) + b.y *(c.z - a.z) + c.y*(a.z - b.z);
float B = a.z *(b.x - c.x) + b.z *(c.x - a.x) + c.z*(a.x - b.x);
float C = a.x *(b.y - c.y) + b.x *(c.y - a.y) + c.x*(a.y - b.y);
float D = -(a.x*(b.y* c.z - c.y* b.z) + b.x *(c.y* a.z - a.y* c.z) + c.x* (a.y *b.z - b.y *a.z));
MyPoint n={A,B,C}, L={end.x-beg.x,end.y-beg.y,end.z-beg.z}; // &#226;åêòîð íîðìàëè è âåêòîð L
float scallair=n.x*L.x+n.y*L.y+n.z*L.z; //&#241;êàëÿðíîå ïðîèçâåäåíèå
if(-scallair<0)return false; // &#229;ñëè íå íàïðàâëí ê ïëîñêîñòè, òî íå ïåðåñåêàåò.
if((-scallair==0)&&(A*beg.x+B*beg.y+C*beg.z+D==0)) //&#224; åñëè ïàðàëåëåí ïëîñêîñòè è íà÷àëî ëåæèò â íåé, òî ïëîñêèé ñëó÷àé
{
//&#242;óò åùå íåò àëãîðèòìà
return false;
}
float k=(-(A*beg.x+B*beg.y+C*beg.z+D))/(L.x*A+L.y*B+L.x*C);//&#241;÷èòàåì k, ÷òî äåëàòü åñëè íà íîëü äåëèì???
MyPoint p={k*L.x+beg.x,k*L.y+beg.y,k*L.z+beg.z}; //&#241;÷èòàåì íóæíóþ òî÷êó ïåðåñå÷åíèÿ.
// &#239;ðîâåðÿåì íà ïðèíàäëåæíîñòü òðåóãîëüíèêó
if(comparefloat(ploshad(a,b,c),ploshad(a,b,p)+ploshad(b,c,p)+ploshad(a,c,p))==true )return true;else return false;
}

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования