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)==1 11 count=count+1; 12 num(count,1)=i1; 13 num(count,2)=i2; 14 end 15 end 16 end 17 % edge1:x1,y1 edge2:x2,y2 18 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 end 24 %% itself circle itself 25 count=0; 26 for j=1:size(x1,1)-1 27 for i=1+j:size(x1,1) 28 % shrink hunting zone 29 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 edges 31 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 else 33 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 slope 36 if k1~=k2 37 % slove cross node's coordinate 38 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 coordinate 45 lon_lat_new(count,2)=Jie(2,1); 46 % record cross node's cross edge to checkout 47 crosss(count,1)=num(j,1);% four cross nodes 48 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 end 54 end 55 end 56 end 57 end 58 end