Sicily Hansel and Grethel
【题意】
给定两个点相对于Hansel and Grethel的横纵坐标,以及它们与北方向的夹角[0,360),求Hansel and Grethel所在位置的坐标。
【思路】
根据两个参考点坐标和方向角,求出两条直线的方程,两条直线的交点就是所求的坐标。
求直线方程时分斜率存在和斜率不存在两种情况,斜率存在时分(0,90]υ(270,360)和(90,180)υ(180,270]两种情况。其实两种情况应该可以合并,我看有人写的代码很短。我写的代码比较长,但是思路是比较直接的,很多功能重复的地方也就多复制几次好了。
值得注意的一点就是两个double型的值相比较是不能用等于号的。以后遇到这样的题最重要的是要细心一步一步来,不要把会做的题做错了。
1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 using namespace std; 5 6 const double pi=acos(-1.0); //还是计算出来精确,手动赋值不行 7 8 double get_k(double a) //由一个点所处的角度得到直线斜率 9 { 10 double k; 11 if((a>0 && a<=90) || (a>270 && a<360)) 12 { 13 k=tan((90-a)*pi/180); 14 } 15 else if((a>90 && a<180) || (a>180 && a<=270)) 16 { 17 k=tan((270-a)*pi/180); 18 } 19 return k; 20 } 21 22 int main() 23 { 24 int t; 25 cin>>t; 26 while(t--) 27 { 28 double x1,y1,a1,x2,y2,a2; 29 scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&a1,&x2,&y2,&a2); 30 double k1,k2,x,y,a,b; 31 32 if((a1!=0 && a1!=180) && (a2!=0 && a2!=180)) //两条直线斜率都存在 33 { 34 k1=get_k(a1); 35 k2=get_k(a2); 36 37 if(fabs(k1-k2)>0.00000001) 38 { 39 a=k1*x1-y1; //a、b为中间变量 40 b=k2*x2-y2; 41 x=(a-b)/(k1-k2); 42 y=k1*x-a; 43 44 printf("%.4lf ",x); 45 printf("%.4lf\n",y); 46 } 47 else 48 { 49 x=(x1+x2)/2; 50 y=(y1+y2)/2; 51 52 printf("%.4lf ",x); 53 printf("%.4lf\n",y); 54 } 55 } 56 else if( (a1==0 || a1==180) && (a2!=0 && a2!=180) ) //直线1斜率不存在,直线2存在 57 { 58 k2=get_k(a2); 59 x=x1; 60 y=k2*(x1-x2)+y2; 61 62 printf("%.4lf ",x); 63 printf("%.4lf\n",y); 64 } 65 else if( (a2==0 || a2==180) && (a1!=0 && a1!=180) ) //直线1斜率存在,直线2不存在 66 { 67 k1=get_k(a1); 68 x=x2; 69 y=k1*(x2-x1)+y1; 70 71 printf("%.4lf ",x); 72 printf("%.4lf\n",y); 73 } 74 else //两条直线斜率都不存在 75 { 76 x=x1; 77 y=(y1+y2)/2; 78 79 printf("%.4lf ",x); 80 printf("%.4lf\n",y); 81 } 82 } 83 return 0; 84 }