锘??xml version="1.0" encoding="utf-8" standalone="yes"?>//璁$畻鍑犱綍妯℃澘 ~ alpc02
2const double PRECISION = 1e-8;
3struct Point
{
4 double x, y;
5};
6int dblcmp(double d)
{
7 return (fabs(d) < PRECISION) ? 0:(d>0 ? 1:-1);
8} //涓夊弶鍙e嚱鏁幫紝閬垮厤綺懼害璇樊
9double length(double x, double y)
{
10 return sqrt(x*x + y*y);
11} //鍚戦噺闀垮害
12double dotdet(double x1, double y1, double x2, double y2)
{
13 return x1*x2 + y1*y2;
14} //鐐圭Н
15double det(double x1, double y1, double x2, double y2)
{
16 return x1*y2 - x2*y1;
17} //鍙夌Н
18int cross(const Point &a, const Point &c, const Point &d)
{
19 return dblcmp( det(a.x-c.x, a.y-c.y, d.x-c.x, d.y-c.y) );
20} //鍙蟲墜铻烘棆瀹氬垯錛?鈥斺攁鍦╟d鍙充晶錛?1鈥斺攁鍦╟d宸︿晶錛?鈥斺斾笁鐐瑰叡綰?/span>
21bool between(const Point &a, const Point &c, const Point &d)
{
22 return dblcmp( dotdet(c.x-a.x, c.y-a.y, d.x-a.x, d.y-a.y) ) != 1;
23} //鍦╟ross(a,c,d)==0鐨勫熀紜涓婏紝鍙垽鏂偣a鏄惁鍦╟d鍐呴儴
24int segIntersect(const Point &a, const Point &b, const Point &c, const Point &d)
{
25 int a_cd = cross(a,c,d);
26 if(a_cd == 0 && between(a,c,d)) return 2;
27 int b_cd = cross(b,c,d);
28 if(b_cd == 0 && between(b,c,d)) return 2;
29 int c_ab = cross(c,a,b);
30 if(c_ab == 0 && between(c,a,b)) return 2;
31 int d_ab = cross(d,a,b);
32 if(d_ab == 0 && between(d,a,b)) return 2;
33 if ((a_cd ^ b_cd) == -2 && (c_ab ^ d_ab) == -2)
34 return 1;
35 return 0;
36} //涓ょ嚎孌電浉浜ゆ儏鍐碉細0鈥斺斾笉鐩鎬氦錛?鈥斺旇鑼冪浉浜わ紝2鈥斺斾笉瑙勮寖鐩鎬氦錛堜氦浜庣鐐規垨閲嶅悎錛?/span>
37void intersectPoint(const Point &a, const Point &b, const Point &c, const Point &d, Point &e)
{
38 double sc, sd;
39 sc = fabs( det(b.x-a.x, b.y-a.y, c.x-a.x, c.y-a.y) );
40 sd = fabs( det(b.x-a.x, b.y-a.y, d.x-a.x, d.y-a.y) );
41 e.x = (sc * d.x + sd * c.x) / (sc + sd);
42 e.y = (sc * d.y + sd * c.y) / (sc + sd);
43} //涓ょ嚎孌佃鑼冪浉浜ゆ椂錛屾眰浜ょ偣鍧愭爣
44int linesegIntersect(const Point &a, const Point &b, const Point &c, const Point &d)
{
45 int c_ab = cross(c,a,b);
46 if(c_ab == 0) return 2;
47 int d_ab = cross(d,a,b);
48 if(d_ab == 0) return 2;
49 if(c_ab ^ d_ab == -2)
50 return 1;
51 return 0;
52} //鐩寸嚎ab鍜岀嚎孌礳d鐩鎬氦鎯呭喌錛?鈥斺斾笉鐩鎬氦錛?鈥斺旇鑼冪浉浜わ紝2鈥斺斾笉瑙勮寖鐩鎬氦錛堜氦浜庣鐐規垨閲嶅悎錛?/span>
53int lineIntersect(const Point &a, const Point &b, const Point &c, const Point &d)
{
54 if(dblcmp(det(b.x-a.x, b.y-a.y, d.x-c.x, d.y-c.y)) != 0)
55 return 1;
56 if(cross(a,c,d) == 0)
57 return 2;
58 return 0;
59} //涓ょ洿綰跨浉浜ゆ儏鍐碉細0鈥斺斿鉤琛岋紝1鈥斺旇鑼冪浉浜わ紝2鈥斺斾笉瑙勮寖鐩鎬氦錛堥噸鍚堬級
60
]]>
]]>
鈥斺?/span>Wjx鏄ㄦ櫄緇欐垜閫熸垚鐨勮綆楀嚑浣?/span>
涓銆?/span>鐐廣?/span>
l 鐐圭殑鍧愭爣A(x1, y1)錛?/span>B(x2, y2)
浜屻?/span>鍚戦噺銆?/span>
l 鍚戦噺AB = (x2-x1, y2-y1) = (x3,y3) 錛?/span>CD = (x4, y4)銆?/span>
l 鍚戦噺鐨勬ā|AB| = sqrt(x3*x3 + y3*y3) 鍗沖悜閲忕殑闀垮害銆?/span>
涓夈?/span>鐐圭Н銆?/span>
l 鐐圭Н鐨勭粨鏋滀負涓涓暟鍊箋?/span>
l 鏁板艱綆楁柟娉?/span>AB * CD 錛?/span> x3*x4 + y3*y4銆?/span>
l 鍑犱綍鎰忎箟AB * CD = |AB| * |CD| * cos(a)錛?/span>a涓哄悜閲?/span>AB閫嗘椂閽堣漿鍚?/span>CD鐨勮搴︼紝0<=a<360錛屼篃鍙互璁や負鏄袱鍚戦噺鐨勫す瑙掞紝0<=a<=180銆備竴鑸敤浜庢眰澶硅錛?/span>a = acos( (AB * CD) / (|AB| * |CD|) )銆備篃鍙細|CD| * cos(a) = AB * CD / |AB|錛屽嵆鍚戦噺CD鍦?/span>AB涓婄殑鎶曞獎銆?/span>
鍥涖?/span>鍙夌Н銆?/span>
l 鍙夌Н鐨勭粨鏋滀負涓涓悜閲忋?/span>
l AB×CD鏁板?/span>= x3*y4 – x4*y3銆?/span>
l 鏂瑰悜鐢卞彸鎵嬭灪鏃嬪畾鍒欏垽瀹氥?/span>
l 鍑犱綍鎰忎箟錛?/span>AB×CD = |AB| * |CD| * sin(a)錛屽彇緇濆鍊煎嵆鏄互AB鍜?/span>CD涓鴻竟鐨勫鉤琛屽洓杈瑰艦闈㈢Н銆?/span>
浜斻?/span>綰挎鐩鎬氦鐨勫垽瀹氾紙鍒ゅ畾綰挎AB鍜岀嚎孌?/span>CD鏄惁鐩鎬氦錛屽睘浜庡摢縐嶇浉浜わ級銆?/span>
l 瑙勮寖鐩鎬氦錛氫氦鐐瑰彧鏈変竴涓紝涓斾笉鏄嚎孌電殑绔偣銆?/span>
1銆?/span>鍏呰鏉′歡錛氱偣A鍜岀偣B鍦?/span>CD鐨勪袱渚у茍涓旂偣C鍜岀偣D鍦?/span>AB鐨勪袱渚с?/span>
2銆?/span>濡備綍鍒ゆ柇鐐?/span>A鍦ㄥ悜閲?/span>CD鐨勫乏渚ц繕鏄彸渚э細CA×CD鐨勬暟鍊煎ぇ浜?/span>0鍒欏乏渚э紝灝忎簬0鍒欏彸渚с備簬鏄?/span>CA×CD鐨勬暟鍊煎拰CB×CD鐨勬暟鍊煎紓鍙鳳紝鐐?/span>A鍜岀偣B鍦?/span>CD鐨勪袱渚э紝鍚岀悊鍙垽鏂偣C鍜岀偣D鏄惁鍦?/span>AB鐨勪袱渚э紙娉ㄦ剰錛屽繀欏諱弗鏍煎紓鍙鳳級銆?/span>
l 涓嶈鑼冪浉浜わ細浜ょ偣涓烘煇涓嚎孌電殑绔偣錛岀敋鑷充袱綰挎鏈変竴孌甸噸鍚堛?/span>
1銆?/span>鍏呰鏉′歡錛屼竴鏉$嚎孌電殑涓涓鐐瑰湪鍙︿竴鏉$嚎孌典笂銆傚嵆A鍦?/span>CD涓婃垨B鍦?/span>CD涓婃垨C鍦?/span>AB涓婃垨D鍦?/span>AB涓娿?/span>
2銆?/span>A鍦ㄧ嚎孌?/span>CD涓婄殑鍏呰鏉′歡錛?/span>
a) AC×AD = 0錛屽嚑浣曟剰涔夛紝AC鍜?/span>AD緇勬垚鐨勫鉤琛屽洓杈瑰艦鐨勯潰縐負0錛屽嵆A銆?/span>C銆?/span>D涓夌偣鍏辯嚎銆?/span>
b) A鐐瑰湪CD涔嬮棿錛?/span>A.x澶勪簬C.x鍜?/span>D.x涔嬮棿騫朵笖A.y澶勪簬C.y鍜?/span>D.y涔嬮棿