【python】Plot a Square

news2025/4/10 23:40:31

在这里插入图片描述

文章目录

  • 1、功能描述
  • 2、代码实现
  • 3、效果展示
  • 4、完整代码
  • 5、涉及到的库函数


更多有趣的代码示例,可参考【Programming】


1、功能描述

用 python 实现,以 A和B两个点为边长,方向朝 C 绘制正方形

思路:

  • 计算向量 AB 和 AC。
  • 使用向量 AB 的长度作为正方形的边长。
  • 确定正方形的旋转方向,使得一边朝向点 C。
  • 计算正方形的四个顶点。

2、代码实现

导入必要的库函数

import numpy as np
import matplotlib.pyplot as plt

定义绘制函数 draw_square,先将点转换为 numpy 数组,然后计算向量 AB 和 AC,接着计算 AB 的长度(正方形的边长)

def draw_square(A, B, C):
    # 将点转换为 numpy 数组
    A = np.array(A)
    B = np.array(B)
    C = np.array(C)

    # 计算向量 AB 和 AC
    AB = B - A
    AC = C - A

    # 计算 AB 的长度(正方形的边长)
    side_length = np.linalg.norm(AB)

单位化向量 AB,并计算垂直于 AB 的单位向量,分顺时针 90° 和逆时针 90° 两个方向

    # 单位化向量 AB,并计算垂直于 AB 的单位向量
    AB_unit = AB / side_length
    # 顺时针 y,-x 逆时针 -y,x
    perpendicular_unit1 = np.array([AB_unit[1], -AB_unit[0]])  # 顺时针旋转 90 度
    perpendicular_unit2 = np.array([-AB_unit[1], AB_unit[0]])  # 逆时针旋转 90 度

计算以 A 为原点,两个方向的单位向量与 AC向量的夹角,以确定绘制正方形的朝向

    A1 = A + perpendicular_unit1
    A2 = A + perpendicular_unit2

    A1C = np.dot(AC, A1)
    A2C = np.dot(AC, A2)

分如下几种情况,注意 A1C 和 A2C 相等的时候,说明 AC 与 AB 垂直,此时可以进一步根据距离去判断,如果连距离都相等,说明 C 在 AB(或者延长线) 上,此时方向不明确,打印提示错误信息

    if A1C > A2C:
        perpendicular_unit = perpendicular_unit1
    elif A1C< A2C:
        perpendicular_unit = perpendicular_unit2
    else:
        distance1 = np.sqrt((A1[0]-C[0])**2 + (A1[1]-C[1])**2)
        distance2 = np.sqrt((A2[0] - C[0]) ** 2 + (A2[1] - C[1]) ** 2)
        if distance1 < distance2:
            perpendicular_unit = perpendicular_unit1
        elif distance1 > distance2:
            perpendicular_unit = perpendicular_unit2
        else:
            print("Error: C 与 AB 重合!")
            return

计算顶点

    # 计算正方形的四个顶点
    # 起点是 A
    vertex1 = A
    vertex2 = A + AB_unit * side_length  # A 沿着 AB 方向移动
    vertex3 = vertex2 + perpendicular_unit * side_length  # 从 vertex2 沿着垂直方向移动
    vertex4 = vertex1 + perpendicular_unit * side_length  # 从 vertex1 沿着垂直方向移动

绘制正方形

    # 绘制正方形
    square_vertices = [vertex1, vertex2, vertex3, vertex4, vertex1]  # 回到起点以闭合
    square_vertices = np.array(square_vertices)

    plt.figure()
    plt.plot(square_vertices[:, 0], square_vertices[:, 1], 'b-')  # 绘制正方形边框
    plt.scatter([A[0], B[0], C[0]], [A[1], B[1], C[1]], color=['red', 'green', 'orange'])  # 绘制点 A, B, C
    plt.text(A[0], A[1], ' A', fontsize=12, verticalalignment='bottom')
    plt.text(B[0], B[1], ' B', fontsize=12, verticalalignment='bottom')
    plt.text(C[0], C[1], ' C', fontsize=12, verticalalignment='bottom')
    plt.axis('equal')  # 保持比例
    plt.title('Square with side AB oriented towards C')
    plt.show()

3、效果展示

A = (0, 1)
B = (1, 0)
C = (-1, -1)

在这里插入图片描述
A = (0, 1)
B = (1, 0)
C = (1, 1)
在这里插入图片描述

A = (-1, 0)
B = (1, 0)
C = (0, -1)
在这里插入图片描述

A = (-1, 0)
B = (1, 0)
C = (0, 1)
在这里插入图片描述
A = (-1, -1)
B = (1, 1)
C = (-1, 1)

在这里插入图片描述
A = (-1, -1)
B = (1, 1)
C = (1, -1)

在这里插入图片描述
A = (0, -1)
B = (0, 1)
C = (-1, 0)

在这里插入图片描述

A = (0, -1)
B = (0, 1)
C = (1, 0)
在这里插入图片描述
A = (1, -1)
B = (-1, 1)
C = (-1, -1)

在这里插入图片描述
A = (1, -1)
B = (-1, 1)
C = (1, 1)

在这里插入图片描述
A = (1, 0)
B = (-1, 0)
C = (0, 1)
在这里插入图片描述

A = (1, 0)
B = (-1, 0)
C = (0, -1)

在这里插入图片描述
A = (1, 1)
B = (-1, -1)
C = (1, -1)

在这里插入图片描述
A = (1, 1)
B = (-1, -1)
C = (-1, 1)

在这里插入图片描述

A = (0, 1)
B = (0, -1)
C = (-1, 0)
在这里插入图片描述

A = (0, 1)
B = (0, -1)
C = (1, 0)
在这里插入图片描述

A = (0, 1)
B = (0, 3)
C = (0, 2)

输出

Error: C 与 AB 重合!

4、完整代码

import numpy as np
import matplotlib.pyplot as plt


def draw_square(A, B, C):
    # 将点转换为 numpy 数组
    A = np.array(A)
    B = np.array(B)
    C = np.array(C)

    # 计算向量 AB 和 AC
    AB = B - A
    AC = C - A

    # 计算 AB 的长度(正方形的边长)
    side_length = np.linalg.norm(AB)

    # 单位化向量 AB,并计算垂直于 AB 的单位向量
    AB_unit = AB / side_length
    # 顺时针 y,-x 逆时针 -y,x
    perpendicular_unit1 = np.array([AB_unit[1], -AB_unit[0]])  # 顺时针旋转 90 度
    perpendicular_unit2 = np.array([-AB_unit[1], AB_unit[0]])  # 逆时针旋转 90 度

    A1 = A + perpendicular_unit1
    A2 = A + perpendicular_unit2

    A1C = np.dot(AC, A1)
    A2C = np.dot(AC, A2)

    if A1C > A2C:
        perpendicular_unit = perpendicular_unit1
    elif A1C< A2C:
        perpendicular_unit = perpendicular_unit2
    else:
        distance1 = np.sqrt((A1[0]-C[0])**2 + (A1[1]-C[1])**2)
        distance2 = np.sqrt((A2[0] - C[0]) ** 2 + (A2[1] - C[1]) ** 2)
        if distance1 < distance2:
            perpendicular_unit = perpendicular_unit1
        elif distance1 > distance2:
            perpendicular_unit = perpendicular_unit2
        else:
            print("Error: C 与 AB 重合!")
            return

    # 计算正方形的四个顶点
    # 起点是 A
    vertex1 = A
    vertex2 = A + AB_unit * side_length  # A 沿着 AB 方向移动
    vertex3 = vertex2 + perpendicular_unit * side_length  # 从 vertex2 沿着垂直方向移动
    vertex4 = vertex1 + perpendicular_unit * side_length  # 从 vertex1 沿着垂直方向移动

    # 绘制正方形
    square_vertices = [vertex1, vertex2, vertex3, vertex4, vertex1]  # 回到起点以闭合
    square_vertices = np.array(square_vertices)

    plt.figure()
    plt.plot(square_vertices[:, 0], square_vertices[:, 1], 'b-')  # 绘制正方形边框
    plt.scatter([A[0], B[0], C[0]], [A[1], B[1], C[1]], color=['red', 'green', 'orange'])  # 绘制点 A, B, C
    plt.text(A[0], A[1], ' A', fontsize=12, verticalalignment='bottom')
    plt.text(B[0], B[1], ' B', fontsize=12, verticalalignment='bottom')
    plt.text(C[0], C[1], ' C', fontsize=12, verticalalignment='bottom')
    plt.axis('equal')  # 保持比例
    plt.title('Square with side AB oriented towards C')
    plt.show()


if __name__ == "__main__":
    # 示例使用
    A = (0, 1)
    B = (0, -1)
    C = (1, 0)
    draw_square(A, B, C)

5、涉及到的库函数

  • numpy
  • matplotlib

更多有趣的代码示例,可参考【Programming】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战打靶集锦-37-Wpwnvm

文章目录 1. 主机发现2. 端口扫描&服务枚举3. 服务探查4. 系统提权 靶机地址&#xff1a;https://download.vulnhub.com/wpwn/wpwnvm.zip 1. 主机发现 目前只知道目标靶机在192.168.37.xx网段&#xff0c;通过如下的命令&#xff0c;看看这个网段上在线的主机。 $ nmap -…

三、GPIO

一、GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口GPIO引脚电平&#xff1a;0V&#xff08;低电平&#xff09;~3.3V&#xff08;高电平&#xff09;&#xff0c;部分引脚可容忍5V 容忍5V&#xff0c;即部分引脚输入5V的电压&#xff0c;…

混杂模式(Promiscuous Mode)与 Trunk 端口的区别详解

一、混杂模式&#xff08;Promiscuous Mode&#xff09; 1. 定义与工作原理 定义&#xff1a;混杂模式是网络接口的一种工作模式&#xff0c;允许接口接收通过其物理链路的所有数据包&#xff0c;而不仅是目标地址为本机的数据包。工作层级&#xff1a;OSI 数据链路层&#x…

[dp5_多状态dp] 按摩师 | 打家劫舍 II | 删除并获得点数 | 粉刷房子

目录 1.面试题 17.16. 按摩师 题解 2.打家劫舍 II 题解 3.删除并获得点数 题解 4.粉刷房子 题解 一定要有这样的能力&#xff0c;碰到一个新题的时候&#xff0c;可以往之前做过的题方向靠&#xff01; 打家劫舍问题模型: 不能选择相邻的两个数&#xff0c;并且要最终…

DM数据库配置归档模式的两种方式

归档模式&#xff0c;联机日志文件中的内容保存到硬盘中&#xff0c;形成归档日志文件(REDO日志)。 采用归档模式会对系统的性能产生些许影响&#xff0c;然而系统在归档模式下运行会更安全&#xff0c;当 出现故障时其丢失数据的可能性更小&#xff0c;这是因为一旦出现介质故…

Agent TARS与Manus的正面竞争

Agent TARS 是 Manus 的直接竞争对手&#xff0c;两者在 AI Agent 领域形成了显著的技术与生态对抗。 一、技术架构与功能定位的竞争 集成化架构 vs 模块化设计 Agent TARS 基于字节跳动的 UI-TARS 视觉语言模型&#xff0c;将视觉感知、推理、接地&#xff08;grounding&#…

【Tauri2】013——前端Window Event与创建Window

前言 【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001.2014.3001.5501 前面介绍了on_window_event&#xff0c;这个在Builder中的方法&#xff0c;里面有许多事件&#xff0c;比如Moved&#xff0c;Res…

创建Linux虚拟环境并远程连接,finalshell自定义壁纸

安装VMware 这里不多赘述。 挂载Linux系统 1). 打开Vmware虚拟机&#xff0c;打开 编辑 -> 虚拟网络编辑器(N) 选择 NAT模式&#xff0c;然后选择右下角的 更改设置。 设置子网IP为 192.168.100.0&#xff0c;然后选择 应用 -> 确定。 解压 CentOS7-1.zip 到一个比较大…

基于pycharm的YOLOv11模型训练方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.1 软件环境配置1.2 训练集参考 二、训练步骤2.1 打开文件夹2.2 打开文件2.3 data.yaml最终代码 三、train.py四、最终结果五、detect.py六、 拓展…

034-QSharedMemory

QSharedMemory 以下为针对 QSharedMemory 的技术调研及实现方案&#xff0c;包含原理、优化策略、完整代码实现及流程图解&#xff1a; 一、QSharedMemory 核心原理 1.1 共享内存机制 共享内存流程图 &#xff08;注&#xff1a;此处应为共享内存IPC流程图&#xff0c;因文本…

在 Ubuntu 上离线安装 Prometheus 和 Grafana

在 Ubuntu 上离线安装 Prometheus 和 Grafana 的步骤如下&#xff1a; 一.安装验证 二.安装步骤 1.准备离线安装包 在一台可以访问互联网的机器上下载 Prometheus 和 Grafana 的二进制文件。 Prometheus 下载地址&#xff1a;Prometheus 官方下载页面Grafana 下载地址&#…

Ansible:playbook的高级用法

文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组&#xff08;公共&#xff09;变量 1. handlers与notify Handlers&am…

【C++进阶九】继承和虚继承

【C进阶九】继承和虚继承 1.什么是继承2.继承关系2.1protected和private的区别2.2通过父类的函数去访问父类的private成员2.3默认继承 3.基类和派生类对象的赋值转换4.继承中的作用域5.子类中的默认成员函数6.继承与静态成员7. 菱形继承8.虚继承9.继承和组合 1.什么是继承 继承…

电子电气架构 --- 面向服务的体系架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 周末洗了一个澡&#xff0c;换了一身衣服&#xff0c;出了门却不知道去哪儿&#xff0c;不知道去找谁&am…

基姆拉尔森计算公式

基姆拉尔森计算公式&#xff08;Zellers Congruence 的变体&#xff09;是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算&#xff0c;直接得到星期几的结果。 公式定义 对于日期 年-月-日&#xff0c;公式如下&#xff1a…

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问&#xff1a;怎么本地部署 DeepSeek 搭建个人知识库。 老实说&#xff0c;如果你不是为了研究技术&#xff0c;或者确实需要保护涉密数据&#xff0c;我真不建议去折腾本地部署。 为什么呢&#xff1f; 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…

Python数据可视化-第6章-坐标轴的定制

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第6章 坐标轴的定制 本章主要介绍了坐标轴的定制&#xff0c;包括向任意位置添加坐标轴、定制刻度、隐藏轴脊和移动轴脊。 参考 第…

18认识Qt坐标系

平面直角坐标系(笛卡尔坐标系) 数学上的坐标系 右手坐标系 计算机中的坐标系 左手坐标系 坐标系的原点(0,0) 就是屏幕的左上角 /窗口的左上角 给 Qt 的某个控件,设置位置,就需要指定坐标.对于这个控件来说, 坐标系原点就是相对于父窗口/控件的. QPushButton 的父元素/父控件/父…

动态循环表单+动态判断表单类型+动态判断表单是否必填方法

页面效果&#xff1a; 接口请求到的数据格式&#xff1a; list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…

25.4.3学习总结【Java】

又是一道错题&#xff1a; 1. 班级活动https://www.lanqiao.cn/problems/17153/learning/?page1&first_category_id1&sortdifficulty&asc1&second_category_id3 问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学&#xff0c;老师…