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

2023-05-16

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


class Point:
    def __init__(self, x, y):
        self.__x = x
        self.__y = y
        pass

    def get_x(self):
        return self.__x

    def get_y(self):
        return self.__y
    def __str__(self):
        return "("+str(self.__x)+","+str(self.__y)+")"
    pass


class 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 = a
        self.__b = b
        self.__c = c
        pass

    def get_line(self):
        return self.__a, self.__b, self.__c

    def get_line_point(self, line):
        """
        得到与另一个直线的交点
        :param line: 另一个直线
        :return: None / 与直线的交点
        """
        (a, b, c) = line.get_line()  # 获取另一直线的参数
        if a * self.__b == b * self.__a:
            print("直线平行,无交点")
            return None
        else:  # 求交点 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_point

    def 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 None
        elif r - d > 0:  # 有交点
            if self.__b == 0:   # 直线垂直
                x1 = x2 = self.__c / self.__a
                d_y = pow(r * r - d * d, 1 / 2)
                if x1 - x0 < 1e-6:  # 如果直线在圆的左边
                    y1, y2 = y0 + r, y0 - r
                    pass
                else:
                    y1, y2 = y0 + d_y, y0 - d_y
                    pass
                pass  # 直线垂直
            else:  # 求解一元二次方程 ax^2+bx+c=0
                k = - (self.__a / self.__b)  # 直线斜率
                m = - (self.__c / self.__b)  # 直线截距
                a = 1 + k**2
                b = -2 * x0 + 2 * (m - y0)
                c = x0**2 + (m-y0)**2 - r**2
                dert = 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 + m
                pass # 直线不垂直
            point_1, point_2 = Point(x1, y1), Point(x2, y2)
            pass
        return point_1, point_2

    def 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_point

    def 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("直线与线段重合")
                    pass
                else:
                    print("无交点")
                    pass
                return None
            elif y1 == y2:  # 线段水平
                if min(x1, x2) <= -(self.__c / self.__a) <= max(x1, x2):  # 相交
                    c_x = -(self.__c / self.__a)
                    c_y = y1
                    c_point = Point(c_x, c_y)
                    pass
                else:
                    print("无交点")
                    pass
                    return None
        elif self.__a == 0:  # 直线水平
            if x1 == x2:  # 如果线段垂直
                if min(y1, y2) <= -(self.__c / self.__b) <= max(y1, y2):  # 相交
                    c_x = x1
                    c_y = -(self.__c / self.__b)
                    c_point = Point(c_x,c_y)
                    pass
                else:
                    print("无交点")
                    return None
            elif y1 == y2:  # 线段水平
                if abs(y1 + (self.__c / self.__b)) < 1e-6:  # 重合
                    print("直线与线段重合")
                    pass
                else:
                    print("无交点")
                    pass
                return None
        else:  # 直线倾斜
            if x1 == x2:  # 如果线段垂直
                x3 = -(self.__b * max(y1,y2) + self.__c) / self.__a
                x4 = -(self.__b * min(y1,y2) + self.__c) / self.__a
                if min(x3, x4) <= x1 <= max(x3,x4):   # 有交点
                    c_point = self.get_line_point(Line(1, 0, -x1))
                    pass
                else:
                    print("无交点")
                    return None
                pass
            elif y1 == y2:  # 线段水平
                y3 = -(self.__a * max(x1,x2) + self.__c) / self.__b
                y4 = -(self.__a * min(x1,x2) + self.__c) / self.__b
                if min(y3, y4) <= y1 <= max(y3,y4):   # 有交点
                    c_point = self.get_line_point(Line(0, 1, -y1))
                    pass
                else:
                    print("无交点")
                    return None
                pass
            pass
        return c_point

class Circle:
    def __init__(self,point, r):
        """
        园的一般式(x-x0)^2+(y-y0)^2=r^2
        :param point:圆心坐标
        :param r:
        """
        self.point = point
        self.__r = r
        pass

    def get_center(self):
        return self.point

    def get_r(self):
        return self.__r

    pass


class 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 = point1
        self.__point2 = point2
        pass

    def get_point1(self):
        return self.__point1

    def get_point2(self):
        return self.__point2

    pass


if __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需要你自己发现,我也不会去改了(不影响运行和部分正确结果),如果你发现了可以告诉我或者写在评论区。这个代码只是提供一个思路。毕竟当时三个小时写完就草草交了作业的代码质量肯定不会太好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合肥工业大学机器人足球仿真robcup作业二(python实现)附代码有注释 的相关文章

  • TI AWR1843+DAC1000EVM+mmWave Studio实现数据采集

    参考文章 xff1a DCA1000EVM使用指南 嵌入式处理 技术文章 E2E 设计支持 整个实验主要是按照上面文章中的步骤进行操作 xff0c 虽然文章中是以IWR1642BOOST为例 xff0c 但是所有的操作步骤基本完全适用于AW
  • 安装Pytorch时出现ERROR: Could not find a version that satisfies the requirement...的解决方法

    一 问题描述 当我们创建了一个虚拟环境 xff0c 在环境中使用pip命令安装Pytorch时经常会出现以下错误 xff1a 二 解决方法 下面罗列几种有用的解决方法 xff1a 1 切换网络 出现这种问题很可能是因为网络太卡导致无法从该路
  • 使用Rviz完成摄像头(camera)的视频采集

    文章目录 一 准备摄像头二 使用Rviz三 Rviz显示摄像头 一 准备摄像头 1 找到虚拟机设置 xff0c 将USB设置为3 1 2 连接摄像头 3 连接成功如下 4 检查能否使用 使用cheese命令 二 使用Rviz 1 启动Rvi
  • SAM-Segment Anything Model进行单张图片的检测记录

    一 代码和模型下载 下载链接 GitHub facebookresearch segment anything 将代码下载并解压到一个没有中文的路径下 页面往下滑找到需要下载的模型 nbsp 这里提供了三个模型 vit b的大小是358m
  • Segment Anything(SAM)全图分割做mask

    项目的源码和模型下载以及环境配置等可参考我的上一篇文章 xff0c 这里不再赘述 文章链接 xff1a https blog csdn net m0 63604019 article details 130221434 在项目中创建一个名为
  • labelme的使用学习

    windows下图像标注软件labelme安装及使用教程 xff1a https www rstk cn news 12836 html action 61 onClick 问题 xff1a 如何将labelme标注产生的json文件中的某
  • Unet做分割的详细步骤

    参考文章 xff1a https blog csdn net ECHOSON article details 122914826 我是参考上面这个文章来做的 xff0c 但是在做实验的过程中还是出现了很多问题 xff0c 所以这里还是自己写
  • Java语法之多态

    上次给大家分享了Java的继承 xff0c 今天小编给大家分享面向对象三大特性的第三大特性 xff0c 也就是多态 xff0c fighting 目录 x1f388 一 多态 x1f388 1 1多态的概念 x1f388 1 2多态的实现条
  • 实现调度器

    实现调度器 调度器是操作系统的核心 xff0c 其主要功能就是实现任务的切换 xff0c 即从就绪列表里面找到优先级最高的任务 xff0c 然后去执行该任务 1 启动调度器 xff08 1 xff09 void vTaskStartSche
  • 任务相关知识

    任务管理 从系统的角度来看 xff0c 任务是竞争系统资源的最小运行单元 在任何时刻 xff0c 只有一个任务得到运行 xff0c 每个任务都在自己的环境中运行 xff0c 而这个运行的任务由FreeRTOS的调度器决定 FreeRTOS
  • 串口打印中文乱码及注释乱码问题

    1 使用keil5代码注释出现中文乱码问题 在使用keil5中出现如下问题 xff1a 这时候的解决方法是在keil5顶头工具栏上进入 xff1a Edit Configuration xff0c 如下然后进行选择GB2312编码方式 xf
  • keil5中安装Arm Compiler 5.06问题

    keil5 5 7版本中安装Arm Compiler 5 06问题 在最新的keil5 7版本中不再默认安装Arm Compiler 5 06编译器 xff0c 所以此版本需要自己独立下载并进行安装 具体步骤如下 xff1a 1 官网下载A
  • 五、FreeRTOS中任务控制块(TCB)、任务句柄和内核对象句柄

    文章目录 1 什么是任务控制块 xff1f 2 任务控制块的内容3 什么是任务句柄 xff1f 4 什么是内核对象句柄 xff1f 1 什么是任务控制块 xff1f 任务控制块实际上就是一个结构体 在FreeRTOS中 xff0c 系统为了
  • 凸优化基础知识

    文章目录 一 学习任务二 学习内容1 计算几何1 1 计算几何 的定义1 2 直线表达 2 凸集2 1 定义2 2 平面表达2 3 超平面表达 3 凸函数3 1 定义3 2 Hessian Matrix 矩阵3 3 判别 4 凸规划4 1
  • 八、任务的创建与删除

    文章目录 1 任务的三要素 xff1a 主体函数 任务栈 任务控制块 2 与任务相关的部分API函数 xff08 1 xff09 xTaskCreate xff08 2 xff09 void vTaskDelete TaskHandle t
  • 三、STM32中systick中断的优先级

    1 systick中断的优先级 systick为内核外设中断 xff0c 与普通外设中断的优先级有些区别 xff0c 并没有抢占优先级和子优先级的说法 对于M3来说内核外设的中断优先级由内核SCB这个外设的寄存器 xff1a SHPRx x
  • 二十、事件组

    文章目录 1 基本概念2 使用场景 xff1a 用于任务间 任务和中断间的同步 xff08 非数据传输 xff09 3 事件组结构体 xff08 事件控制块 xff09 内容解析4 为什么采用的是关闭调度器而不是关闭中断 xff1f 5 创
  • 3、如何使用GDB来进行命令行debug

    文章目录 一 与前面的联系二 GDB的一些认识1 什么是gdb2 gdb作用3 gdb可实现的功能 三 GDB常用的调试命令 一 与前面的联系 对于前面说到的launch json文件就是用于debug的配置文件 xff0c 在前面的vsc
  • 1、vscode搭建C++开发环境及一些配置文件的含义

    文章目录 一 vscode搭建开发环境1 下载和配置MinGW w64 编译器套件2 安装到电脑中3 配置环境变量4 测试是否安装成功5 vscode上安装C C 43 43 插件 二 配置编译环境时各个文件的含义1 task json x
  • 5、cmake的简单认识及CMakeLists.txt的编写语法

    文章目录 1 cmake是什么 xff08 1 xff09 cmake的两大功能 2 CMakeLists txt常用命令 xff08 即如何编写CMakeLists txt文件 xff09 xff08 1 xff09 cmake常见预定义

随机推荐

  • 6、在vscode上利用cmake创建第一个简单C++程序

    文章目录 xff08 1 xff09 前期准备工作 xff1a 即安装对应的环境1 xff09 在vscode上安装插件 xff1a C C 43 43 Cmake CMake tools2 xff09 安装Cmake环境 xff08 这是
  • 7、在vscode上利用cmake构建多文件C++工程

    文章目录 xff08 1 xff09 创建如下工程文件夹 xff1a 其中头文件放在include文件夹中 xff0c 源文件放在src文件夹中 xff08 2 xff09 在vscode上打开工程文件夹 xff0c 在对应的文件夹内建立相
  • js实现猜数字游戏

    随机输入两个数min 和max 在两个数中间生成一个随机数 进行猜数字游戏 且有猜的次数限制 1 不限制次数版本 function getRandom min max return Math floor Math random max mi
  • ubuntu更换阿里云镜像源操作步骤

    过程较为复杂 xff0c 能清楚自己改了镜像源 xff0c 避免了忘记或备份等 修改下载 xff08 镜像源 xff09 源 输入 xff1a sudo nano etc apt sources list 2 将所有deb 后的网址http
  • CSRF攻击原理与防御方法

    文章目录 CSRF概念CSRF攻击攻击原理及过程CSRF漏洞检测防御CSRF攻击1 验证 HTTP Referer 字段2 在请求地址中添加 token 并验证3 在 HTTP 头中自定义属性并验证 CSRF概念 CSRF跨站点请求伪造 C
  • Windows11安装Linux子系统(Ubuntu22.04LTS)+安装ROS

    目录 一 准备工作 二 安装Ubuntu 22 04 1 LTS 三 启动Ubuntu遇到的报错及解决方案 四 换源 五 安装ROS 设置编码 添加源 安装ROS 设置环境变量 测试 一 准备工作 控制面板 程序 程序和功能 启动或关闭 W
  • 如何在Github上建立自己的个人博客网站详细教程

    概述 之前闲着没事 就利用Github建了一个个人博客网站 效果还不错 今天就来分享一下 建立自己个人博客网站的好处 1 面试装逼 这个不必多说 2 把平时积累的知识和项目记录下来 方便日后查看使用 3 不受其他博客平台的限制 准备工作 开
  • 看野火的视频,用正点原子的板子(STM32F4探索者)做系统定时器实验

    1 实验目的 编写一个毫秒级的延时函数 xff0c 控制LED的亮灭 这里的灯是LED1 xff0c 端口是GPIOF xff0c 引脚是PIN10 2 实验流程 2 1 准备知识 SysTick 系统定时器 xff0c 24位 xff0c
  • 用正点原子的板子(STM32F4探索者)做PWM 输出实验

    1 实验目的 使用 TIM14 的通道 1 来产生 PWM 控制 LED0 DS0 的亮度 2 实验准备和流程 由上图可以看出 xff0c GPIOF9引脚对应的是定时器TIM14的通道1 由上图可以看出 xff0c GPIOF9引脚对应的
  • MATLAB快速入门(二):矩阵

    矩阵 目录 矩阵 1 冒号表达式 2 矩阵元素的引用 3 矩阵的运算 3 1算术运算 3 2逻辑运算 4 特殊矩阵 5 矩阵变换 5 1对角阵 5 2三角阵 5 3矩阵旋转 5 4稀疏矩阵 6 矩阵求值 1 冒号表达式 e1 e2 e3 省
  • toString方法使用

    一 Object类中toString的作用 1 在主方法中我们可以直接用toString 输出对象其中的内容 2 我们需要直接输出对象中所属内容时 xff0c 直接使用toString 方法输出语句 xff0c 输出内容不友好 xff0c
  • px4+mavros+offboard控制+gazebo仿真以及与pixhawk4飞控连接(一)

    记录一下自己从px4到板载控制的一系列流程以及踩坑过程 xff0c 希望也可以帮助大家避雷 话不多说直接上干货 一 软 硬件平台 px4版本 xff1a 1 10 1 飞控板 xff1a pixhawk4 ros版本 xff1a melod
  • 浅谈穿越机飞控如何烧写固件及其相关设置问题

    背景 xff1a 自己本人是无人机爱好者对穿越机也较为痴迷 xff0c 在使用DJI FPV天空端时发现无法显示OSD信息 xff0c 同时在眼镜端的OSD开关已经打开 xff0c 查阅相关资料发现自己的飞控版本过低需要烧写到4 1 0以上
  • XSS攻击原理及防范

    文章目录 一 XSS攻击简介二 XSS攻击分类1 反射型2 存储型3 DOM based型 三 XSS防范1 cookie安全策略2 X XSS Protection设置3 XSS防御HTML编码4 XSS 防御HTML Attribute
  • Jetson Xavier NX安装librealsense

    在nx上安装librealsense可以使用由jetsonhacks开源的安装脚本installRealSenseSDK 克隆仓库 xff0c 进入目录 git clone https github com jetsonhacks inst
  • Kubernetes(K8s)的简介及基础知识

    1 关于Kubernetes xff08 K8s xff09 的简介 Kubernetes xff0c 简称又叫K8s xff0c 为什么简称要叫K8s xff0c 据说是因为Kubernetes单词中K字母和S字母之间相隔8个字母 xff
  • 爬虫实战(三)

    随着互联网的不断发展 xff0c 网络数据的规模和价值也不断提升 在这个大数据时代 xff0c 如何从海量数据中提取有价值的信息并加以利用 xff0c 成为了数据科学 商业分析 金融预测 社会研究等领域中一个重要的问题 而网络爬虫作为一种数
  • 数据库连接

    一 连接数据库的方法和工具 数据库连接是访问数据库的关键步骤之一 xff0c 通过连接数据库 xff0c 我们可以进行数据的增删改查等操作 下面介绍几种连接数据库的方法和工具 命令行工具 在命令行中输入相应的命令即可连接数据库 常用的命令行
  • C语言之十进制转化为十六进制

    作者 xff1a 从未止步 博客主页 xff1a 从未止步的博客 专栏 xff1a 和我一起学C 语录 xff1a Every day is a second chance 行动是理想最高贵的表达 xff0c 给大家介绍一款超牛的斩获大厂o
  • 合肥工业大学机器人足球仿真robcup作业二(python实现)附代码有注释

    用面向对象的思维设计相关类 xff0c 从而实现直线与直线 直线与圆 直线与矩形的交点 要求各给出每个案例的至少一个示例的程序 这是第二次机器人足球的作业代码 xff0c 写的比较潦草 xff0c 但是用的方法还是通俗易懂的 xff0c 基