Source code for issm.SegIntersect

import numpy as np

[docs]def SegIntersect(seg1,seg2): """ SEGINTERSECT - test of segments intersection return 1 if the two segments intersect seg1=[x1 y1; x2 y2] seg2=[x1 y1; x2 y2] Usage: bval=SegIntersect(seg1,seg2) """ bval=1 xA=seg1[0,0] yA=seg1[0,1] xB=seg1[1,0] yB=seg1[1,1] xC=seg2[0,0] yC=seg2[0,1] xD=seg2[1,0] yD=seg2[1,1] O2A=np.array([xA,yA])-np.array([xD/2.+xC/2.,yD/2.+yC/2.]) O2B=np.array([xB,yB])-np.array([xD/2.+xC/2.,yD/2.+yC/2.]) O1C=np.array([xC,yC])-np.array([xA/2.+xB/2.,yB/2.+yA/2.]) O1D=np.array([xD,yD])-np.array([xA/2.+xB/2.,yB/2.+yA/2.]) n1=np.array([yA-yB,xB-xA]) #normal vector to segA n2=np.array([yC-yD,xD-xC]) #normal vector to segB test1=np.dot(n2,O2A) test2=np.dot(n2,O2B) if test1*test2>0: bval=0 return bval test3=np.dot(n1,O1C) test4=np.dot(n1,O1D) if test3*test4>0: bval=0 return bval #if colinear if test1*test2==0 and test3*test4==0 and np.linalg.det(np.hstack((n1.reshape((-1,)),n2.reshape(-1,))))==0: #projection on the axis O1O2 O2O1=np.array([xA/2.+xB/2.,yB/2.+yA/2.])-np.array([xD/2.+xC/2.,yD/2.+yC/2.]) O1A=np.dot(O2O1,(O2A-O2O1)) O1B=np.dot(O2O1,(O2B-O2O1)) O1C=np.dot(O2O1,O1C) O1D=np.dot(O2O1,O1D) #test if one point is included in the other segment (->bval=1) if (O1C-O1A)*(O1D-O1A)<0: bval=1 return bval if (O1C-O1B)*(O1D-O1B)<0: bval=1 return bval if (O1A-O1C)*(O1B-O1C)<0: bval=1 return bval if (O1A-O1D)*(O1B-O1D)<0: bval=1 return bval #test if the 2 segments have the same middle (->bval=1) if O2O1==0: bval=1 return bval #else bval=0 return bval return bval