15 using namespace Opcode;
47 if(!verts)
return 0.0f;
48 const Point& p0 = verts[0];
49 const Point& p1 = verts[1];
50 const Point& p2 = verts[2];
51 return ((p0-p1)^(p0-p2)).
Magnitude() * 0.5f;
63 if(!verts)
return 0.0f;
64 const Point& p0 = verts[0];
65 const Point& p1 = verts[1];
66 const Point& p2 = verts[2];
81 if(!verts)
return 0.0f;
83 if(P==0.0f)
return 0.0f;
84 return (4.0f*
PI*
Area(verts)/(P*P));
99 const Point& p1 = verts[mVRef[1]];
100 const Point& p2 = verts[mVRef[2]];
101 normal = ((p2-p1)^(p0-p1)).Normalize();
115 const Point& p0 = verts[mVRef[0]];
116 const Point& p1 = verts[mVRef[1]];
117 const Point& p2 = verts[mVRef[2]];
118 normal = ((p2-p1)^(p0-p1));
132 const Point& p0 = verts[mVRef[0]];
133 const Point& p1 = verts[mVRef[1]];
134 const Point& p2 = verts[mVRef[2]];
135 center = (p0+p1+p2)*
INV3;
149 const Point& p0 = verts[mVRef[0]];
150 const Point& p1 = verts[mVRef[1]];
151 const Point& p2 = verts[mVRef[2]];
153 normal = Center + ((p2-p1)^(p0-p1)).Normalize();
171 float OneOverTotal = 1.0f / (Alpha + Beta + Gamma);
172 Alpha *= OneOverTotal;
173 Beta *= OneOverTotal;
174 Gamma *= OneOverTotal;
176 const Point& p0 = verts[mVRef[0]];
177 const Point& p1 = verts[mVRef[1]];
178 const Point& p2 = verts[mVRef[2]];
179 random = Alpha*p0 + Beta*p1 + Gamma*p2;
193 if(!verts)
return false;
195 const Point& p0 = verts[mVRef[0]];
196 const Point& p1 = verts[mVRef[1]];
197 const Point& p2 = verts[mVRef[2]];
203 return (Normal | source) >= 0.0f;
221 if(!verts)
return false;
223 const Point& p0 = verts[mVRef[0]];
224 const Point& p1 = verts[mVRef[1]];
225 const Point& p2 = verts[mVRef[2]];
231 Point Normal = (p2 - p1)^(p0 - p1);
235 return (Normal | (source - p0)) >= 0.0f;
252 if(!verts)
return 0.0f;
259 float A =
Area(verts);
263 return -(A*(N|
view))/(d*d);
276 if(mVRef[0]==oldref) { mVRef[0] = newref;
return true; }
277 else if(mVRef[1]==oldref) { mVRef[1] = newref;
return true; }
278 else if(mVRef[2]==oldref) { mVRef[2] = newref;
return true; }
290 if(mVRef[0]==mVRef[1])
return true;
291 if(mVRef[1]==mVRef[2])
return true;
292 if(mVRef[2]==mVRef[0])
return true;
305 if(mVRef[0]==ref)
return true;
306 if(mVRef[1]==ref)
return true;
307 if(mVRef[2]==ref)
return true;
321 if(mVRef[0]==ref) { *index = 0;
return true; }
322 if(mVRef[1]==ref) { *index = 1;
return true; }
323 if(mVRef[2]==ref) { *index = 2;
return true; }
337 if(mVRef[0]==vref0 && mVRef[1]==vref1)
return 0;
338 else if(mVRef[0]==vref1 && mVRef[1]==vref0)
return 0;
339 else if(mVRef[0]==vref0 && mVRef[2]==vref1)
return 1;
340 else if(mVRef[0]==vref1 && mVRef[2]==vref0)
return 1;
341 else if(mVRef[1]==vref0 && mVRef[2]==vref1)
return 2;
342 else if(mVRef[1]==vref1 && mVRef[2]==vref0)
return 2;
356 if(mVRef[0]==vref0 && mVRef[1]==vref1)
return mVRef[2];
357 else if(mVRef[0]==vref1 && mVRef[1]==vref0)
return mVRef[2];
358 else if(mVRef[0]==vref0 && mVRef[2]==vref1)
return mVRef[1];
359 else if(mVRef[0]==vref1 && mVRef[2]==vref0)
return mVRef[1];
360 else if(mVRef[1]==vref0 && mVRef[2]==vref1)
return mVRef[0];
361 else if(mVRef[1]==vref1 && mVRef[2]==vref0)
return mVRef[0];
409 if(!verts)
return 0.0f;
412 float Length01 = verts[0].
Distance(verts[1]);
413 float Length02 = verts[0].
Distance(verts[2]);
414 float Length12 = verts[1].
Distance(verts[2]);
415 if(Length01 < Min) Min = Length01;
416 if(Length02 < Min) Min = Length02;
417 if(Length12 < Min) Min = Length12;
430 if(!verts)
return 0.0f;
433 float Length01 = verts[0].
Distance(verts[1]);
434 float Length02 = verts[0].
Distance(verts[2]);
435 float Length12 = verts[1].
Distance(verts[2]);
436 if(Length01 > Max) Max = Length01;
437 if(Length02 > Max) Max = Length02;
438 if(Length12 > Max) Max = Length12;
457 const Point& p0 = verts[mVRef[0]];
458 const Point& p1 = verts[mVRef[1]];
459 const Point& p2 = verts[mVRef[2]];
462 pt = (1.0f - u -
v)*p0 + u*p1 + v*p2;
473 *nearvtx = mVRef[d.SmallestAxis()];
488 float Product = NormU*NormV;
489 if(Product==0.0
f)
return 0.0f;
490 float OneOverProduct = 1.0f / Product;
493 float Cosinus = (u|
v) * OneOverProduct;
499 float AbsSinus = NormW * OneOverProduct;
502 if(AbsSinus > 1.0
f) AbsSinus = 1.0f;
503 if(AbsSinus < -1.0
f) AbsSinus = -1.0f;
505 if(Cosinus>=0.0
f)
return asinf(AbsSinus);
506 else return (
PI-asinf(AbsSinus));
520 if(!verts)
return 0.0f;
529 if(dp>1.0f)
return 0.0f;
530 if(dp<-1.0f)
return PI;