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 }                                 
posted @ 2012-07-15 20:36  mrlaker  阅读(248)  评论(0编辑  收藏  举报