Professional Documents
Culture Documents
0.00001 " " " ": Typedef Struct Double
0.00001 " " " ": Typedef Struct Double
2f %.2f %.2f\n",P.x,P.y,P.z); typedef struct _tPoint { double x,y,z; } tPoint; typedef struct _tSimplex { int nVert; tPoint V[4]; } tSimplex; tPoint ClosestPointOnEdgeToPoint(tPoint,tSimplex); tPoint ClosestPointOnTriangleToPoint(tPoint,tSimplex); double tPoint tPoint double dot(tPoint,tPoint); cross(tPoint,tPoint); sum(tPoint,double,tPoint); norm(tPoint);
Page 1
const tPoint nullVec = { 0.0, 0.0, 0.0 }; int main() { tPoint P,Q; tSimplex S; int i; for(i=0;i<3;i++) { INPUT(S.V[i]); } S.nVert=3; INPUT(P); // Q=ClosestPointOnEdgeToPoint(P,S); Q=ClosestPointOnTriangleToPoint(P,S); OUTPUT(Q); /* printf("%.2f\n",dot(P,Q)); printf("%.2f\n",dot(P,R)); v=cross(P,Q); printf("%.2f %.2f %.2f\n",v.x,v.y,v.z); */ return 0; } double dot(tPoint u,tPoint v) { return u.x*v.x+u.y*v.y+u.z*v.z; }
proto.c tPoint cross(tPoint u,tPoint v) { tPoint uxv; uxv.x=u.y*v.z-u.z*v.y; uxv.y=u.z*v.x-u.x*v.z; uxv.z=u.x*v.y-u.y*v.x; return uxv; } tPoint sum(tPoint u,double k,tPoint v) { u.x+=k*v.x; u.y+=k*v.y; u.z+=k*v.z; return u; } double norm(tPoint v) { return sqrt(fabs(dot(v,v))); } tPoint ClosestPointOnEdgeToPoint(tPoint P,tSimplex S) { tPoint AB,AP,d; double temp; double normAB; AB=sum(S.V[1],-1,S.V[0]); normAB=norm(AB); d=sum(nullVec,1/normAB,AB); AP=sum(P,-1,S.V[0]); temp=dot(d,AP); //AP*COS(AB,AP) if(temp>E) { if(temp-normAB>=-E) { return S.V[1]; } else { printf("%.2f\n",temp); return sum(S.V[0],temp,d); } } else { return S.V[0]; } } tPoint ClosestPointOnTriangleToPoint(tPoint P,tSimplex S) { int i; //check vertices for(i=0;i<3;i++) { tPoint AP,AB,AC; AP=sum(P,-1,S.V[i]);
Page 2
proto.c AB=sum(S.V[(i+1)%3],-1,S.V[i]); AC=sum(S.V[(i+2)%3],-1,S.V[i]); if(dot(AP,AB)<=E && dot(AP,AC)<=E) { return S.V[i]; } } //check edges for(i=0;i<3;i++) { tPoint AP,BP,AB,BA,BC; BA=sum(S.V[i],-1,S.V[(i+1)%3]); AB=sum(nullVec,-1,BA); BC=sum(S.V[(i+2)%3],-1,S.V[(i+1)%3]); BP=sum(P,-1,S.V[(i+1)%3]); AP=sum(P,-1,S.V[i]); if( dot(cross(cross(BC,BA),BA),BP)>=-E && dot(AP,AB)>=-E && dot(BP,BA)>=-E ) { tPoint A,B; A=S.V[i]; B=S.V[(i+1)%3]; S.V[0]=A; S.V[1]=B; S.nVert=2; return ClosestPointOnEdgeToPoint(P,S); } } }
Page 3