ä¸.ç¢éåºæ¬ç¥è¯
å 为åé¢ç计ç®éè¦ä¸äºç¢éçåºæ¬ç¥è¯ï¼è¿éåªæ¯ç®åçå举å¦ä¸ï¼å¦æéè¦æ´å 详ç»çä¿¡æ¯ï¼å¯ä»¥èªè¡æç´¢wikipediaægoogleã
1.ç¢éçæ¦å¿µï¼å¦æä¸æ¡çº¿æ®µç端ç¹æ¯æ次åºä¹åçï¼æ们æè¿ç§çº¿æ®µæ为æå线段(directed segment)ãå¦ææå线段p1p2çèµ·ç¹p1å¨åæ åç¹ï¼æ们å¯ä»¥æå®ç§°ä¸ºç¢é(vector)p2ã
2.ç¢éå åæ³ï¼è®¾äºç»´ç¢éP = ( x1, y1 )ï¼Q = ( x2 , y2 )ï¼åç¢éå æ³å®ä¹ä¸ºï¼ P + Q = ( x1 + x2 , y1 + y2 )ï¼åæ ·çï¼ç¢éåæ³å®ä¹ä¸ºï¼ P - Q = ( x1 - x2 , y1 - y2 )ãæ¾ç¶ææ§è´¨ P + Q = Q + Pï¼P - Q = - ( Q - P )ã
3.ç¢éçå积ï¼è®¡ç®ç¢éå积æ¯ä¸ç´çº¿å线段ç¸å
³ç®æ³çæ ¸å¿é¨åã设ç¢éP = ( x1, y1 )ï¼Q = ( x2, y2 )ï¼åç¢éå积å®ä¹ä¸ºç±(0,0)ãp1ãp2åp1+p2æç»æçå¹³è¡å边形ç带符å·çé¢ç§¯ï¼å³ï¼P à Q = x1*y2 - x2*y1ï¼å
¶ç»ææ¯ä¸ä¸ªæ éãæ¾ç¶ææ§è´¨ P à Q = - ( Q à P ) å P à ( - Q ) = - ( P à Q )ãä¸è¬å¨ä¸å 说æçæ
åµä¸ï¼æ¬æä¸è¿°ç®æ³ä¸ææçç¹é½çä½ç¢éï¼ä¸¤ç¹çå åæ³å°±æ¯ç¢éç¸å åï¼èç¹çä¹æ³åçä½ç¢éå积ã
å积çä¸ä¸ªé常éè¦æ§è´¨æ¯å¯ä»¥éè¿å®ç符å·å¤æ两ç¢éç¸äºä¹é´ç顺éæ¶éå
³ç³»ï¼
ããè¥ P à Q > 0 , åPå¨Qç顺æ¶éæ¹åã
ããè¥ P à Q < 0 , åPå¨Qçéæ¶éæ¹åã
ããè¥ P à Q = 0 , åPä¸Qå
±çº¿ï¼ä½å¯è½ååä¹å¯è½ååã
4.æ线段çæåå¤æï¼æ线段çæåå¤ææ¹æ³å¯ä»¥ç´æ¥ç±ç¢éå积çæ§è´¨æ¨åºã对äºæå
Œ
±ç«¯ç¹ç线段p0p1åp1p2ï¼éè¿è®¡ç®(p2 - p0) à (p1 - p0)ç符å·ä¾¿å¯ä»¥ç¡®å®æ线段çæåï¼
ããè¥(p2 - p0) à (p1 - p0) > 0,åp0p1å¨p1ç¹æåå³ä¾§åå¾å°p1p2ã
ããè¥(p2 - p0) à (p1 - p0) < 0,åp0p1å¨p1ç¹æå左侧åå¾å°p1p2ã
ããè¥(p2 - p0) à (p1 - p0) = 0,åp0ãp1ãp2ä¸ç¹å
±çº¿ã
è¿ä¸æ¡å¤æä¹å¯ç¨æ¥å¤æç¹å¨çº¿æ®µæç´çº¿çåªä¸æµã
为äºåæçåè¿°æ¹ä¾¿ï¼å
å®ä¹å 个ç»æï¼
struct point{
int x;
int y;
};
struct v{
point start;
point end;
};
计ç®ä¸¤æ¡ç´çº¿çå积(cross production), è¿éç±äºå®ä¹çé½æ¯äºç»´çæ
åµï¼æ¬è´¨ä¸è¯´ï¼å¨å¹³é¢ä¸ä¸¤ä¸ªåéçå积åºè¯¥æ¯åç´å¹³é¢çï¼è¿éå½æ°è¿åçæ´æ°å¼å³ä¸ºzè½´ä¸çå¼ï¼
int crossProduct(v* v1, v* v2){
v vt1, vt2;
int result = 0;
vt1.start.x = 0;
vt1.start.y = 0;
vt1.end.x = v1->end.x - v1->start.x;
vt1.end.y = v1->end.y - v1->start.y;
vt2.start.x = 0;
vt2.start.y = 0;
vt2.end.x = v2->end.x - v2->start.x;
vt2.end.y = v2->end.y - v2->start.y;
result = vt1.end.x * vt2.end.y - vt2.end.x * vt1.end.y;
return result;
}
äº.å¤æ两æ¡ç´çº¿ç¸äº¤
å
æ¥çä¸ä¸ªç®åçæ
åµï¼å³å¤æ两æ¡ç´çº¿æ¯å¦ç¸äº¤ã
第ä¸ä¸ªå¯è½ä¼æ³å°çåæ³ï¼å°±æ¯å¤ææçï¼è¿ä¸ªå¨ä¸å¦æ¶ä»£å°±å¦è¿äºï¼ä¸è¿æçéè¦èèåç´çç¹æ®æ
åµï¼æ¯è¾éº»ç¦ãæ´å¥½çåæ³æ许æ¯è®¡ç®ä¸¤ä¸ªåéçå积ï¼å¦æ为0ï¼åæ¯å¹³è¡æè
éåçï¼å¦å两ç´çº¿ç¸äº¤ã
代ç å°±ä¸è´´äºï¼ç´æ¥è°ç¨ä¸é¢çå½æ°å°±okäºã
ä¸.å¤æ两线段ç¸äº¤
ç»å
¸æ¹æ³ï¼å°±æ¯è·¨ç«è¯éªäºï¼å³å¦æä¸æ¡çº¿æ®µè·¨è¿å¦ä¸æ¡çº¿æ®µï¼å线段ç两个端ç¹åå«å¨å¦ä¸æ¡çº¿æ®µç两侧ãä½æ¯ï¼è¿éè¦æ£æµè¾¹çæ
åµï¼å³ä¸¤æ¡çº¿æ®µä¸å¯è½ææ¡çº¿æ®µçæ个端ç¹æ£å¥½è½å¨å¦ä¸æ¡çº¿æ®µä¸ãè¿ä¹æ¯ç®æ³å¯¼è®ºä¸ä»ç»çç®æ³ã
ç¨åºæ¨¡æå¦ä¸ï¼
int direction(point* pi, point* pj, point* pk){
point p1, p2;
p1.x = pk->x - pi->x;
p1.y = pk->y - pi->y;
p2.x = pj->x - pi->x;
p2.y = pj->y - pi->y;
return crossProduct(&p1, &p2);
}
int onSegment(point* pi, point* pj, point* pk){
int minx, miny, maxx, maxy;
if (pi->x > pj->x){
minx = pj->x;
maxx = pi->x;
}
else{
minx = pi->x;
maxx = pj->x;
}
if (pi->y > pj->y){
miny = pj->y;
maxy = pi->y;
}
else{
miny = pi->y;
maxy = pj->y;
}
if (minx <= pk->x && pk->x <= maxx && miny <= pk->y && pk->y <= maxy)
return 1;
else
return 0;
}
int segmentIntersect(point* p1, point* p2, point* p3, point* p4){
int d1 = direction(p3, p4, p1);
int d2 = direction(p3, p4, p2);
int d3 = direction(p1, p2, p3);
int d4 = direction(p1, p2, p4);
if (d1 * d2 < 0 && d3 * d4 < 0)
return 1;
else if (!d1 && onSegment(p3, p4, p1))
return 1;
else if (!d2 && onSegment(p3, p4, p2))
return 1;
else if (!d3 && onSegment(p1, p2, p3))
return 1;
else if (!d4 && onSegment(p1, p2, p4))
return 1;
else
return 0;
}
å®é
ä¸ï¼å¦ææ³æ¹è¿ä¸è¿°ç®æ³ï¼è¿å¯ä»¥å¨è·¨ç«è¯éªåå ä¸æ¥ï¼å°±æ¯å
åå¿«éææ¥è¯éªãé£å°±æ¯ï¼å
åå«å¤æ以两æ¡çº¿æ®µä¸ºå¯¹è§çº¿çç©å½¢æ¯å¦ç¸äº¤ï¼å¦æä¸ç¸äº¤ï¼å两个线段è¯å®ä¸ç¸äº¤ã
å.å¤æ两æ¡çº¿æ®µç¸äº¤ï¼ç¶å计ç®äº¤ç¹
设ä¸æ¡çº¿æ®µä¸ºL0=P1P2, å¦ä¸æ¡çº¿æ®µæç´çº¿ä¸ºL1=Q1Q2, è¦è®¡ç®çå°±æ¯L0åL1ç交ç¹ã
1.é¦å
å¤æL0åL1æ¯å¦ç¸äº¤(æ¹æ³å·²å¨åæ讨论è¿), å¦æä¸ç¸äº¤å没æ交ç¹, å¦å说æL0åL1ä¸å®æ交ç¹, ä¸é¢å°±å°L0åL1é½çä½ç´çº¿æ¥èè.
2.å¦æP1åP2横åæ ç¸å, å³L0å¹³è¡äºYè½´
a)è¥L1ä¹å¹³è¡äºYè½´
i.è¥P1ç纵åæ åQ1ç纵åæ ç¸å, 说æL0åL1å
±çº¿, åå¦L1æ¯ç´çº¿çè¯ä»ä»¬ææ ç©·ç交ç¹, åå¦L1æ¯çº¿æ®µçè¯å¯ç¨"计ç®ä¸¤æ¡å
±çº¿çº¿æ®µç交ç¹"çç®æ³æ±ä»ä»¬ç交ç¹(该æ¹æ³å¨åæ已讨论è¿);
ii.å¦å说æL0åL1å¹³è¡, ä»ä»¬æ²¡æ交ç¹;
b)è¥L1ä¸å¹³è¡äºYè½´, å交ç¹æ¨ªåæ 为P1ç横åæ , 代å
¥å°L1çç´çº¿æ¹ç¨ä¸å¯ä»¥è®¡ç®åºäº¤ç¹çºµåæ ;
3.å¦æP1åP2横åæ ä¸å, ä½æ¯Q1åQ2横åæ ç¸å, å³L1å¹³è¡äºYè½´, å交ç¹æ¨ªåæ 为Q1ç横åæ , 代å
¥å°L0çç´çº¿æ¹ç¨ä¸å¯ä»¥è®¡ç®åºäº¤ç¹çºµåæ ;
4.å¦æP1åP2纵åæ ç¸å, å³L0å¹³è¡äºXè½´
a)è¥L1ä¹å¹³è¡äºXè½´,
i.è¥P1ç横åæ åQ1ç横åæ ç¸å, 说æL0åL1å
±çº¿, åå¦L1æ¯ç´çº¿çè¯ä»ä»¬ææ ç©·ç交ç¹, åå¦L1æ¯çº¿æ®µçè¯å¯ç¨"计ç®ä¸¤æ¡å
±çº¿çº¿æ®µç交ç¹"çç®æ³æ±ä»ä»¬ç交ç¹(该æ¹æ³å¨åæ已讨论è¿);
ii.å¦å说æL0åL1å¹³è¡, ä»ä»¬æ²¡æ交ç¹;
b)è¥L1ä¸å¹³è¡äºXè½´, å交ç¹çºµåæ 为P1ç纵åæ , 代å
¥å°L1çç´çº¿æ¹ç¨ä¸å¯ä»¥è®¡ç®åºäº¤ç¹æ¨ªåæ ;
5.å¦æP1åP2纵åæ ä¸å, ä½æ¯Q1åQ2纵åæ ç¸å, å³L1å¹³è¡äºXè½´, å交ç¹çºµåæ 为Q1ç纵åæ , 代å
¥å°L0çç´çº¿æ¹ç¨ä¸å¯ä»¥è®¡ç®åºäº¤ç¹æ¨ªåæ ;
6.å©ä¸çæ
åµå°±æ¯L1åL0çæçååå¨ä¸ä¸ä¸º0çæ
åµ
a)计ç®åºL0çæçK0, L1çæçK1;
b)å¦æK1 = K2
i.å¦æQ1å¨L0ä¸, å说æL0åL1å
±çº¿, åå¦L1æ¯ç´çº¿çè¯ææ 穷交ç¹, åå¦L1æ¯çº¿æ®µçè¯å¯ç¨"计ç®ä¸¤æ¡å
±çº¿çº¿æ®µç交ç¹"çç®æ³æ±ä»ä»¬ç交ç¹(该æ¹æ³å¨åæ已讨论è¿);
ii.å¦æQ1ä¸å¨L0ä¸, å说æL0åL1å¹³è¡, ä»ä»¬æ²¡æ交ç¹.
c)èç«ä¸¤ç´çº¿çæ¹ç¨ç»å¯ä»¥è§£åºäº¤ç¹æ¥
è¿ä¸ªç®æ³å¹¶ä¸å¤æ, ä½æ¯è¦åæ
åµè®¨è®ºæ¸
æ¥, å°¤å
¶æ¯å½ä¸¤æ¡çº¿æ®µå
±çº¿çæ
åµéè¦åç¬èè, æ以å¨åæå°æ±ä¸¤æ¡å
±çº¿çº¿æ®µçç®æ³åç¬ååºæ¥. å¦å¤, ä¸å¼å§å°±å
å©ç¨ç¢éåä¹å¤æ线段ä¸çº¿æ®µ(æç´çº¿)æ¯å¦ç¸äº¤, å¦æç»ææ¯ç¸äº¤, é£ä¹å¨åé¢å°±å¯ä»¥å°çº¿æ®µå
¨é¨çä½ç´çº¿æ¥èè. éè¦æ³¨æçæ¯, æ们å¯ä»¥å°ç´çº¿æ线段æ¹ç¨æ¹å为ax+by+c=0çå½¢å¼, è¿æ ·ä¸æ¥ä¸è¿°è¿ç¨çé¨åæ¥éª¤å¯ä»¥å并, 缩çäºä»£ç é¿åº¦, ä½æ¯ç±äºå
è¦æ±åºåæ°, è¿ç§ç®æ³å°è±è´¹æ´å¤çæ¶é´.
温馨提示:答案为网友推荐,仅供参考