matlab 如何判断两线段是否相交?
clear all
clc
n=6
rp=rand(2,n);%生成随机n个点,这里选的5个
y=rp(2,:);
x=rp(1,:);
L=[]%线矩阵
h=1;%计数器
m=0;%计数;器
er=1e-10%比较误差,后面会解释
for i=1:n-1
h=h+1;
for l= h:n
m=m+1;
L(m,:)=[x(i) y(i) x(l) y(l)];%将所有的点用线连起来
X=[x(i) x(l)];
Y=[y(i) y(l)];
line(X,Y)%画出所有的线
hold on
end
end
h=1;
si=size(L);
mark=zeros(1,si(1));%用来标记有交点的矩阵
for i=1:m-1
h=h+1;
for l=h:m
x11=L(i,1);
y11=L(i,2);
x12=L(i,3);
y12=L(i,4);
x21=L(l,1);
y21=L(l,2);
x22=L(l,3);
y22=L(l,4);%将两条线从L线矩阵里提取出来
a1=(y12-y11)/(x12-x11);%这里用y1=a1*x1+b1,y2=a2*x2+b2,来表示两条线,线段1里a1=(y12-y11)/(x12-x11),b1=y11-x11*a1
b1=y11-x11*a1;
a2=(y22-y21)/(x22-x21);%线段2里 a2=(y22-y21)/(x22-x21),b2=y21-x21*a2;
b2=y21-x21*a2;
xc=(b2-b1)/(a1-a2);%这里xc为两条线段无限长的情况下的相交点的x值, xc=(b2-b1)/(a1-a2)
yc=a1*xc+b1;%这里yc为两条线段无限长的情况下的相交点得y值, yc=a1*xc+b1
if x11>x12%把x11,x12,也就是一个线段上的两个点按照大小排序
s=x11;
x11=x12;
x12=s;
end
if x21>x22%把x21,x22,也就是一个线段上的两个点按照大小排序
s=x21;
x21=x22;
x22=s;
end
if xc-x11>er && x12-xc>er && xc-x21>er && x22-xc>er%通过比较xc与x11,x12,x21,x22的大小关系来判断这个无限长线的交点是否在线段里,
plot(xc,yc,'o')%如果xc同时包含在两个线段里,那么这个点就是交叉点
hold on
mark(i)=i;%第i个线段被标记有交点
mark(l)=l;%第l个线段被标记有交点
end
end
end
nm=0;
Lm=[];
for i=1:si(1)
mark(i);
if mark(i)==0%将没有被标记,也就是没有没有交点的矩阵,记录在Lm矩阵里,并且用红色粗线显示出来
nm=nm+1;
X=[L(i,1) L(i,3)];
Y=[L(i,2) L(i,4)];
line(X,Y,'color','red','LineWidth',2)%画出所有的线
hold on
Lm(nm,:)=[L(i,1) L(i,2) L(i,3) L(i,4)];
end
end
colnames={'没有交点的线段端点1,x','没有交点的线段端点1,y','没有交点的线段端点2,x','没有交点的线段端点2,y'};
t = uitable(Lm, colnames);%用表格把没有相交的线段写出来
Lm
线段和矩形相交,换句话说就是线段上存在至少一个点落在矩阵内部
为了方便推导,把参数约定下:设线段两个点坐标为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&&~(λ21),则线段与矩阵相交。
实际计算中,为了避免数值奇异和判断效率,还需要进一步优化代码。
判断方法比较容易懂,实现要知道这四个点的坐标(Xa,Ya),(Xb,Yb),(Xc,Yc),(Xd,Yd)。
然后得到直线AB的一般表达式f(X,Y)=(Y-Ya)*(Xb-Xa) - (Yb-Ya)*(X-Xa)=0
由于线段CD要跟AB相交,所以将CD两点的坐标代入f(X,Y)所得到的f值相乘小于等于零,所以有f(Xc,Yc)*f(Xd,Yd)<=0,也就是
((Yc-Ya)*(Xb-Xa) - (Yb-Ya)*(Xc-Xa))*((Yd-Ya)*(Xb-Xa) - (Yb-Ya)*(Xd-Xa))<=0
同理得到直线CD的一般表达式g(X,Y)=(Y-Yc)*(Xd-Xc) - (Yd-Yc)*(X-Xc)=0,有
g(Xa,Ya)*g(Xb,Yb)<=0即
((Ya-Yc)*(Xa-Xc) - (Yd-Yc)*(Xb-Xc))*((Yb-Yc)*(Xd-Xc) - (Yd-Yc)*(Xb-Xc))<=0
两个都满足那么就相交。
可以这么判断
if(((Yc-Ya)*(Xb-Xa) - (Yb-Ya)*(Xc-Xa))*((Yd-Ya)*(Xb-Xa) - (Yb-Ya)*(Xd-Xa))<=0&&...
((Ya-Yc)*(Xa-Xc) - (Yd-Yc)*(Xb-Xc))*((Yb-Yc)*(Xd-Xc) - (Yd-Yc)*(Xb-Xc))<=0)
fprintf('线段相交
');
else
fprintf('线段不相交
');
end
例子:
(0,0),(1,1)与(1,0),(0,1)相交的例子
(0,0),(0.5,1)与(2,0),(1,1)不相交例子
matlab 如何判断两线段是否相交?
这个问题可以这样思考:
1、用两点式直线方程求出,AB与CD的方程式
2、用solve函数求解该两个方程组成的方程组
3、用if判断语句来判断是否相交,即
有解的,则相交
无解的,则不相交
求两个线段AB和Cd有无公共交点,如果没有就不相交
贠有星伯: clear all clc n=6 rp=rand(2,n);%生成随机n个点,这里选的5个 y=rp(2,:); x=rp(1,:); L=[]%线矩阵 h=1;%计数器 m=0;%计数;器 er=1e-10%比较误差,后面会解释for i=1:n-1h=h+1;for l= h:nm=m+1;L(m,:)=[x(i) y(i) x(l) y(l)];%将所有的点用线...
贞丰县15691801341: matlab判断线段和矩形是否相交 - ?
贠有星伯: 线段和矩形相交,换句话说就是线段上存在至少一个点落在矩阵内部为了方便推导,把参数约定下:设线段两个点坐标为r1、r2;矩阵中心坐标为r0,两个轴的单位矢量为e1、e2,对应的边长为2a、2b. 线段上任意点可以表示为:r=λr1+(1-λ)r...
贞丰县15691801341: 判断两线段是否相交 - ?
贠有星伯:[答案] 下面的方法是标准算法 : 我们分两步确定两条线段是否相交: (1)快速排斥试验 设以线段 P1P2 为对角线的矩形为R,设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交. (2)跨立试验 如果两线段相交,则两线...
贞丰县15691801341: Matlab如何确定两条线是否有交点 - ?
贠有星伯: 求解思路: 第一步:建立自定义函数文件,tx_fun.m.文件包含两条曲线函数方程. 第二步:用fsolve()函数,求解两条曲线的交点. 第三步:用plot()函数,画出两条曲线 第四步:用text()函数,在两条曲线的交点附近标注交点坐标值
贞丰县15691801341: 如何判断两个线段是不是相交 - ?
贠有星伯: 下面的方法是标准算法 :我们分两步确定两条线段是否相交:(1)快速排斥试验设以线段 p1p2 为对角线的矩形为r, 设以线段 q1q2 为对角线的矩形为t,如果r和t不相交,显然两线段不会相交.(2)跨立试验 如果两线段相交,则两线段...
贞丰县15691801341: matlab怎么判断矩阵的两行相等 - ?
贠有星伯: 可以用isequal函数,相等为1,不相等为0 比如: A=[1 2 3;4 5 6;7 8 9]; B=[1 3 5;4 5 6;4 7 9];isequal(A(2,:),B(2,:))ans = 1
贞丰县15691801341: matlab判断向量组是否线性相关 - ?
贠有星伯: a1=[1,1,3,2]; a2=[-1,1,-3,2]; a3=[5,-2,8,9]; a4=[-1,3,1,7]; A=[a1;a2;a3;a4] A 为方阵,求A的行列式det(A),如果行列式等于0,则说明这几个个向量是线性相关,否则,就是线性无关 若A不为方阵,就要用到求rref函数了化为最简型,最后一行不全为零,说明它们是相线无关的,如果最后一行全为零,说明它们为相线相关的. rref(A) det(A)A = 1 1 3 2-1 1 -3 25 -2 8 9-1 3 1 7ans = 1 0 0 00 1 0 00 0 1 00 0 0 1ans = -118
贞丰县15691801341: 怎样判断两线段是否相交通俗易懂点哈、有没有公式什么的..最好有.谢. - ?
贠有星伯:[答案] 先通过取点设置两条直线的公式,再通过公式求公共集,如果没有解,则说明没有公共点,也就是不相交,反之,则相交!
贞丰县15691801341: matlab 如何判断矩阵两行或者两列是否相等?
贠有星伯: 为什么不换个思路呢.... while norm(zx(:,1)-zy(:,1))>0
贞丰县15691801341: 如何在平面上判断某条线段与一正方形相交? - ?
贠有星伯: 先解出两条直线的方程 判断有没有交点,即解方程,看有没有解.再判断交点在不在线段的取值范围.如线段的两点坐标(1,9) (11,23) 解得点坐标(12,y) 此点就不在线段上 如(10, y) 就在上面