line_resid

This page probably falls into the overkill category, but it demonstrates a number of useful things. As ilustrated in the figure below, line_resid compute the normal distance from a point (Xo,Yo) to a line having the equation y=ax+b. To run this simple demo routine:

 
% line_resid.sh 1.3 2.5  2.0 -3.5 
% line_resid_plot.py  
% display line_resid.png  

Usage: line_resid 1.05 0.05 3.0 2.0       
arg1 - line slope, a (where y=ax+b)       
arg2 - line Y-intercept, b (where y=ax+b) 
arg3 - Xo (x position of residual point)  
arg4 - Yo (y position of residual point)  


The blue line represents the input line (y=ax+b). The green point is (Xo,Yo), the point for which we want to compute the perpendicular distance (residual) to the line. Here is how I made and inspected this plot:
% line_resid.sh 1.3 2.5  2.0 -3.5 
% line_resid_plot.py  
% display line_resid.png  

Actually I will rarely use line_resid in practice. The routine that preforms the work, and is used in various OTW routines, is in OTWLIB:line_subs/xyline_res.f, and typical call would be something like:

      call xyline_res(a,b,xo,yo,databack,log)
where the "answers" are returned in databack:

c**************************************************************************
      dimension databack(20)
c Derive line equation for perpendicular residual segment.
c databack(1) = residual
c databack(2) = alpha, slope of residual segment line
c databack(3) = beta,  y-int of residual segment line
c databack(4) = xlo, x of line-residual intersection
c databack(5) = ylo, y of line-residual intersection
c databack(6) = xo, x of point for which residual is computed
c databack(7) = yo, y of point for which residual is computed

Continuing in the spirit of overkill, I show the simple python plotting code that I use to make the figure above. The code is:

 
 .../otw/src/line_resid/plot_py/line_resid_plot.py.
The source code is shown below:
 
 
#!/usr/bin/python
print "\nUsage: line_resid_plot.py\n" 
   
# Setup to read the name of the input file 
from sys import argv
script_name = argv

# Numpy is a library for handling arrays (like data points)
import numpy as npsubs

# Pyplot is a module within the matplotlib library for plotting
import matplotlib.pyplot as plt

#==================================================
# Open the files for read-only 
f = open('line1.dat', 'r')
# initialize some variable to be lists:
x1 = []
y1 = []
n1 = 0 
i = 0
while True:
 if i < 20:
   line = f.readline() 
   p = line.split()
   x1.append(float(p[0]))  
   y1.append(float(p[1]))
 else:
   break
 i=i+1
n1 = i 
f.close() 
#==================================================

#==================================================
# Read the line2.dat file 
f2 = open('line2.dat', 'r')
x2 = []
y2 = []
n2 = 0
for line in f2:
    p = line.split()
    x2.append(float(p[0]))  
    y2.append(float(p[1]))
    n2 = n2+1
f2.close() 
#==================================================

# Create the numpy arrays 
xv1 = npsubs.array(x1)
yv1 = npsubs.array(y1)

###################################################
# Set the physical size 
xpsize = 7.5 
ypsize = 7.5 
###################################################

#===========================================================
# Plot the input line (line1) data 
fig = plt.figure(figsize = (xpsize,ypsize))

# Set up the axes 
xlo="-10"
xhi="+10"
ylo=xlo
yhi=xhi
xlim1 = float(xlo)  
xlim2 = float(xhi) 
ylim1 = float(ylo) 
ylim2 = float(yhi) 
plt.xlim(xlim1,xlim2)
plt.ylim(ylim1,ylim2)

# Plot the data 
plt.scatter(x2[0], y2[0], s=30, facecolor="green", edgecolor="red", label="Res Point") 

# Plot the input line 
plt.plot(x1, y1, c='blue', linestyle='-', label='Input Line') 

# Plot the residual line 
plt.plot(x2, y2, c='red', linestyle='-', label='Res Line') 

# add some fancy touches 
plt.grid(True) 
plt.legend() 

# label the axes 
plt.title("line_resid plot")
plt.xlabel("X")
plt.ylabel("Y")

#plt.show()
plt.savefig('line_resid.png')
print '\nUse to view your plot:\ndisplay line_resid.png\n'
#===========================================================

 
Notice that the plot limits and the axis labeling are hard coded. As this is just a demo code, I just don't give a shit.




Back to SCO CODES page