最長的相交線段 2014亞馬遜機試第2題

2021-06-25 18:26:35 字數 1504 閱讀 6872

判斷連個線段是否相交,分為兩步:

(1).快速排斥試驗

設以線段 p1p2 為對角線的矩形為r, 設以線段 q1q2 為對角線的矩形為t,如果r和t不相交,顯然兩線段不會相交;

(2).跨立試驗

如果兩線段相交,則兩線段必然相互跨立對方,p1p2跨立q1q2 ,則向量 ( p1 - q1 ) 和( p2 - q1 )位於向量( q2 - q1 ) 的兩側,即

( p1 - q1 ) × ( q2 - q1 ) * ( p2 - q1 ) × ( q2 - q1 ) < 0

上式可改寫成

( p1 - q1 ) × ( q2 - q1 ) * ( q2 - q1 ) × ( p2 - q1 ) > 0

所以判斷p1p2跨立q1q2的依據是:

( p1 - q1 ) × ( q2 - q1 ) * ( q2 - q1 ) × ( p2 - q1 ) ≥ 0

同理判斷q1q2跨立p1p2的依據是:

( q1 - p1 ) × ( p2 - p1 ) * ( p2 - p1 ) × ( q2 - p1 ) ≥ 0

// segmentline.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include #include #include #include using namespace std;

bool judgestatus(double line01coords, double line02coords)

return returnresult;

}typedef structpoint;

bool linecross(double line1, double line2)

} return false;

}double culculate(double line)

void main()

} for(i=0; i < line_num; i++)

printf("\n");

} int count = line_num;

double maxlen=-1;

double len=0;

for(i = 0; i < line_num; i++)

while(!remain.empty())

}if(flag)

else

} printf("\n");

if(len > maxlen)

}printf("%lf",maxlen);

while(1);

}

注意:使用容器的erase函式在for迴圈中刪除元素時,使用:

for(ite = v.begin(); ite != v.end();) 

else

}

51Nod 1264 線段相交 兩線段相交的判定

基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 第2 t 1行 每行8個數,...

兩線段相交的判別方法

向量運算有很多用途,判斷兩線段相交我們可以利用向量的叉積來計算。我們先來思考兩線段相交的特點,顯然是有乙個公共點,也就是說對於每條線段來說,另一條線段總會穿過這條線段 所以線段的端點分布在另一條線段的兩端 既然是兩端我們自然可以用叉積來判斷 因為叉積的方向性 至此問題解決 下面放上一道集訓的題目 裡...

線段是否相交的判斷方法

判斷一點在已知直線的左側還是右側。f x,y y y1 x2 x1 x x1 y2 y1 if f x3,y3 0 點 p x3,y3 在p1p2 的左側 if f x3,y3 0 點 p x3,y3 在p1p2 的右側 if f x3,y3 0 點 p x3,y3 在p1p2 線上。判斷兩線段是否...