*Points/Vectors - Projection http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=CGL_1_A 正射影を求める問題。 指定されている有効桁数が大きいことだけに注意。 あとはベクトルの知識からすぐに式がたちます。 #include<stdio.h> #include<math.h> int main(){ double x0,y0,x1,y1,x2,y2; double dx1,dy1,dx2,dy2,lenP1; scanf("%lf %lf %lf %lf",&x0,&y0,&x1,&y1); dx1=x1-x0; dy1=y1-y0; lenP1=hypot(dx1,dy1); int q; scanf("%d",&q); while(q--){ scanf("%lf %lf",&x2,&y2); dx2=x2-x0; dy2=y2-y0; double T=(dx1*dx2+dy1*dy2)/(lenP1*lenP1); printf("%.10lf %.10lf\n",x0+dx1*T,y0+dy1*T); } } *Points/Vectors - Reflection http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=CGL_1_B 線対称な点を求める問題。 正射影で求めた点の点対称な位置ですので前の問題のコードを流用します。 #include<stdio.h> #include<math.h> int main(){ double x0,y0,x1,y1,x2,y2; double dx1,dy1,dx2,dy2,lenP1; scanf("%lf %lf %lf %lf",&x0,&y0,&x1,&y1); dx1=x1-x0; dy1=y1-y0; lenP1=hypot(dx1,dy1); int q; scanf("%d",&q); while(q--){ scanf("%lf %lf",&x2,&y2); dx2=x2-x0; dy2=y2-y0; double T=(dx1*dx2+dy1*dy2)/(lenP1*lenP1); double tx=x0+T*dx1; double ty=y0+T*dy1; printf("%.10lf %.10lf\n",tx*2-x2,ty*2-y2); } } *Points/Vectors - Counter-Clockwise http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=CGL_1_C ベクトルAからみてベクトルBが時計回りか反時計回りかもしくは同一直線状にあるなら細かく判断する問題。 #include<stdio.h> #include<math.h> int main(){ double x0,y0,x1,y1,x2,y2; double dx1,dy1,dx2,dy2,len1,len2; scanf("%lf %lf %lf %lf",&x0,&y0,&x1,&y1); dx1=x1-x0; dy1=y1-y0; len1=hypot(dx1,dy1); int q; scanf("%d",&q); while(q--){ scanf("%lf %lf",&x2,&y2); dx2=x2-x0; dy2=y2-y0; double R=dx1*dy2-dx2*dy1; len2=hypot(dx2,dy2); if(R>0){ printf("COUNTER_CLOCKWISE\n"); }else if(R<0){ printf("CLOCKWISE\n"); }else{ if(dx1*dx2+dy1*dy2<0){ printf("ONLINE_BACK\n"); }else{ if(len1<len2){ printf("ONLINE_FRONT\n"); }else{ printf("ON_SEGMENT\n"); } } } } }