matlab判断线段和矩形是否相交已知线段两个端点(x,y) (x1,y1)矩形的四个顶点(a1,b1)(a2,b2)(a3,b3)(a4,b4)写个函数 iscross(x,y,x1,y1,a1,b1,a2,b2,a3,b3,a4,b4) 若相交返回1 否则返回0不要告诉我

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/11 00:52:32
matlab判断线段和矩形是否相交已知线段两个端点(x,y) (x1,y1)矩形的四个顶点(a1,b1)(a2,b2)(a3,b3)(a4,b4)写个函数 iscross(x,y,x1,y1,a1,b1,a2,b2,a3,b3,a4,b4) 若相交返回1 否则返回0不要告诉我

matlab判断线段和矩形是否相交已知线段两个端点(x,y) (x1,y1)矩形的四个顶点(a1,b1)(a2,b2)(a3,b3)(a4,b4)写个函数 iscross(x,y,x1,y1,a1,b1,a2,b2,a3,b3,a4,b4) 若相交返回1 否则返回0不要告诉我
matlab判断线段和矩形是否相交
已知线段两个端点(x,y) (x1,y1)
矩形的四个顶点(a1,b1)(a2,b2)(a3,b3)(a4,b4)
写个函数 iscross(x,y,x1,y1,a1,b1,a2,b2,a3,b3,a4,b4) 若相交返回1 否则返回0
不要告诉我在线段上采样哈,这方法不太好.

matlab判断线段和矩形是否相交已知线段两个端点(x,y) (x1,y1)矩形的四个顶点(a1,b1)(a2,b2)(a3,b3)(a4,b4)写个函数 iscross(x,y,x1,y1,a1,b1,a2,b2,a3,b3,a4,b4) 若相交返回1 否则返回0不要告诉我

线段和矩形相交,换句话说就是线段上存在至少一个点落在矩阵内部

为了方便推导,把参数约定下:设线段两个点坐标为r1、r2;矩阵中心坐标为r0,两个轴的单位矢量为e1、e2,对应的边长为2a、2b.

线段上任意点可以表示为:r=λr1+(1-λ)r2 , 0≤λ≤1

点落在矩阵内部可以表示为:|(r-r0)∙e1|≤a,|(r-r0)∙e2|≤b

故线段和矩形相交转化为以下数学问题:存在0≤λ≤1,满足|[λr1+(1-λ)r2-r0]∙e1|≤a,|[λr1+(1-λ)r2-r0]∙e2|≤b.

写程序则需要具体的判断步骤

判断端点是否在矩阵内部,若|(r1-r0)∙e1|≤a且|(r1-r0)∙e2|≤b,则r1在矩阵内部;类似的判断r2.若两者中有一个落在矩阵内部,则线段必定在矩阵内部;若两者都在矩阵外部,做下面判断

代入关系,知存在0≤λ≤1,满足|λ(r1-r2)∙e1+(r2-r0)∙e1|≤a,|λ(r1-r2)∙e2+(r2-r0)∙e2|≤b.

若(r1-r2)∙e1==0,或(r1-r2)∙e2==0,有前面的判断,线段必然落在矩阵外部

否则,|λ+(r2-r0)∙e1/(r1-r2)∙e1|≤a/|(r1-r2)∙e1|,|λ+(r2-r0)∙e2/(r1-r2)∙e2|≤b/|(r1-r2)∙e2|,求得

-a/|(r1-r2)∙e1|-(r2-r0)∙e1/(r1-r2)∙e1≤λ≤a/|(r1-r2)∙e1|-(r2-r0)∙e1/(r1-r2)∙e1,-b/|(r1-r2)∙e2|-(r2-r0)∙e2/(r1-r2)∙e2≤λ≤b/|(r1-r2)∙e2|-(r2-r0)∙e2/(r1-r2)∙e2,取λ1=max(-a/|(r1-r2)∙e1|-(r2-r0)∙e1/(r1-r2)∙e1,-b/|(r1-r2)∙e2|-(r2-r0)∙e2/(r1-r2)∙e2),λ2=min(a/|(r1-r2)∙e1|-(r2-r0)∙e1/(r1-r2)∙e1,b/|(r1-r2)∙e2|-(r2-r0)∙e2/(r1-r2)∙e2),若满足λ1≤λ2&&~(λ2<0&&λ1>1),则线段与矩阵相交.

实际计算中,为了避免数值奇异和判断效率,还需要进一步优化代码.