Ответить на сообщение
Вернуться к теме
Вы отвечаете на сообщение:
Автор: 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) { //ñòðîèì óðàâíåíèå ïëîñêîñòè 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}; // âåêòîð íîðìàëè è âåêòîð L float scallair=n.x*L.x+n.y*L.y+n.z*L.z; //ñêàëÿðíîå ïðîèçâåäåíèå if(-scallair<0)return false; // åñëè íå íàïðàâëí ê ïëîñêîñòè, òî íå ïåðåñåêàåò. if((-scallair==0)&&(A*beg.x+B*beg.y+C*beg.z+D==0)) //à åñëè ïàðàëåëåí ïëîñêîñòè è íà÷àëî ëåæèò â íåé, òî ïëîñêèé ñëó÷àé { //òóò åùå íåò àëãîðèòìà return false; } float k=(-(A*beg.x+B*beg.y+C*beg.z+D))/(L.x*A+L.y*B+L.x*C);//ñ÷èòàåì k, ÷òî äåëàòü åñëè íà íîëü äåëèì??? MyPoint p={k*L.x+beg.x,k*L.y+beg.y,k*L.z+beg.z}; //ñ÷èòàåì íóæíóþ òî÷êó ïåðåñå÷åíèÿ. // ïðîâåðÿåì íà ïðèíàäëåæíîñòü òðåóãîëüíèêó if(comparefloat(ploshad(a,b,c),ploshad(a,b,p)+ploshad(b,c,p)+ploshad(a,c,p))==true )return true;else return false; }
Ваше имя:
Пароль:
Цитировать Используйте тэги для выделения текста: Код: [code][/code] Жирный: [b][/b] Наклонный: [i][/i] URL: [url][/url]
Сообщение:
Прикрепить: