合肥工业大学机器人足球仿真robcup作业二(python实现)附代码有注释
生活随笔
收集整理的這篇文章主要介紹了
合肥工业大学机器人足球仿真robcup作业二(python实现)附代码有注释
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用面向對象的思維設計相關類,從而實現直線與直線、直線與圓、直線與矩形的交點。
要求各給出每個案例的至少一個示例的程序。
這是第二次機器人足球的作業代碼,寫的比較潦草,但是用的方法還是通俗易懂的,基本都是初高中都會的一些幾何關系。沒有用到向量什么的高級東西,所以對于沒有學號向量看不懂網上其他教學視頻的只要認真看這個還是能夠看懂的。
關鍵函數我都寫了注釋,對于參數我也做了解釋還有返回值。并且某些地方使用的公式我也注釋上去了,所以只要你能跟著我的代碼思路把我的代碼復現出來基本就沒什么其他問題了。
"""
用面向對象的思維設計相關類,從而實現直線與直線、直線與圓、直線與矩形的交點。
要求各給出每個案例的至少一個示例的程序。
"""class Point:def __init__(self, x, y):self.__x = xself.__y = ypassdef get_x(self):return self.__xdef get_y(self):return self.__ydef __str__(self):return "("+str(self.__x)+","+str(self.__y)+")"passclass Line:def __init__(self, a, b, c):"""直線一般式ax+by+c=0:param a: x前系數:param b: y前系數:param c: 常數項"""if a == 0 and b == 0:print("無法構成直線")exit(-1)self.__a = aself.__b = bself.__c = cpassdef get_line(self):return self.__a, self.__b, self.__cdef get_line_point(self, line):"""得到與另一個直線的交點:param line: 另一個直線:return: None / 與直線的交點"""(a, b, c) = line.get_line() # 獲取另一直線的參數if a * self.__b == b * self.__a:print("直線平行,無交點")return Noneelse: # 求交點 x = (c2*a1 - c1*a2) / (b1*a2 - b2*a1)x0 = (self.__b * c - self.__c * b) / (self.__a * b - a * self.__b)y0 = (c * self.__a - self.__c * a) / (self.__b * a - b * self.__a)inter_point = Point(x0, y0)return inter_pointdef get_cir_point(self, cir):"""點到直線的距離:d = | ax0+bx0+c |/ (a^2+b^2)^1/2:param cir: 待求的圓:return: None / 交點"""r = cir.get_r()center = cir.get_center()x0, y0 = center.get_x(), center.get_y()d = abs(self.__a * x0 + self.__b * y0 + self.__c) \/ pow(self.__a * self.__a + self.__b * self.__b, 1/2)if d > r:print("直線與圓無交點")return Noneelif r - d > 0: # 有交點if self.__b == 0: # 直線垂直x1 = x2 = self.__c / self.__ad_y = pow(r * r - d * d, 1 / 2)if x1 - x0 < 1e-6: # 如果直線在圓的左邊y1, y2 = y0 + r, y0 - rpasselse:y1, y2 = y0 + d_y, y0 - d_ypasspass # 直線垂直else: # 求解一元二次方程 ax^2+bx+c=0k = - (self.__a / self.__b) # 直線斜率m = - (self.__c / self.__b) # 直線截距a = 1 + k**2b = -2 * x0 + 2 * (m - y0)c = x0**2 + (m-y0)**2 - r**2dert = pow(b**2 - 4 * a * c, 1/2)x1, x2 = (-b+dert) / (2 * a), (-b-dert) / (2 * a)y1, y2 = k * x1 + m, k * x2 + mpass # 直線不垂直point_1, point_2 = Point(x1, y1), Point(x2, y2)passreturn point_1, point_2def get_rectangle_point(self, rectangle):point1, point2 = rectangle.get_point1(), rectangle.get_point2()x1, x2 = point1.get_x(), point2.get_x()y1, y2 = point1.get_y(), point2.get_y()m_x, M_x = min(x1,x2),max(y1,y2)m_y, M_y = min(y1,y2), max(y1,y2)c_point1 = self.get_seg_line(Point(m_x,M_y),Point(M_x,M_y)) # 上水平線段c_point2 = self.get_seg_line(Point(m_x, m_y), Point(M_x, m_y)) # 下水平線段c_point3 = self.get_seg_line(Point(m_x, m_y), Point(m_x, M_y)) # 左垂直線段c_point4 = self.get_seg_line(Point(M_x, m_y), Point(M_x, M_y)) # 右垂直線段return c_point1,c_point2,c_point3,c_point4 # get_rectangle_pointdef get_seg_line(self, point1, point2):"""返回一個直線和線段的交點:param point1: 線段點一:param point2: 線段點二:return: 無交點或者無數交點都返回None,有一個交點返回一個交點"""x1, y1 = point1.get_x(), point1.get_y()x2, y2 = point2.get_x(), point2.get_y()if self.__b == 0: # 如果直線垂直if x1 == x2: # 如果線段垂直if abs(x1 + (self.__c / self.__a)) < 1e-6: # 重合print("直線與線段重合")passelse:print("無交點")passreturn Noneelif y1 == y2: # 線段水平if min(x1, x2) <= -(self.__c / self.__a) <= max(x1, x2): # 相交c_x = -(self.__c / self.__a)c_y = y1c_point = Point(c_x, c_y)passelse:print("無交點")passreturn Noneelif self.__a == 0: # 直線水平if x1 == x2: # 如果線段垂直if min(y1, y2) <= -(self.__c / self.__b) <= max(y1, y2): # 相交c_x = x1c_y = -(self.__c / self.__b)c_point = Point(c_x,c_y)passelse:print("無交點")return Noneelif y1 == y2: # 線段水平if abs(y1 + (self.__c / self.__b)) < 1e-6: # 重合print("直線與線段重合")passelse:print("無交點")passreturn Noneelse: # 直線傾斜if x1 == x2: # 如果線段垂直x3 = -(self.__b * max(y1,y2) + self.__c) / self.__ax4 = -(self.__b * min(y1,y2) + self.__c) / self.__aif min(x3, x4) <= x1 <= max(x3,x4): # 有交點c_point = self.get_line_point(Line(1, 0, -x1))passelse:print("無交點")return Nonepasselif y1 == y2: # 線段水平y3 = -(self.__a * max(x1,x2) + self.__c) / self.__by4 = -(self.__a * min(x1,x2) + self.__c) / self.__bif min(y3, y4) <= y1 <= max(y3,y4): # 有交點c_point = self.get_line_point(Line(0, 1, -y1))passelse:print("無交點")return Nonepasspassreturn c_pointclass Circle:def __init__(self,point, r):"""園的一般式(x-x0)^2+(y-y0)^2=r^2:param point:圓心坐標:param r:"""self.point = pointself.__r = rpassdef get_center(self):return self.pointdef get_r(self):return self.__rpassclass Rectangle:def __init__(self, point1, point2):"""兩點確定一個矩形:param point1: 第一個矩形:param point2: 第二個矩形"""if abs(point1.get_x() - point2.get_x()) < 1e-6 or abs(point1.get_y() - point2.get_y()) < 1e-6:print("無法構成矩形,程序退出")exit(2)self.__point1 = point1self.__point2 = point2passdef get_point1(self):return self.__point1def get_point2(self):return self.__point2passif __name__ == '__main__':line_1 = Line(1, 1, -1)line_2 = Line(1, -1, 0)print("直線x+y-1與x-y的交點為:",end="")print(line_1.get_line_point(line_2))cir = Circle(Point(0,0),1)print("圓心為(0,0)半徑為1的圓與直線x-y=0的交點為:",end="")p1, p2 = line_2.get_cir_point(cir)print(p1,p2)rec = Rectangle(Point(0,0),Point(1,1))p_1,p_2,p_3,p_4 = line_1.get_rectangle_point(rec)print("(0,0)與(1,1)構成的矩形與直線x+y-1=0的交點為:",end="")print(p_1,p_2,p_3,p_4)pass
希望大家有認真查看代碼學習,看到這里我可以告訴你,這是我三個小時臨時寫出來的東西,大體上沒有任何毛病,但是有小bug需要你自己發現,我也不會去改了(不影響運行和部分正確結果),如果你發現了可以告訴我或者寫在評論區。這個代碼只是提供一個思路。畢竟當時三個小時寫完就草草交了作業的代碼質量肯定不會太好。
總結
以上是生活随笔為你收集整理的合肥工业大学机器人足球仿真robcup作业二(python实现)附代码有注释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPS表格
- 下一篇: 芜湖爱心天使协会优秀志愿者表彰大会圆满举