題意:判斷線段和矩形是否相交。
思路:注意這裡的相交包括線段在矩形內,因此先判斷線段與矩形的邊是否相交,再判斷線段的兩端點是否在矩形內(因為是矩形,即凸多邊形,直接用叉積判斷即可,如果是一般的多邊形,需要用射線法判斷。)
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判斷線段是否與矩形相交
我們在初等幾何中學過如何判斷兩條直線是否相交。在歐幾里得平面上,兩條直線要麼平行,要麼相交,要麼重合。這是歐幾里得第五公設的推論。相交的兩條直線恰好有乙個交點,而重合的兩條直線有無數個交點。判斷兩條直線位置關係的代數方法是 聯立兩條之直線方程,無解,則兩條直線平行,存在唯一解則兩條直線相交,存在兩個...