Formula derivation
The Standard equation of a line is a way to represent a 2D line with the following form: $Ax+By=C$Given two cartesian coordinates in the 2D space, one can calculate the line that intersects both points $(x_1, y_1)$ and $(x_2, y_2)$. To derivate the coefficients A, B and C of the standard equation, I will start with the equation of a straight line that intersects the point $(x_1, y_1)$ and has a slope $m$:
$y - y_1 = m(x - x_1)$ (eq. 1).
The problem with this representation is that the slope $m$ is defined as the change in 'y' with respect to the change in 'x' as $m=\frac{\Delta Y}{\Delta X}=\frac{y_2 - y_1}{x_2 - x_1}$. In the case of vertical lines $x_2 - x_1=0$ and that would undefine the slope for them.
With this context, let us find a more generic representation that can handle vertical lines. Given (eq. 1) we have the following:
$y - y_1 = mx - mx_1$(eq. 2)
$y - mx = y_1 - mx_1$(eq. 3)
The magic trick is to assign A and B as the numerator and denominator of the slope:
$m = \frac{y_2 - y_1}{x_2 - x_1} = \frac{-A}{B}$ (eq. 4)
Then, substitute (eq. 4) in (eq. 3) and do some algebra:
$y - \left( \frac{-A}{B}\right)x = y_1 - \left( \frac{-A}{B}\right)x_1$
$\frac{A}{B}x + y = y_1 + \frac{A}{B}x_1$
$Ax + By = B(y_1 + \frac{A}{B}x_1)$
$Ax + By = By_1 + Ax_1$
Finally, if we rename the right hand side of the equation, the constant side, $C$, we'll have:
$Ax + By = C$
For the constants:
$A = y_1 - y_2$
$B = x_2 - x_1$
$C = Ax_1 + By_1$
Python 3.4 code
# Standard Form of a line Ax + By = C
#-------------------------------
# inputs: Two 2D points in the format: x-value, y-value
# output: The standard form equation of the line
# that passes through those points
# by IF, 9.16.2014
#-------------------------------
import unittest
# GLOBAL VARIABLES
#----------------------
answer = 'y'
err = 0;
# FUNCTIONS
#----------------------
def printAnswer():
print('')
if (B >= 0):
print(str(round(A,2)) + "x+" + str(round(B,2)) + "y" " = " + str(round(C,2)))
if (B < 0):
print(str(round(A,2)) + "x" + str(round(B,2)) + "y" " = " + str(round(C,2)))
print('')
def parseCoords(p):
global err
# split by comma
coordList = p.split(',')
# validate for 2D coordinates
if (len(coordList) != 2):
err = 2
return
# validate numeric input
try:
x = float(coordList[0])
except ValueError:
x = 0
err = 1
try:
y = float(coordList[1])
except ValueError:
y = 0
err = 1
return x, y, err
# From http://stackoverflow.com/questions/11175131/code-for-greatest-common-divisor-in-python
def GCD(a, b):
if b == 0:
return a
else:
return GCD(b, a % b)
def simplifyEq(a,b,c):
# check if they are all integers
global A, B, C
if ( a%1 == 0 and b%1 == 0 and c%1 == 0):
a = int(a)
b = int(b)
c = int(c)
gcd = GCD(a,GCD(b,c))
if (gcd <= 1):
return
else:
A = A/gcd;
B = B/gcd;
C = C/gcd;
return
# ------------------
# MAIN FUNCTION
#-------------------
while(answer == 'y'):
# read input from user
p = input("Enter 1st point in the format x1,y1: ")
p = parseCoords(p)
if(err == 1):
print("Error 1: Values must be numbers separated by a comma")
print("Format: x,y")
elif(err == 2):
print("Error 2: Only two values are accepted")
print("Format: x,y")
else:
x1 = p[0]
y1 = p[1]
p = input("Enter 2nd point in the format x2,y2: ")
p = parseCoords(p)
if(err == 1):
print("Error 1: Values must be numbers separated by a comma")
print("Format: x,y")
elif(err == 2):
print("Error 2: Only two values are accepted")
print("Format: x,y")
else:
x2 = p[0]
y2 = p[1]
# For the derivation go to:http://howdidisolvedit.blogspot.ca/2014/09/standard-form-of-line-given-2-points.html
A = y1 - y2
B = x2 - x1
C = A*x1 + B*y1
# can the coefficients be simplified?
simplifyEq(A,B,C)
printAnswer()
answer = input("Test again? [y/n]: ")
if (answer == 'y'):
err = 0
# TESTING
# --------------------
class MyTest(unittest.TestCase):
def test_GCD(self):
self.assertEqual(GCD(144,12),12)
def test_simplifyEq(self):
raised = False
try:
simplifyEq(0,0,0)
except:
raised = True
self.assertFalse(raised, 'Exception rised')
if __name__ == '__main__':
unittest.main()
Upload of python and Google App Engine
http://stdlines.appspot.com/Further info on Python + Google App Engine. Uploaded by Stefano Locati:
https://www.youtube.com/watch?v=j7OQZp2S5pY
No hay comentarios:
Publicar un comentario