不使用乘除法计算两个矩形是否相交
老师说,当年的红白机就是因为性能不够,所以处理这个问题的时候只用了加减法和比较运算。
我写的代码如下,本来还有种方法,下次再贴
1 #include <stdio.h>
2
3 int main ()
4 {
5 double x_1_1,y_1_1,x_1_2,y_1_2;
6 double x_2_1,y_2_1,x_2_2,y_2_2;
7 double len1,high1,len2,high2;
8 double len,high;
9 double temp;
10 scanf("%lf%lf",&x_1_1,&y_1_1);
11 scanf("%lf%lf",&x_1_2,&y_1_2);
12
13 scanf("%lf%lf",&x_2_1,&y_2_1);
14 scanf("%lf%lf",&x_2_2,&y_2_2);
15
16 if(x_1_1 < x_1_2)
17 {
18 temp = x_1_1;
19 x_1_1 = x_1_2;
20 x_1_2 = temp;
21 }
22 if(y_1_1 < y_1_2)
23 {
24 temp = y_1_1;
25 y_1_1 = y_1_2;
26 y_1_2 = temp;
27 }
28 if(x_2_1 < x_2_2)
29 {
30 temp = x_2_1;
31 x_2_1 = x_2_2;
32 x_2_2 = temp;
33 }
34 if(y_2_1 < y_2_2)
35 {
36 temp = y_2_1;
37 y_2_1 = y_2_2;
38 y_2_2 = temp;
39 }
40 len1 = x_1_1 - x_1_2;
41 high1 = y_1_1 - y_1_2;
42
43 len2 = x_2_1 - x_2_2;
44 high2 = y_2_1 - y_2_2;
45
46 if (x_1_1 > x_2_1)
47 len = x_1_1 - x_2_2;
48 else
49 len = x_2_1 - x_1_2;
50
51 if (y_1_1 > y_2_1)
52 high = y_1_1 - y_2_2;
53 else
54 high = y_2_1 - y_1_2;
55
56 if (len < len1 + len2 || high < high1 + high2)
57 printf("yes\n");
58 else
59 printf("no\n");
60
61 return 0;
62 }
2
3 int main ()
4 {
5 double x_1_1,y_1_1,x_1_2,y_1_2;
6 double x_2_1,y_2_1,x_2_2,y_2_2;
7 double len1,high1,len2,high2;
8 double len,high;
9 double temp;
10 scanf("%lf%lf",&x_1_1,&y_1_1);
11 scanf("%lf%lf",&x_1_2,&y_1_2);
12
13 scanf("%lf%lf",&x_2_1,&y_2_1);
14 scanf("%lf%lf",&x_2_2,&y_2_2);
15
16 if(x_1_1 < x_1_2)
17 {
18 temp = x_1_1;
19 x_1_1 = x_1_2;
20 x_1_2 = temp;
21 }
22 if(y_1_1 < y_1_2)
23 {
24 temp = y_1_1;
25 y_1_1 = y_1_2;
26 y_1_2 = temp;
27 }
28 if(x_2_1 < x_2_2)
29 {
30 temp = x_2_1;
31 x_2_1 = x_2_2;
32 x_2_2 = temp;
33 }
34 if(y_2_1 < y_2_2)
35 {
36 temp = y_2_1;
37 y_2_1 = y_2_2;
38 y_2_2 = temp;
39 }
40 len1 = x_1_1 - x_1_2;
41 high1 = y_1_1 - y_1_2;
42
43 len2 = x_2_1 - x_2_2;
44 high2 = y_2_1 - y_2_2;
45
46 if (x_1_1 > x_2_1)
47 len = x_1_1 - x_2_2;
48 else
49 len = x_2_1 - x_1_2;
50
51 if (y_1_1 > y_2_1)
52 high = y_1_1 - y_2_2;
53 else
54 high = y_2_1 - y_1_2;
55
56 if (len < len1 + len2 || high < high1 + high2)
57 printf("yes\n");
58 else
59 printf("no\n");
60
61 return 0;
62 }
不过如果是像(0,0)(1,1)和(1,0)(3,3)这样边界重合我没当是相交处理。
说实话我不知道这样做的效率是否比用除法小,反正用除法的话写着是蛮方便的,确定中点,算重点距离,然后比较中点距离的平方和两个矩形长之和与宽之和的平方之和的大小
posted on 2011-06-29 21:09 coder?coder! 阅读(205) 评论(0) 编辑 收藏 举报