Segments POJ3304 直線線段相交

2021-10-04 21:34:27 字數 1831 閱讀 8380

題目鏈結

解法:求是否存在一條直線,穿過所有線段,

若存在,那麼一定可以通過旋轉或平移,使得該直線穿過兩線段端點

那麼暴力列舉任意兩個端點,構造直線,檢驗是否穿過所有線段(叉乘判斷)

即可模板部落格

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

const double eps = 1e-8;

const double inf = 1e20;

const double pi = acos(-1.0);

const int maxp = 1010;

//`compares a double to zero`

int sgn(double x)

//square of a double

inline double sqr(double x)

struct point

point(double _x,double _y)

void input()

void output()

bool operator == (point b)const

bool operator < (point b)const

bool pointonseg(point p)

//`兩向量平行(對應直線平行或重合)`

bool parallel(line v)

//`兩線段相交判斷`

//`2 規範相交`

//`1 非規範相交`

//`0 不相交`

int segcrossseg(line v)

//`直線和線段相交判斷`

//`-*this line -v seg`

//`2 規範相交`

//`1 非規範相交`

//`0 不相交`

int linecrossseg(line v)

//`兩直線關係`

//`0 平行`

//`1 重合`

//`2 相交`

int linecrossline(line v)

//`求兩直線的交點`

//`要保證兩直線不平行或重合`

point crosspoint(line v)

//點到直線的距離

double dispointtoline(point p)

//點到線段的距離

double dispointtoseg(point p)

//`返回線段到線段的距離`

//`前提是兩線段不相交,相交距離就是0了`

double dissegtoseg(line v)

//`返回點p在直線上的投影`

point lineprog(point p)

//`返回點p關於直線的對稱點`

point symmetrypoint(point p)

};int t;

int n;

point p[210];

line l[210];//注意大小

int main()

int flag=0;

for(int i=1;i<2*n;i++)

else break;

}if(flag==n)

}if(flag==n) break;

} if(flag==n)

else puts("no!");

}}

POJ 3304 Segments(計算幾何)

description 給出n條線段,問是否存在一條直線與這n條線段的任一條都相交 input 第一行一整數t表示用例組數,每組用例首先輸入一整數n表示線段數量,之後n行每行四個實數x1,y1,x2,y2分別表示線段兩端點橫縱座標 output 對於每組用例,如果存在一條直線與這n條線段的任一條都相...

poj3304 Segments 計算幾何

poj 3304 最近開始刷計算幾何了 公式好多完全不會 數學不行 幾何不行 記憶力不行 當機 查的題解 就當複習吧 這套專題拿來熟悉一下計算幾何模板 include include includeusing namespace std const double eps 1e 8 int sgn d...

POJ 3304 Segments 簡單幾何

題目大意 給出n條線段,現在問是否存在一條直線,使得所有線段向這條直線的投影存在乙個共同的交點 題目分析 題意有點抽象,需要轉換一下,因為所有的線段向某一條直線的投影存在乙個交點,那麼在那條直線上,從交點位置開始,沿著垂直於直線的方向做另一條直線,會發現這條直線與n條線段都存在乙個交點,也就是都相交...