用面向对象的思维设计相关类,从而实现直线与直线、直线与圆、直线与矩形的交点。
要求各给出每个案例的至少一个示例的程序。
这是第二次机器人足球的作业代码,写的比较潦草,但是用的方法还是通俗易懂的,基本都是初高中都会的一些几何关系。没有用到向量什么的高级东西,所以对于没有学号向量看不懂网上其他教学视频的只要认真看这个还是能够看懂的。
关键函数我都写了注释,对于参数我也做了解释还有返回值。并且某些地方使用的公式我也注释上去了,所以只要你能跟着我的代码思路把我的代码复现出来基本就没什么其他问题了。
"""
用面向对象的思维设计相关类,从而实现直线与直线、直线与圆、直线与矩形的交点。
要求各给出每个案例的至少一个示例的程序。
"""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实现)附代码有注释相关推荐

  1. 合肥工业大学机器人足球仿真robcup作业三(python实现)附代码有注释

    第三次作业 题目:已知2个点的信息,定位自己的绝对坐标. 设图中C(0,0),P1(-52.5,-32), P2(-52.5, 32), P3(52.5,32), P4(52.5,-32), P5(0 ...

  2. 机器人足球仿真第一次作业

    机器人足球仿真第一次作业 机器人足球仿真是一门与RoboCup有关的一门课程,讲到了有关球员的决策,球队的开发等知识. 这是老师布置的第一次作业,基本任务就是解析字符串,其功能相当于uva中Prase ...

  3. 合肥工业大学机器人技术作业一

    合肥工业大学机器人技术作业一 题目: 在机器人足球比赛中,server和球员client之间通过发送字符串来进行信息交互,其中server要把某球员的听觉和视觉信息发送给该球员,信息的格式如下所示: ...

  4. 机器人足球仿真中的三角进攻算法研究

    摘 要:机器人足球仿真系统提供了实时对抗环境下研究多智能体协作问题的一个良好平台.本文基于仿真环境下的理论基础及模型,通过逐场次逐帧地测试与分析研究,设计出用于控制机器人协作队形的三角进攻算法,并对基 ...

  5. 合肥工业大学机器人技术五十六题

    合肥工业大学机器人技术五十六题 题目要求 //拿球后行为,利用已有 Worldmodel(21) (1)在 playOn 模式下,拿到球以后朝前方快速带球. (2)在 PlayOn 模式下,拿到球以后 ...

  6. python五子棋游戏大作业_python-大作业之五子棋游戏(附代码)

    <python-大作业之五子棋游戏(附代码)>由会员分享,可在线阅读,更多相关<python-大作业之五子棋游戏(附代码)(6页珍藏版)>请在金锄头文库上搜索. 1.Pytho ...

  7. 关系抽取:图卷积网络的学习(二)(附代码)

    关系抽取:图卷积网络的学习(二)(附代码) 目录 关系抽取:图卷积网络的学习(二)(附代码) 论文一:基于关系图的实体关系联合抽取 摘要 1.Introduction 2.Motivation 3.G ...

  8. 合肥工业大学机器人技术期末_合肥工业大学 机器人技术 作业和实验

    简介 你好! 在这篇文章中,我将免费共享合肥工业大学<机器人技术>作业和实验环节的代码和个人报告,以供交流学习.为了方便更多的同学搜索到这篇博客,我会在下面贴出一部分实验题目. 共享资源包 ...

  9. 合工大php期末试卷_完美起航-合肥工业大学机器人技术作业和实验

    简介 你好! 在这篇文章中,我将免费共享合肥工业大学<机器人技术>作业和实验环节的代码和个人报告,以供交流学习.为了方便更多的同学搜索到这篇博客,我会在下面贴出一部分实验题目. 共享资源包 ...

最新文章

  1. java 9999 符号_java 9999(示例代码)
  2. left join 临时表_不懂SQL优化?那你就OUT了——表连接的优化
  3. table表头固定4种方法_4种细砂回收的方法分析
  4. ios PNG Crush error (PNG图片错误)
  5. 我女朋友让我删前任,我明明删了她还是要分手...
  6. FreeBSD学习笔记15-FreeBSD下安装Apache
  7. python爬虫加密空间_Python爬虫进阶必备 | XX同城加密分析
  8. C语言学习 数独游戏
  9. C++ Notes(focus on c++)
  10. C、C++实现 -- 字符串分割函数split
  11. xlsx文件打开乱码_Excel打开出现乱码的解法方法
  12. 理解int的存储方式以及二进制编辑器的使用
  13. 易用宝项目记录day3-curd
  14. 西门子PLC怎么调试?
  15. 如何理解TPS、QPS、RT、吞吐量这些性能指标
  16. c语言十六进制字符串求和,一串十六进制求和软件 两个十六进制怎么相加的
  17. 惠普服务器优盘安装系统蓝屏,惠普u盘装系统出现蓝屏现象怎么解决
  18. Ubuntu出现System policy prevents modification of network settings for all users该怎么解决
  19. TCP聊天文件服务器v2.0 - 重大bug修复+PyQt5文件传输可视化
  20. 兄弟打印机打印不清楚

热门文章

  1. 《怒海营救》,招招真实的动作电影
  2. 进来试试这份字节跳动面试题,看看你能打几分
  3. (转)阿里巴巴大数据平台“达芬奇密码”进化论
  4. 5种常用翻译软件测试实验
  5. mui h5+文档最详版
  6. Python项目实践:蒙特卡罗方法计算圆周率
  7. 《瀚兰房地产开发区块链应用及案例分享》BSN培训精华回顾
  8. 可行性研究报告-机房收费系统
  9. c语言产生随机数_第四章:随机数的生成
  10. win10系统使用自带IE浏览器