这题就是一个反射的题,给出光源和反射之后的一个点,输出反射点.VC时我一直用高中的方法去搞,而且没有考虑特殊情况,导致浪费了很多时间.回来就搜了下,发现这题基本就是一系列模板套上去就OK了,首先是点关于直线的对称点,然后是两条直线的交点,OK手工.下面给出我的代码:



1. #include
2. #include
3. #include
4. #include
5.
6. typedef struct
7. {
8. double x,y;
9. }TPoint;
10.
11. typedef struct
12. {
13. double a,b,c;
14. }TLine;
15.
16. TPoint src,end,sym,ref;
17. TPoint mirr_point[2];
18. TLine mirr;
19. /通过直线上的两个点得到直线的一般式/
20. TLine get_line(TPoint p1,TPoint p2)
21. {
22. TLine ret;
23. ret.a = p1.y-p2.y;
24. ret.b = p2.x-p1.x;
25. ret.c = p1.xp2.y-p2.xp1.y;
26. return ret;
27. }
28. /返回一个数的平方/
29. double squ(double a)
30. {
31. return aa;
32. }
33. /得到p关于l的对称点/
34. TPoint symmetric_point(TPoint p,TLine l)
35. {
36. TPoint ret;
37. double d = squ(l.a)+squ(l.b);
38. ret.x = (squ(l.b)p.x-squ(l.a)p.x-2l.al.bp.y-2l.al.c)/d;
39. ret.y = (squ(l.a)p.y-squ(l.b)p.y-2l.al.bp.x-2l.bl.c)/d;
40. return ret;
41. }
42. /返回和<p1,p3>的叉积/
43. double cross(TPoint p1,TPoint p2,TPoint p3)
44. {
45. return (p2.x-p1.x)(p3.y-p1.y)-(p2.y-p1.y)(p3.x-p1.x);
46. }
47.
48. /用叉积得到两条直线的交点[前提是直线规范相交]/
49. void work()
50. {
51. /求直线 和<c,d>的交点p的方法
52. 首先是得到4个叉积
53. s1 = cross(a,b,c);
54. s2 = cross(a,b,d);
55. s3 = cross(c,d,a);
56. s4 = cross(c,d,b);
57. p.x = (c.xs2-d.xs1)/(s2-s1);
58. p.y = (s.ys2-d.ys1)/(s2-s1);
59. 推导用定比分点
60. /
61. double s1,s2,s3,s4;
62. s1 = cross(end,sym,mirr_point[0]);
63. s2 = cross(end,sym,mirr_point[1]);
64. s3 = cross(mirr_point[0],mirr_point[1],end);
65. s4 = cross(mirr_point[0],mirr_point[1],sym);
66. ref.x = (mirr_point[0].xs2-mirr_point[1].xs1)/(s2-s1);
67. ref.y = (mirr_point[0].ys2-mirr_point[1].y*s1)/(s2-s1);
68. printf(“%.3f %.3f\n”,ref.x,ref.y);
69. return ;
70. }
71.
72. int main(void)
73. {
74. int t;
75. scanf(“%d”,t);
76. while(t–)
77. {
78. scanf(“%lf%lf”,mirr_point[0].x,&mirr_point[0].y);
79. scanf(“%lf%lf”,mirr_point[1].x,&mirr_point[1].y);
80. scanf(“%lf%lf”,src.x,&src.y);
81. scanf(“%lf%lf”,end.x,&end.y);
82. mirr = get_line(mirr_point[0],mirr_point[1]);
83. sym = symmetric_point(src,mirr);
84. work();
85. }
86. return 0;
87. }

Comments

2011-05-05