Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

proto.c #include <stdio.h> #include <math.h> #define E 0.00001 #define INPUT(P) scanf("%lf %lf %lf",&P.x,&P.y,&P.z) #define OUTPUT(P) printf("%.

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

You might also like