Search code examples
pythonuser-input

How can I set values from user input in a class and use them in a second class?


I am working on a python code that has 2 options. Make calculations for distance and area from user input or make the calculations from default point values. For default point values, I got the code working. Nevertheless, I cannot get it to work for when user inputs the points. I currently read the inputs fine, but I cannot get to use them on the 2nd and 3rd class (Polyline and Polygon)

import math

#Point class
class Point():
    def __init__(self):
        self.x = 0
        self.y = 0
    def setXY(self,x,y):
        self.x = x
        self.y = y

#Class instantiation
p1 = Point()
p2 = Point()
p3 = Point()

val = 0

print("\n----Please select from the following options:----")
print("Enter 1 to set your point coordinates")
print("Enter 2 to use default point coordinates\n")

val = int(input("Enter your value: "))
if val == 1:
    #Set point values for P1
    p1_x = int(input("Enter x value for P1: "))
    p1_y = int(input("Enter y value for P1: "))
    #Set point values for P2
    p2_x = int(input("Enter x value for P2: "))
    p2_y = int(input("Enter y value for P2: "))
    #Set point values for P3
    p3_x = int(input("Enter x value for P3: "))
    p3_y = int(input("Enter y value for P3: "))
    #Set point values
    p1.setXY(p1_x,p1_y)
    p2.setXY(p2_x,p2_y)
    p3.setXY(p3_x,p3_y)
    #Print points values
    print("Location of point P1 is: (",p1.x,",",p1.y,")")
    print("Location of point P2 is: (",p2.x,",",p2.y,")")
    print("Location of point P3 is: (",p3.x,",",p3.y,")")
    print("\n")

    #Polyline class
    class Polyline():
        def __init__(self):
            self.x = 0
            self.y = 0
        def setXY(self,x,y):
            self.x = x
            self.y = y

    #getLength() method for distance calculation
    #Distance formula: root square of[(x2-x1)^2 + (y2-y1)^2]
        def getLength(self, p):
            return math.sqrt((self.x-p.x)**2+(self.y-p.y)**2)

    #Class instantiation
    p1 = Polyline()
    p2 = Polyline()
    p3 = Polyline()
    #Set point values
    print("Location of point P1 is: (",p1.x,",",p1.y,")")
    p1.setXY(p1.x,p1.y)
    p2.setXY(p2.x,p2.y)
    p3.setXY(p3.x,p3.y)
    #Creating variables and setting their value to their respective distance
    resultPoint1_2 = p1.getLength(p2)
    resultPoint2_3 = p2.getLength(p3)
    resultPoint1_3 = p1.getLength(p3)
    #Print distance values
    print("Length of the perimeter from P1 to P2 is: ", resultPoint1_2)
    print("Length of the perimeter from P2 to P3 is: ", resultPoint2_3)
    print("Length of the perimeter from P1 to P3 is: ", resultPoint1_3)
    print("\n")

    #Polygon class
    class Polygon():
        def __init__(self):
            self.x = 0
            self.y = 0
        def setXY(self,x,y):
            self.x = x
            self.y = y

    #getLength() method for distance calculation
    #Distance formula: root square of[(x2-x1)^2 + (y2-y1)^2]
        def getLength(self, p):
            return math.sqrt((self.x-p.x)**2+(self.y-p.y)**2)

    #Class instantiation
    p1 = Polygon()
    p2 = Polygon()
    p3 = Polygon()
    #Set point values
    p1.setXY(p1_x,p1_y)
    p2.setXY(p2_x,p2_y)
    p3.setXY(p3_x,p3_y)
    #Creating variables and setting their value to their respective distance
    resultPoint1_2 = p1.getLength(p2)
    resultPoint2_3 = p2.getLength(p3)
    resultPoint1_3 = p1.getLength(p3)
    #Creating perimeter variable and setting its value according to the formula
    #Perimeter formula for 3 points polygon: length1 + length2 + length3
    perimeter = resultPoint1_2 + resultPoint2_3 + resultPoint1_3
    #Print perimeter value
    print("Perimeter of the polygon is: ", perimeter)
    print("\n")

Current output when input 3 for x and y values on all points:

Location of point P1 is: ( 3 , 3 )
Location of point P2 is: ( 3 , 3 )
Location of point P3 is: ( 3 , 3 )


Location of point P1 is: ( 0 , 0 )
Length of the perimeter from P1 to P2 is:  0.0
Length of the perimeter from P2 to P3 is:  0.0
Length of the perimeter from P1 to P3 is:  0.0


Perimeter of the polygon is:  0.0

As you can see, the 2nd and 3er class are not utilizing the values set on the first class.


Solution

  • You need to use different variables for the points, polylines, and polygons. Otherwise, when you write something like

    p1.setXY(p1.x, p1.y)
    

    this is getting p1.x and p1.y from the Polygon that you're trying to update, not the Point that you created earlier.

    In the code below, p1, p2, p3 are Points, pl1, pl2, pl3 are Polylines, and pg1, pg2, pg3 are Polygons.

    import math
    
    #Point class
    class Point():
        def __init__(self):
            self.x = 0
            self.y = 0
        def setXY(self,x,y):
            self.x = x
            self.y = y
    
    #Class instantiation
    p1 = Point()
    p2 = Point()
    p3 = Point()
    
    val = 0
    
    print("\n----Please select from the following options:----")
    print("Enter 1 to set your point coordinates")
    print("Enter 2 to use default point coordinates\n")
    
    val = int(input("Enter your value: "))
    if val == 1:
        #Set point values for P1
        p1_x = int(input("Enter x value for P1: "))
        p1_y = int(input("Enter y value for P1: "))
        #Set point values for P2
        p2_x = int(input("Enter x value for P2: "))
        p2_y = int(input("Enter y value for P2: "))
        #Set point values for P3
        p3_x = int(input("Enter x value for P3: "))
        p3_y = int(input("Enter y value for P3: "))
        #Set point values
        p1.setXY(p1_x,p1_y)
        p2.setXY(p2_x,p2_y)
        p3.setXY(p3_x,p3_y)
        #Print points values
        print("Location of point P1 is: (",p1.x,",",p1.y,")")
        print("Location of point P2 is: (",p2.x,",",p2.y,")")
        print("Location of point P3 is: (",p3.x,",",p3.y,")")
        print("\n")
    
        #Polyline class
        class Polyline():
            def __init__(self):
                self.x = 0
                self.y = 0
            def setXY(self,x,y):
                self.x = x
                self.y = y
    
        #getLength() method for distance calculation
        #Distance formula: root square of[(x2-x1)^2 + (y2-y1)^2]
            def getLength(self, p):
                return math.sqrt((self.x-p.x)**2+(self.y-p.y)**2)
    
        #Class instantiation
        pl1 = Polyline()
        pl2 = Polyline()
        pl3 = Polyline()
        #Set point values
        print("Location of point P1 is: (",p1.x,",",p1.y,")")
        pl1.setXY(p1.x,p1.y)
        pl2.setXY(p2.x,p2.y)
        pl3.setXY(p3.x,p3.y)
        #Creating variables and setting their value to their respective distance
        resultPoint1_2 = pl1.getLength(p2)
        resultPoint2_3 = pl2.getLength(p3)
        resultPoint1_3 = pl1.getLength(p3)
        #Print distance values
        print("Length of the perimeter from P1 to P2 is: ", resultPoint1_2)
        print("Length of the perimeter from P2 to P3 is: ", resultPoint2_3)
        print("Length of the perimeter from P1 to P3 is: ", resultPoint1_3)
        print("\n")
    
        #Polygon class
        class Polygon():
            def __init__(self):
                self.x = 0
                self.y = 0
            def setXY(self,x,y):
                self.x = x
                self.y = y
    
        #getLength() method for distance calculation
        #Distance formula: root square of[(x2-x1)^2 + (y2-y1)^2]
            def getLength(self, p):
                return math.sqrt((self.x-p.x)**2+(self.y-p.y)**2)
    
        #Class instantiation
        pg1 = Polygon()
        pg2 = Polygon()
        pg3 = Polygon()
        #Set point values
        pg1.setXY(p1_x,p1_y)
        pg2.setXY(p2_x,p2_y)
        pg3.setXY(p3_x,p3_y)
        #Creating variables and setting their value to their respective distance
        resultPoint1_2 = pg1.getLength(p2)
        resultPoint2_3 = pg2.getLength(p3)
        resultPoint1_3 = pg1.getLength(p3)
        #Creating perimeter variable and setting its value according to the formula
        #Perimeter formula for 3 points polygon: length1 + length2 + length3
        perimeter = resultPoint1_2 + resultPoint2_3 + resultPoint1_3
        #Print perimeter value
        print("Perimeter of the polygon is: ", perimeter)
        print("\n")