“Python” How to Calculate Intersection Coordinate of Two Lines

Python
higashi
higashi

Hi, I’m higashi.

 

This time, I introduce how to calculate the intersection coordinate of designated two lines as shown below.

Illustration of calculate intersection coordinates

Just you have to do is designating the start and end points coordinate of two lines.

 

So, let’s get started!!

 

Sponsored Links

Illustration of How to Calculate the Intersection Coordinate

I illustrate how to calculate the intersection coordinate.

 

It is very simple method.

At first, set two arbitrary point on each line respectively.

And calculate the distance of two points as shown below.

how to calculate the intersection coordinates

By calculating the distance towards various combinations, find the minimum distance point.

how to calculate the intersection coordinates

At the minimum distance points, coordinates of P & Q is coincide and it means the intersection coordinates.

 

I conduct this process by using python.

 

Sponsored Links

Introduction of Two Lines

Two lines is need for calculating above method, so at first, let’s designate the coordinates that consist two lines.

 

I designate the below coordinates.

a=[1,2]
b=[4,8]
c=[1,7]
d=[7,2]

It is like described on graph as shown below.

graph image of two lines

It is clear the intersection point exist on while X=2~3 and Y=5~6.

 

Sponsored Links

Sample Program of Calculating Intersection Coordinates

So much for the preface, let’s describe the program.

#import library
import numpy as np

#designate the coordinates of two lines.
a=[1,2]
b=[4,8]
c=[1,7]
d=[7,2]
#set the vector of two lines
line1=[a,b]
line2=[c,d]
a,b=line1[0],line1[1]
c,d=line2[0],line2[1]
ABbec=np.array([b[0]-a[0],b[1]-a[1]])
CDbec=np.array([d[0]-c[0],d[1]-c[1]])

#function of calculate two point distance
def calc_distance(s,t):
    PQbec=(c+CDbec*s)-(a+ABbec*t)
    distance=np.linalg.norm(PQbec)
    return distance
#function of calculate point coordinates
def calc_pos(s,t):
    Qpos=(c+CDbec*s)
    Ppos=(a+ABbec*t)
    return Ppos,Qpos
    
#function of searching minimun distance
def make_map(ss,tt):
    z_list=[]
    ij_list=[]
    st_list=[]
    for i in range(len(ss)):
        for j in range(len(tt)):
            s,t=ss[i],tt[j]
            z=calc_distance(s,t)
            z_list.append(z)
            ij_list.append([i,j])
            st_list.append([s,t])
    return z_list,ij_list,st_list

#explore a large area
ini_max=2000
ini_min=-2000
delta=200
num_search=7
ss=np.linspace(ini_min,ini_max,delta)
tt=np.linspace(ini_min,ini_max,delta)
z,ij,st=make_map(ss,tt)
min_val=np.amin(np.array(z))
min_index=z.index(min_val)

#explore a neighborhood area of goal
minz_list=[]
for k in range(num_search):
    i,j=ij[min_index][0],ij[min_index][1]
    smax,smin=min(ss[i+2],ini_max),max(ss[i-2],ini_min)
    tmax,tmin=min(tt[j+2],ini_max),max(tt[j-2],ini_min)
    ss=np.linspace(smin,smax,delta)
    tt=np.linspace(tmin,tmax,delta)
    z,ij,st=make_map(ss,tt)
    min_val=np.amin(np.array(z))
    min_index=z.index(min_val)
    minz_list.append(min_val)
    Ppos,Qpos=calc_pos(st[min_index][0],st[min_index][1])
print('Ppos=')
print(Ppos)
print('Qpos=')
print(Qpos)
print('mean_pos=')
print((Qpos+Ppos)/2)

 

As I mentioned before, calculation is conducted exploratory in this method.

So, you should set the explore area first.

It is designated  at “ini_max” and “ini_min” at middle of program.

And fineness and repeated number of exploration is designated at “delta” and “num_search”.

 

These four values should set appropriately.

Too large value can search correctly, but calculation time will longer.

Please adjust to suit your situation.

 

Sponsored Links

Result of Sample Program

Finally, let’s conduct the program shown above.

Below result wad shown.

Result of sample program

This “mean_pos” is intersection coordinate.

Let’s compare the graph image.

graph image of two lines

The coordinate of program result is almost match above image.

 

higashi
higashi

I think this program is no problem.

 

That’s all. Thank you!!

コメント