## Instructions

**Objective**

## Requirements and Specifications

**Source Code
**

CONV POLY

from SimplePoly import *

class ConvPoly(SimplePoly):

def __init__(self, *vertices):

vertices = list(vertices)

# Check that the vertices form a convex polygon

# Check that all points are to the left of the other

# Create a copy of the vertices

verts_copy = vertices.copy()

# Append the first point at the end

verts_copy.append(vertices[0])

for i in range(len(verts_copy)-2):

p = verts_copy[i]

q = verts_copy[i+1]

r = verts_copy[i+2]

# If the point does not lies to the left of q and r, then the polygon is not convex

if not r.left_of(p,q):

raise Exception

# If we reach this line it is because the given vertices form a convex polygon

super().__init__(*vertices)

EQUILATERAL TRIANGLE

from ConvPoly import *

from Point import *

class EquiTriangle(ConvPoly):

def __init__(self, length):

self.length = length

# We define the first vertex which is the origin

vertices = [Point(0,0)]

# Now, we take the next point to the right of the origin with a length l

vertices.append(Point(length, 0))

# The third point is found by taking the previous point and rotating it 60 degrees

p = Point(vertices[1].x, vertices[1].y)

p.rotate(60)

vertices.append(p)

# Now, call the parent constructor

super().__init__(*vertices)

def area(self):

"""

This function calculates the area of an equilateral triangle

:return: area

"""

return (np.sqrt(3)/4.0)*self.length**2

POINTS

import numpy as np

class Point:

def __init__(self, x: float = 0, y: float = 0):

self.x = x

self.y = y

def translate(self, s: float, t: float):

"""

Translates the x point by 's' units and the y point by 't' units

:param s: x translation

:param t: y translation

:return:

"""

self.x += s

self.y += t

def rotate(self, degree):

"""

Rotates the point counter-clockwise direction by the given degrees

:param degree: degrees

:return:

"""

# Conver the degrees to radians

rad = degree*np.pi/180.0

# Rotate

newX = self.x*np.cos(rad) - self.y*np.sin(rad)

newY = self.x*np.sin(rad) + self.y*np.cos(rad)

self.x = newX

self.y = newY

def distance(self, other):

"""

Computes the distance to another point

:param other: Point object

:return: distance

"""

return np.sqrt((self.x - other.x)**2 + (self.y - other.y)**2)

def left_of(self, q, r):

# p is the point we want to check if it lies to the left of qr

px = self.x

py = self.y

rx = r.x

ry = r.y

qx = q.x

qy = q.y

return (rx*py - px*ry) + (qx*ry - qx*py) + (qy*px - qy*rx) > 0

def right_of(self, q, r):

# p is the point we want to check if it lies to the right of qr

px = self.x

py = self.y

rx = r.x

ry = r.y

qx = q.x

qy = q.y

return (rx * py - px * ry) + (qx * ry - qx * py) + (qy * px - qy * rx) < 0

def __str__(self):

return "({:.2f}, {:.2f})".format(self.x, self.y)

def __repr__(self):

return "Point with coordinates ({:.2f}, {:.2f})".format(self.x, self.y)

RECTANGLE

from ConvPoly import *

from Point import *

class Rectangle(ConvPoly):

def __init__(self, length, width):

self.length = length

self.width = width

# Create the first vertex at the origin

p0 = Point(0,0)

# Second vertex at the right of origin

p1 = Point(length, 0)

# Third vertex at the top of p1

p2 = Point(length, width)

# Fourth vertex at the top of the origin

p3 = Point(0, width)

vertices = [p0, p1, p2, p3]

# Call parent constructor

super().__init__(*vertices)

def area(self):

"""

Returns the area of a rectangle

:return: area

"""

return self.width*self.length

SQUARE

from Rectangle import *

from Point import *

class Square(Rectangle):

def __init__(self, length):

# Call Rectangle constructor

super().__init__(length, length)

TEST POLY

from polys import *

if __name__ == "__main__":

print("\n*********************************************")

print("Running test module for Problem 1, Homework 6")

print("*********************************************")

p1 = Point(1, 1)

p2 = Point(3, 0)

p3 = Point(4, 1)

p4 = Point(3, 3)

p5 = Point(2, 3)

print("---------Testing the Point class---------\n")

print("p1: ", p1)

print("p2: ", p2)

print("Distance b/w p1 and p2: ", p1.distance(p2))

p1.rotate(45)

print("p1 rotated by 45 degrees: ", p1)

p1.rotate(-45)

print("p1 rotated by -45 degrees: ", p1)

p2.translate(-2, 3)

print("p2 translated by (-2, 3): ", p2)

p2.translate(2, -3)

print("p2 translated back by (2, -3): ", p2)

print()

print("---------Testing the SimplePoly class---------\n")

S = SimplePoly(p2, p3, p4, p5)

print("Simple polygon S has been created as follows: ")

print(S)

print("The perimeter of S is ", S.perimeter())

print()

print("---------Testing the ConvPoly class---------")

newp5 = Point(2, 1.75)

try:

P = ConvPoly(p1, p2, p3, p4, newp5)

except:

print("\nCORRECT: ConvPoly __init__ raises exception for violating convexity.\n")

else:

print("\nINCORRECT: ConvPoly __init__ NOT CHECKING FOR CONVEXITY.\n")

P = ConvPoly(p1, p2, p3, p4, p5)

print("Convex polygon P has been created as follows: ")

print(P)

print("The perimeter of P is ", P.perimeter())

P.translate(-2, 3)

print("\nP translated by (-2, 3): ")

print(P)

P.rotate(45)

print("\nNow P is rotated by 45 degrees: ")

print(P)

print("\nThe perimeter of P is ", P.perimeter())

print("(The answer should be the same as the previous one.)")

print("\nThe vertices of P are (this checks __getitem__ and __len__): ")

for i in range(len(P)):

print(P[i])

print("\nChecking iter and next: ")

i = iter(P)

print(next(i))

print(next(i))

print(next(i))

print(next(i))

print(next(i))

try:

print(next(i))

except StopIteration:

print("A StopIteration was (correctly) caught.")

print()

print("---------Testing EquiTriangle, Rectangle, and Square---------\n")

print()

E = EquiTriangle(3)

print("An equilateral triangle E with side length 3 has been created: ")

print(E)

print("The perimeter of E is ", E.perimeter())

print("The area of E is ", E.area())

E.rotate(90)

print("E, after it has been rotated by 90 degrees: ")

print(E)

print()

R = Rectangle(3, 4)

print("A rectangle R with width 3 and height 4 has been created.")

print("Its vertices are: ")

for v in R:

print(v)

print("The perimeter of R is ", R.perimeter())

print("The area of R is ", R.area())

R.translate(-1, 2)

print("R has been translated by (-1, 2). Its vertices are: ")

for v in R:

print(v)

print()

S = Square(5)

print("A square S of side length 5 has been created: ")

print("Its vertices are: ")

for i in range(len(S)):

print(S[i])

print("The perimeter of S is ", S.perimeter())

print("The area of S is ", S.area())

print()

print("That's all for now. Goodbye!")