「AOJProblem Set from CGL 問0~4」の編集履歴(バックアップ)一覧に戻る

AOJProblem Set from CGL 問0~4 - (2014/01/24 (金) 17:29:32) のソース

*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");
 				}
 			}
 		}
  		
 	}
 }