[Tutor] line class

Christopher Spears cspears2002 at yahoo.com
Tue Jul 8 06:52:28 CEST 2008


For problem 13-6 out of Core Python Programming, I created a line class that consists of two points.  The line class has the following methods: __repr__, length, and slope.  Here is the code:

#!/usr/bin/python

import sys,math

class Point(object):
    def __init__(self, x=0.0,y=0.0):
        self.x = float(x)
	self.y = float(y)
	
    def __repr__(self):
        coord = (self.x,self.y)
	return coord
	
    def __str__(self):
	point_str = "(%f,%f)" % (self.x, self.y)
	return point_str
	
class Line(object):
    def __init__(self, p1, p2):
        self.p1 = Point(x1,y1)
	self.p2 = Point(x2,y2)
	
    def __str__(self):
        x1,y1 = self.p1.x,self.p1.y
	x2,y2 = self.p2.x,self.p2.y
	line = "((%f,%f),(%f,%f))" % (x1,y1,x2,y2)
	return line
     
    __repr__ = __str__
    
    def length(self):
        dist_x = abs(self.p2.x - self.p1.x)
	dist_y = abs(self.p2.y - self.p1.y)
        dist_x_squared = dist_x ** 2
        dist_y_squared = dist_y ** 2
	line_length = math.sqrt(dist_x_squared + dist_y_squared)
        return line_length
	
    def slope(self):
        dist_y = self.p2.y - self.p1.y
	dist_x = self.p2.x - self.p1.x
	line_slope = dist_y/dist_x
	return line_slope
	
if __name__ == '__main__':
    print "Creating a Line"
    
    x1 = raw_input("Enter a x1 value: ")
    y1 = raw_input("Enter a y1 value: ")
    p1 = Point(x1,y1)
    #print p1
    
    x2 = raw_input("Enter a x2 value: ")
    y2 = raw_input("Enter a y2 value: ")
    p2 = Point(x2,y2)
    #print p2
    
    line = Line(p1,p2)
    
    print "What are the lines attributes?"
    print "Select one:"
    print "1) Display line"
    print "2) Display line's length"
    print "3) Display line's slope"
    print "4) Quit program"
    choice_string = raw_input("Make a choice: ")
    
    try:
        choice = int(choice_string)
    except ValueError:
        sys.exit("Not an integer!  Goodbye!")
    
    if choice == 1:
        print line
    elif choice == 2:
        line_length = line.length()
        print "Length is %f " % line_length
    elif choice == 3:
        line_slope = line.slope()
        print "Slope is %f " % line_slope
    elif choice == 4:
        print "Goodbye!"
    else:
        sys.exit("Wrong response Goodbye!")

For the most part, my script works fairly well except under the following circumstances:

Creating a Line
Enter a x1 value: 0
Enter a y1 value: 0
Enter a x2 value: 0
Enter a y2 value: 1
What are the lines attributes?
Select one:
1) Display line
2) Display line's length
3) Display line's slope
4) Quit program
Make a choice: 3
Traceback (most recent call last):
  File "line.py", line 79, in ?
    line_slope = line.slope()
  File "line.py", line 42, in slope
    line_slope = dist_y/dist_x
ZeroDivisionError: float division

Basically, if the two the x values are the same, I will get a ZeroDivisionError.  A line in this case would simply point straight up.  What would slope be in this case?  I will admit that this is probably a math problem not a programming one, but I decided to run it by you anyway.

Thanks.


      


More information about the Tutor mailing list