Guest User

Untitled

a guest
Jan 28th, 2020
82
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. """
  2. Student: adi camus
  3. ID: 209020999
  4. Assignment no. 7
  5. Program: lines.py
  6. """
  7. def Xerr(x):
  8. if not isinstance(x,float) and not isinstance(x,int):
  9. raise ValueError("x must be a number", x)
  10.  
  11. def Yerr(y):
  12. if not isinstance(y,float) and not isinstance(y,int):
  13. raise ValueError("y must be a number", y)
  14.  
  15. class Point:
  16. def __init__(self,x,y):
  17. Xerr(x)
  18. Yerr(y)
  19. self.__x=x
  20. self.__y=y
  21.  
  22. def get_x(self):
  23. return self.__x
  24.  
  25. def get_y(self):
  26. return self.__y
  27.  
  28. def set_x(self,x):
  29. Xerr(x)
  30. self.__x=x
  31.  
  32. def set_y(self,y):
  33. Yerr(y)
  34. self.__y=y
  35.  
  36. def __str__(self):
  37. return "({0:.2f},{1:.2f})".format(self.__x,self.__y)
  38.  
  39.  
  40. def p1err(p1):
  41. if not isinstance(p1, Point):
  42. raise Exception("must be type Point", p1)
  43.  
  44. def p2err(p2):
  45. if not isinstance(p2, Point):
  46. raise Exception("must be type Point", p2)
  47. class line:
  48. def __init__(self,p1,p2):
  49. p1err(p1)
  50. p2err(p2)
  51. self.__p1=p1
  52. self.__p2=p2
  53.  
  54. def get_p1(self):
  55. return self.__p1
  56.  
  57. def get_p2(self):
  58. return self.__p2
  59.  
  60. def set_p1(self,p1):
  61. p1err(p1)
  62. self.__p1=p1
  63.  
  64. def set_p2(self,p2):
  65. p2err(p2)
  66. self.__p2=p2
  67.  
  68. def is_vertical(self):
  69. try:
  70. return (self.__p2.get_y() - self.__p1.get_y()) / (self.__p2.get_x() - self.__p1.get_x())
  71. except ZeroDivisionError:
  72. return True
  73.  
  74. def slope(self):
  75. try:
  76. return (self.__p2.get_y() - self.__p1.get_y()) / (self.__p2.get_x() - self.__p1.get_x())
  77. except ZeroDivisionError:
  78. return None
  79.  
  80. def y_intersect(self):
  81. m=self.slope()
  82. if m==None:
  83. return None
  84. b=self.__p2.get_y() - m*self.__p2.get_x()
  85. return b
  86.  
  87. def __str__(self):
  88. t=self.slope()
  89. if t==None:
  90. return "x = {},".format(self.__p2.get_x())
  91. return "y = {0:.2f}x + {1:.2f},".format(t,self.y_intersect())
  92.  
  93. def parallel(self, other):
  94. if self.slope()==other.slope():
  95. return True
  96. return False
  97.  
  98. def equals(self, other):
  99. # if self.__p2.get_y()-self.__p1.get_y()==other.__p2.get_y()-other.__p1.get_y() and self.__p2.get_x()-self.__p1.get_x()==other.__p2.get_x()-other.__p1.get_x():
  100. if self.__str__() == other.__str__():
  101. return True
  102. return False
  103.  
  104. def intersection(self,other):
  105. if self.parallel(other)==True:
  106. return None
  107. if other.y_intersect()==None:
  108. x=other.get_p1().get_x()
  109. y=self.slope()*x+self.y_intersect()
  110. return "({0:.2f},{1:.2f})".format(x,y)
  111. if self.y_intersect()==None:
  112. x=self.get_p1().get_x()
  113. y=other.slope()*x+other.y_intersect()
  114. return "({0:.2f},{1:.2f})".format(x,y)
  115. x= (other.y_intersect()-self.y_intersect()) / (self.slope()-other.slope())
  116. y= self.slope()*x+self.y_intersect()
  117. return "({0:.2f},{1:.2f})".format(x,y)
  118.  
  119.  
  120. def not_enough_data(i):
  121. return print("not enough data in line {0}".format(i+1))
  122. def coordinate_y(i):
  123. return print("Line {0} error: y coordinate must be a number".format(i+1))
  124. def coordinate_x(i):
  125. return print("Line {0} error: x coordinate must be a number".format(i+1))
  126. def equal_exception():
  127. return print("Equal lines. This is illegal")
  128.  
  129.  
  130. def check(m):
  131. new_lst_check=[]
  132. for i in range(len(m)):
  133. element=m[i]
  134. element=element.split()
  135. if len(element) != 4:
  136. not_enough_data(i)
  137. return new_lst_check
  138. for x in range(len(element)):
  139. if element[x].isalpha() and x%2==0:
  140. coordinate_x(i)
  141. return new_lst_check
  142. # raise ValueError("x coordinate must be number")
  143. if element[x].isalpha() and x%2 !=0:
  144. coordinate_y(i)
  145. return new_lst_check
  146. # raise ValueError("y coordinate must be number")
  147. element[x]=float(element[x])
  148. new_lst_check.append(element)
  149. return new_lst_check
  150.  
  151. def is_equal(lineslist):
  152. is_equal_list=[]
  153. a=""
  154. for i in range(len(lineslist)):
  155. z=0
  156. while z<len(lineslist):
  157. if z==i:
  158. z+=1
  159. else:
  160. if lineslist[i].equals(lineslist[z])==True:
  161. is_equal_list.append(lineslist[i])
  162. z+=1
  163. a+=str(i)+" "
  164. else:
  165. z+=1
  166. return is_equal_list,a
  167.  
  168.  
  169. with open("input6.txt") as doc:
  170. m=doc.read().splitlines()
  171. new_m=check(m)
  172. lineslist=[]
  173. for block in new_m:
  174. p1=Point(float(block[0]),float(block[1]))
  175. p2=Point(float(block[2]),float(block[3]))
  176. lineslist.append(line(p1,p2))
  177. equal , nums = is_equal(lineslist);nums=nums.split();nums=[int(i) for i in nums]
  178. if len(equal)>0:
  179. equal_exception()
  180. lineslist=lineslist[0:nums[-1]+1]
  181. print("Lines:")
  182. for i in range(len(lineslist)):
  183. z=0
  184. a=""
  185. while z<len(lineslist):
  186. if i==z:
  187. a+=""
  188. z+=1
  189. else:
  190. if lineslist[i].parallel(lineslist[z])==True:
  191. a+=" "+"parallel to line {0}".format(z+1)
  192. z+=1
  193. else:
  194. z+=1
  195. print("line {0}: {1} {2}".format(i+1,lineslist[i],a))
  196. xdxd=[]
  197. for i in lineslist:
  198. for j in lineslist:
  199. if i.intersection(j)==None:
  200. continue
  201. xdxd.append(i.intersection(j))
  202. xdxd=list(set(xdxd))
  203. if len(xdxd)==0:
  204. print("no intersections")
  205. else:
  206. print("Intersection points:")
  207. for i in xdxd:
  208. print(i)
RAW Paste Data