poj1410 判斷線段和矩形是否相交

2022-08-21 18:12:09 字數 2046 閱讀 2513

題意:判斷線段和矩形是否相交。

思路:注意這裡的相交包括線段在矩形內,因此先判斷線段與矩形的邊是否相交,再判斷線段的兩端點是否在矩形內(因為是矩形,即凸多邊形,直接用叉積判斷即可,如果是一般的多邊形,需要用射線法判斷。)

ac code:

#include#include

#include

#include

using

namespace

std;

const

double eps=1e-8

;const

double inf=1e20;

intt,flag;

int sgn(double

x)struct

point

point(

double xx,double

yy):x(xx),y(yy){}

point

operator + (const point& b)const

point

operator - (const point& b)const

double

operator * (const point& b)const

double

operator ^ (const point& b)const

//繞原點旋轉角度b(弧度值),後x、y的變化

void transxy(double

b)};

struct

line

line(point ss,point ee)

//兩直線相交求交點

//第乙個值為0表示直線重合,為1表示平行,為2表示相交

//只有第乙個值為2時,交點才有意義

pair operator &(const line &b)const

double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));

res.x += (e.x-s.x)*t;

res.y += (e.y-s.y)*t;

return make_pair(2

,res);

}};//

判斷線段相交

bool

inter(line l1,line l2)

double

dis(point a,point b)

//bool

onseg(point p,line l)

//判斷點在凸多邊形內,複雜度o(n)

//點形成乙個凸包,而且按逆時針排序(如果是順時針把裡面的<0改為》0)

//點的編號:0~n-1

//返回值:

//-1:點在凸多邊形外

//0:點在凸多邊形邊界上

//1:點在凸多邊形內

int inconvexpoly(point a,point p,int

n)//

判斷點在任意多邊形內,複雜度o(n)

//射線法,poly的頂點數要大於等於3,點的編號0~n-1

//返回值

//-1:點在凸多邊形外

//0:點在凸多邊形邊界上

//1:點在凸多邊形內

int inpoly(point a,point p,int

n)

else

if(onseg(side.e,ray))

else

if(inter(ray,side)) ++cnt;

}if(cnt%2==1) return1;

else

return -1;}

intmain()

if(inconvexpoly(line.s,p,4)>0&&inconvexpoly(line.e,p,4)>0

) flag=1

;

if(flag) printf("

t\n"

);

else printf("

f\n"

); }

return0;

}

POJ1410 線段矩形相交 坑多

判斷矩形和線段是否相交,線段在矩形內也算 前幾題一直以為判斷線段相交只需要跨步實驗就行了,這題是個例外,因為這題相交可以是端點相交所以叉乘那裡條件是 eps 注意這裡的等號 這就導致如果有兩條線段是在同一直線上的但是沒有重合部分,那麼通過跨立實驗返回的是相交,就錯了,必須再加上快速排斥 includ...

PKU1410 判斷線段是否跟矩形相交

注意 線段完全在矩形內也是相交,注意輸入。解法 分別判斷線段是否跟矩形的四條邊相交,再判斷線段的兩個端點是否都在矩形內 include include include include include include include includeusing namespace std define ...

使用Python判斷線段是否與矩形相交

我們在初等幾何中學過如何判斷兩條直線是否相交。在歐幾里得平面上,兩條直線要麼平行,要麼相交,要麼重合。這是歐幾里得第五公設的推論。相交的兩條直線恰好有乙個交點,而重合的兩條直線有無數個交點。判斷兩條直線位置關係的代數方法是 聯立兩條之直線方程,無解,則兩條直線平行,存在唯一解則兩條直線相交,存在兩個...