*Rotar fram lite urgammal kod*
// Check if an object is within another objects polygon. (Seen from above)
short objectwithinpoly (object3dptr a, object3dptr b, polyptr p, vertexptr v)
{
short c,i,j;
float x,z,pxi,pzi,pxj,pzj;
x=a->x;
z=a->z;
c=0;
j=1;
for (i=0;i<=p->nv;i++){
pxi=v[p->vert].x+b->x;
pzi=v[p->vert].z+b->z;
pxj=v[p->vert[j]].x+b->x;
pzj=v[p->vert[j]].z+b->z;
if ((((pzi<=z) && (z<pzj)) ||
((pzj<=z) && (z<pzi))) &&
(x < (pxj - pxi) * (z-pzi) / (pzj - pzi) + pxi)) c=!c;
j++;
if (j>p->nv) j=0;
}
return c;
}
Känns den igen så är den ursprungligen från CGA FAQ:n.
Lite lustigt namn på funktionen, kollar om en punkt är inom en polygon.
Returnerar 0 om utanför, om inte så är punkten x,z inom polygonen.
pxi, pzi, pxj, pzj är förstås punkter från polygonen.
Ett annat sätt skulle ju va att skapa normaler för triangelns kanter... Så att man får 3 st plan för triangeln, tänk visuellt en toblerone ask... Sen tar man bara 3 dotpodukter..
for (i=0;i<3;i++)
dot=Dotproduct(punkt - triangelpunkt, edgenormal);
om alla dotprodukter är positiva (eller om de va negativa hmm..) så är punkten inuti toblerone asken, och därmed triangeln..
Eller så skulle man kunna räkna vinklar, om en punkt är inuti en triangel så är summan av alla vinklar 360 (en vinkel är vinkeln mellan punkten och 2 hörn av triangeln). Om summan är mindre än 360 så är punkten utanför. Den metoden funkar också på konkava polygoner..
Finns säkert fler metoder, kommer inte på fler nu bara.