matlab大规模交叉节点判断

来源:互联网 发布:笔记软件 编辑:程序博客网 时间:2024/06/03 16:29

Q:给出所有点连接关系(矩阵形式)及节点坐标,找出所有交叉节点

idea:

1缩小范围

四点判断(a-b,c-d),排除①a和b的经度(纬度)最大值<c和d的经度(纬度)最小值②a和b的经度(纬度)最小值>c和d的经度(纬度)最大值的情况

basic knowledge:经度东>西,纬度北>南

如图,经度:max(a,b)<min(c,d),不可能相交

2.利用两边斜率排除平行状况

3.求解方程组,得出交点坐标

https://wenku.baidu.com/view/9e769d1dc5da50e2524d7f21.html

4.判断交点在四点中心范围(利用经纬度),便记录下来

复制代码
 1 %% 寻找没名字的交叉点 输入矩阵 名字 坐标    输出 矩阵 名字 坐标 2 %crosss 序号一-序号二 序号三-序号四 在矩阵中j位置 在矩阵中i位置 3 % juzhen:direction 4 % lon_lat:node's coordinate 5 function [lon_lat_new,crosss]=findcrossbilibili(juzhen,lon_lat) 6 %% matrix to list:num x1 y1 x2 y2 7 count=0; 8 for i1=1:size(juzhen,1) 9     for i2=1:size(juzhen,2)10         if juzhen(i1,i2)==111             count=count+1;12             num(count,1)=i1;13             num(count,2)=i2;14         end15     end16 end17 % edge1:x1,y1  edge2:x2,y218 for i=1:size(num,1)19     x1(i,1)=lon_lat(num(i,1),1);20     y1(i,1)=lon_lat(num(i,1),2);21     x2(i,1)=lon_lat(num(i,2),1);22     y2(i,1)=lon_lat(num(i,2),2);23 end24 %% itself circle itself25 count=0;26 for j=1:size(x1,1)-127     for i=1+j:size(x1,1)28         % shrink hunting zone29         if (min(x1(j,1),x2(j,1))>max(x1(i,1),x2(i,1)))||(max(x1(j,1),x2(j,1))<min(x1(i,1),x2(i,1)))||(min(y1(j,1),y2(j,1))>max(y1(i,1),y2(i,1)))||(max(y1(j,1),y2(j,1))<min(y1(i,1),y2(i,1)))30             % exclude the situation that one node of two edges31         elseif ((x1(j,1)==x1(i,1))&&(y1(j,1)==y1(i,1)))||((x1(j,1)==x2(i,1))&&(y1(j,1)==y2(i,1)))||((x2(j,1)==x1(i,1))&&(y2(j,1)==y1(i,1)))||((x2(j,1)==x2(i,1))&&(y2(j,1)==y2(i,1)))32         else33             k1=(y2(i,1)-y1(i,1))/(x2(i,1)-x1(i,1));34             k2=(y2(j,1)-y1(j,1))/(x2(j,1)-x1(j,1));35             % exclude equal slope36             if k1~=k237                 % slove cross node's coordinate38                 A=[k1,-1;k2,-1];39                 b=[k1*x1(i,1)-y1(i,1);k2*x1(j,1)-y1(j,1)];40                 Jie=inv(A)*b;41                 % confirm cross node in the middle of four nodes again????42                 if ((Jie(1,1)<max(x1(i,1),x2(i,1))&&Jie(1,1)>min(x1(i,1),x2(i,1)))&&(Jie(1,1)<max(x1(j,1),x2(j,1))&&Jie(1,1)>min(x1(j,1),x2(j,1))))&&((Jie(2,1)<max(y1(i,1),y2(i,1))&&Jie(2,1)>min(y1(i,1),y2(i,1)))&&(Jie(2,1)<max(y1(j,1),y2(j,1))&&Jie(2,1)>min(y1(j,1),y2(j,1))))43                     count=count+1;44                     lon_lat_new(count,1)=Jie(1,1);% new cross coordinate45                     lon_lat_new(count,2)=Jie(2,1);46                     % record cross node's cross edge to checkout47                     crosss(count,1)=num(j,1);% four cross nodes48                     crosss(count,2)=num(j,2);49                     crosss(count,3)=num(i,1);50                     crosss(count,4)=num(i,2);51                     crosss(count,5)=j;52                     crosss(count,6)=i;53                 end54             end55         end56     end57 end58 end