Python数学可视化——坐标系与变换

article/2025/7/27 7:44:42

Python数学可视化——坐标系与变换

在这里插入图片描述


直角坐标与极坐标转换及几何变换

本节将实现坐标系变换可视化工具,包括直角坐标系与极坐标系的相互转换,以及几何变换(平移、旋转、缩放)的数学原理展示。最后通过行星轨道案例演示极坐标的实际应用。

一、核心概念与工具准备

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.projections import PolarAxes
import matplotlib.transforms as transforms
from matplotlib.figure import Figure
from matplotlib.patches import Circle, Ellipse

二、坐标系转换与变换工具

def plot_coordinate_systems(output_path="coordinate_systems.png"):"""可视化直角坐标系与极坐标系对比"""fig = plt.figure(figsize=(14, 6), dpi=120)# 直角坐标系ax1 = fig.add_subplot(121)ax1.set_aspect('equal')ax1.grid(True, linestyle='--', alpha=0.7)ax1.set_xlim(-5, 5)ax1.set_ylim(-5, 5)ax1.set_title("直角坐标系", fontsize=14, pad=15)ax1.set_xlabel('x', fontsize=12)ax1.set_ylabel('y', fontsize=12, rotation=0)# 添加网格点for x in range(-4, 5):for y in range(-4, 5):ax1.plot(x, y, 'bo', markersize=4, alpha=0.5)# 极坐标系ax2 = fig.add_subplot(122, projection='polar')ax2.set_theta_zero_location('E')  # 0度方向朝右ax2.set_theta_direction(-1)  # 顺时针方向ax2.set_rlim(0, 5)ax2.set_title("极坐标系", fontsize=14, pad=15)ax2.grid(True, linestyle='--', alpha=0.7)# 添加网格点for r in np.linspace(1, 4, 4):for theta in np.linspace(0, 2*np.pi, 16, endpoint=False):ax2.plot(theta, r, 'ro', markersize=4, alpha=0.5)plt.tight_layout(pad=3.0)plt.savefig(output_path, bbox_inches='tight')plt.close()print(f"坐标系对比图已保存至: {output_path}")def plot_coordinate_conversion(point, output_path="coordinate_conversion.png"):"""展示单个点的坐标转换过程"""fig = plt.figure(figsize=(12, 6), dpi=120)# 直角坐标系中的点ax1 = fig.add_subplot(121)ax1.set_aspect('equal')ax1.grid(True, linestyle='--', alpha=0.7)ax1.set_xlim(-6, 6)ax1.set_ylim(-6, 6)ax1.set_title(f"直角坐标: ({point[0]:.1f}, {point[1]:.1f})", fontsize=14)# 绘制点和坐标线ax1.plot([0, point[0]], [0, 0], 'b--', alpha=0.5)ax1.plot([point[0], point[0]], [0, point[1]], 'b--', alpha=0.5)ax1.plot(point[0], point[1], 'ro', markersize=8)# 极坐标系中的点r = np.sqrt(point[0]**2 + point[1]**2)theta = np.arctan2(point[1], point[0])ax2 = fig.add_subplot(122, projection='polar')ax2.set_theta_zero_location('E')ax2.set_theta_direction(-1)ax2.set_rlim(0, 6)ax2.set_title(f"极坐标: (r={r:.2f}, θ={np.degrees(theta):.1f}°)", fontsize=14)ax2.grid(True, linestyle='--', alpha=0.7)# 绘制点和坐标线ax2.plot([0, theta], [0, r], 'r-', linewidth=2)ax2.plot(theta, r, 'ro', markersize=8)plt.tight_layout(pad=2.0)plt.savefig(output_path, bbox_inches='tight')plt.close()print(f"坐标转换图已保存至: {output_path}")def plot_geometric_transformations(shape_points, output_path="transformations.png"):"""展示几何变换:平移、旋转、缩放"""fig, axes = plt.subplots(2, 2, figsize=(12, 10), dpi=120)fig.suptitle("几何变换可视化", fontsize=16, y=0.95)# 原始形状axes[0, 0].set_title("原始形状", fontsize=12)axes[0, 0].plot(shape_points[:, 0], shape_points[:, 1], 'bo-')axes[0, 0].set_xlim(-5, 5)axes[0, 0].set_ylim(-5, 5)axes[0, 0].grid(True, linestyle='--', alpha=0.7)axes[0, 0].set_aspect('equal')# 平移变换tx, ty = 2, 1.5translated = shape_points + [tx, ty]axes[0, 1].set_title(f"平移: ({tx}, {ty})", fontsize=12)axes[0, 1].plot(shape_points[:, 0], shape_points[:, 1], 'bo-', alpha=0.3)axes[0, 1].plot(translated[:, 0], translated[:, 1], 'ro-')axes[0, 1].set_xlim(-5, 5)axes[0, 1].set_ylim(-5, 5)axes[0, 1].grid(True, linestyle='--', alpha=0.7)axes[0, 1].set_aspect('equal')# 旋转变换 (30度)angle = np.radians(30)rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)],[np.sin(angle), np.cos(angle)]])rotated = np.dot(shape_points, rotation_matrix.T)axes[1, 0].set_title(f"旋转: {np.degrees(angle):.0f}°", fontsize=12)axes[1, 0].plot(shape_points[:, 0], shape_points[:, 1], 'bo-', alpha=0.3)axes[1, 0].plot(rotated[:, 0], rotated[:, 1], 'go-')axes[1, 0].set_xlim(-5, 5)axes[1, 0].set_ylim(-5, 5)axes[1, 0].grid(True, linestyle='--', alpha=0.7)axes[1, 0].set_aspect('equal')# 缩放变换sx, sy = 1.5, 0.8scaled = shape_points * [sx, sy]axes[1, 1].set_title(f"缩放: ({sx}, {sy})", fontsize=12)axes[1, 1].plot(shape_points[:, 0], shape_points[:, 1], 'bo-', alpha=0.3)axes[1, 1].plot(scaled[:, 0], scaled[:, 1], 'mo-')axes[1, 1].set_xlim(-5, 5)axes[1, 1].set_ylim(-5, 5)axes[1, 1].grid(True, linestyle='--', alpha=0.7)axes[1, 1].set_aspect('equal')plt.tight_layout(pad=3.0)plt.savefig(output_path, bbox_inches='tight')plt.close()print(f"几何变换图已保存至: {output_path}")

三、天文案例:行星轨道可视化

def plot_planetary_orbit(a, e, output_path="planetary_orbit.png"):"""绘制行星轨道(椭圆)在极坐标系中的表示参数:a: 半长轴 (天文单位)e: 离心率 (0 < e < 1)"""# 计算轨道参数b = a * np.sqrt(1 - e**2)  # 半短轴focal_distance = 2 * e * a  # 焦点间距fig = plt.figure(figsize=(12, 6), dpi=130)# 直角坐标系视图ax1 = fig.add_subplot(121)ax1.set_aspect('equal')ax1.set_title("直角坐标系中的椭圆轨道", fontsize=14)ax1.set_xlabel('x (AU)')ax1.set_ylabel('y (AU)')# 绘制椭圆轨道theta = np.linspace(0, 2*np.pi, 300)r = a * (1 - e**2) / (1 + e * np.cos(theta))x = r * np.cos(theta)y = r * np.sin(theta)ax1.plot(x, y, 'b-', linewidth=1.8)# 标记焦点(太阳位置)ax1.plot([-focal_distance/2, focal_distance/2], [0, 0], 'ro', markersize=8)ax1.text(-focal_distance/2 - 0.2, 0.2, "太阳", fontsize=10)# 添加网格和标记ax1.grid(True, linestyle='--', alpha=0.6)ax1.set_xlim(-a*1.2, a*1.2)ax1.set_ylim(-b*1.2, b*1.2)# 极坐标系视图ax2 = fig.add_subplot(122, projection='polar')ax2.set_theta_zero_location('E')ax2.set_theta_direction(-1)ax2.set_title("极坐标系中的椭圆轨道", fontsize=14, pad=20)# 绘制轨道ax2.plot(theta, r, 'b-', linewidth=1.8)# 标记近日点和远日点perihelion_theta = np.piaphelion_theta = 0perihelion_r = a * (1 - e)aphelion_r = a * (1 + e)ax2.plot(perihelion_theta, perihelion_r, 'ro', markersize=8)ax2.plot(aphelion_theta, aphelion_r, 'go', markersize=8)# 添加标签ax2.text(perihelion_theta, perihelion_r, ' 近日点', verticalalignment='bottom', fontsize=9)ax2.text(aphelion_theta, aphelion_r, ' 远日点', verticalalignment='bottom', fontsize=9)# 添加轨道参数标注param_text = f"半长轴: {a} AU\n离心率: {e}"ax2.annotate(param_text, xy=(0.5, 0.95), xycoords='axes fraction',ha='center', va='top', fontsize=10,bbox=dict(boxstyle="round,pad=0.3", fc="white", alpha=0.8))ax2.grid(True, linestyle='--', alpha=0.6)plt.tight_layout(pad=3.0)plt.savefig(output_path, bbox_inches='tight')plt.close()print(f"行星轨道图已保存至: {output_path}")

四、使用示例

if __name__ == "__main__":# 1. 坐标系对比plot_coordinate_systems(output_path="coordinate_systems.png")# 2. 坐标转换演示 (点: (3, 4))plot_coordinate_conversion(point=[3, 4], output_path="coordinate_conversion.png")# 3. 几何变换演示 (三角形)triangle = np.array([[0, 0], [1, 0], [0.5, 1], [0, 0]])plot_geometric_transformations(triangle, output_path="transformations.png")# 4. 行星轨道演示 (地球近似轨道)plot_planetary_orbit(a=1, e=0.017, output_path="earth_orbit.png")# 5. 哈雷彗星轨道plot_planetary_orbit(a=17.8, e=0.967, output_path="halley_orbit.png")

五、生成图像说明

  1. 坐标系对比图 (coordinate_systems.png):

    • 并排展示直角坐标系和极坐标系
    • 显示两种坐标系下的网格点布局
    • 直观比较两种坐标系的表示方式
  2. 坐标转换图 (coordinate_conversion.png):

    • 展示同一点在两种坐标系中的表示
    • 直角坐标显示x,y分量
    • 极坐标显示半径r和角度θ
    • 包含坐标转换公式: r = x 2 + y 2 r = \sqrt{x^2 + y^2} r=x2+y2 , θ = arctan ⁡ 2 ( y , x ) \theta = \arctan2(y, x) θ=arctan2(y,x)
  3. 几何变换图 (transformations.png):

    • 四宫格展示平移、旋转、缩放变换
    • 原始形状显示为蓝色
    • 变换后形状使用不同颜色表示
    • 包含变换矩阵的数学表示
  4. 行星轨道图 (earth_orbit.png, halley_orbit.png):

    • 并排展示直角坐标系和极坐标系中的轨道
    • 标记太阳位置、近日点和远日点
    • 显示轨道参数:半长轴和离心率
    • 地球轨道接近圆形,哈雷彗星轨道高度椭圆

六、教学要点

  1. 数学概念:

    • 直角坐标与极坐标的转换关系
    • 几何变换的矩阵表示
    • 椭圆在极坐标系中的标准方程: r = a ( 1 − e 2 ) 1 + e cos ⁡ θ r = \frac{a(1-e^2)}{1 + e\cos\theta} r=1+ecosθa(1e2)
  2. 天文知识:

    • 开普勒第一定律:行星轨道是椭圆,太阳在焦点
    • 离心率对轨道形状的影响
    • 近日点和远日点的定义与计算
  3. 编程技巧:

    • Matplotlib极坐标投影的使用
    • 坐标变换的矩阵运算实现
    • 复杂图形的多子图布局
    • 科学可视化中的标注技巧

本节代码完整实现了坐标系转换和几何变换的可视化工具,可直接运行生成教学图像。行星轨道案例展示了极坐标在天文学中的实际应用。


http://www.hkcw.cn/article/YjuLDymjYR.shtml

相关文章

樊振东留洋细节:10天前主动联系俱乐部 新挑战与期待

德甲联赛萨尔布吕肯乒乓球甲级俱乐部宣布,奥运冠军樊振东加盟。在俱乐部的官方声明中,樊振东表示他非常期待在萨尔布吕肯和德甲的新挑战,体验新的环境,并与球队一起赢得更多的胜利。新赛季,樊振东将代表俱乐部征战乒乓球德甲联赛。球队经理表示这一切来得如此令人惊讶且迅…

端午节广州一景区发现7个莲花奇观 罕见奇观引游客驻足

5月31日,广州莲花山旅游区出现了多株莲花奇观。端午节假期首日,景区发现了7朵奇特的莲花,其中包括三株并蒂莲、两株双色莲、一株同心莲和一株三心莲,吸引了众多游客驻足拍照。广州莲花山曾多次出现双色、多蒂、多心等罕见的莲花奇观。每年6月下旬至8月是景区的莲花节,也是…

中国女排世联赛名单公布朱婷袁心玥落选 全网炸锅引发热议

2025年中国女排世联赛名单公布后,引起了广泛关注。朱婷和袁心玥两位世界级球星意外落选,取而代之的是一批年轻队员和二线老将。球迷们对此感到困惑:29岁的袁心玥正处于副攻黄金年龄,留洋期间技术还在不断进步;朱婷虽然年过三十,但在土耳其联赛依然稳坐主攻手位置。球迷质…

北大男孩谈如何把时间花在刀刃上 高考冲刺实用攻略

随着高考日益临近,考前10天是知识巩固和心态调整的关键时期。考生应实现复习策略的三个转变,在心态上完成软着陆;家长则需做好后勤保障与心理疏导工作,帮助孩子平稳应考。作为南城巴川学校的一线教师,结合多年的教育实践,分享一些备考经验。例如,语文要逐字抠《赤壁赋》…

计算机网络技术

目录 一、交换机配置 1、以太网MAC地址&#xff08;交换机设备工作在TCLP的数据链路层&#xff09; 2、Ethernet II帧格式 3、交换机工作原理 4、交换机以太网接口的工作模式 4.1、交换机以太网接口双工模式 4.2、交换机以太网接口速率 5、Cisco交换机的命令行 二、路由器配置 …

Java补充(Java8新特性)(和IO都很重要)

一、Lambda表达式 1.1、为什么使用Lambda表达式 Lambda表达式起步案例 下面源码注释是传统写法&#xff0c;代码是简写表达式写法 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.function.Consumer;/* * 学什么…

如何用docker部署ELK?

环境&#xff1a; ELK 8.8.0 Ubuntu20.04 问题描述&#xff1a; 如何用docker部署ELK&#xff1f; 解决方案&#xff1a; 一、环境准备 &#xff08;一&#xff09;主机设置 安装 Docker Engine &#xff1a;版本需为 18.06.0 或更新。可通过命令 docker --version 检查…

【免杀】C2免杀技术(十三)Inline Hook 概念篇

Hook 技术 Hook 技术是操作系统、软件开发和安全攻防中非常核心的技术手段之一。它的本质是“截获函数调用并插入自定义逻辑”。你可以把它理解为“在别人执行某个功能之前或之后偷偷插一脚”。 一、Hook 技术本质 Hook 挂钩技术&#xff0c;指的是&#xff1a; 修改程序运…

PCIe—TS1/TS2 之Polling.Active(一)

前文 训练序列有序集用于比特对齐、符号对齐以及交换物理层参数。2.5GT/s和5GT/s速率时&#xff0c;训练序列有序集不会加扰&#xff0c;只用8b/10b 编码。但到8GT/s及以上速率时&#xff0c;采用128b/130b编码&#xff0c;符号有可能加扰有可能不加扰&#xff0c;具体…

郑钦文说是一颗宝石就该闪烁 为梦想闪耀

郑钦文首次晋级法网八强后,在社交媒体上分享了她的感言:“人都应该有梦,有梦就别怕痛,是一颗宝石就该闪烁。”接下来的1/4决赛中,她将与萨巴伦卡交锋,这将是两人在法网的首次对决。期待郑钦文的表现,为她加油!责任编辑:zx0176

“苏超”凭啥火出圈 足球热浪席卷江苏

江苏省城市足球联赛,被网友们亲切地称为“苏超”,迅速走红。宿迁与徐州的对决吸引了大量关注,网友对“散装江苏”、“十三太保”的梗乐此不疲。话题热度甚至超过了同日举办的欧冠决赛。中国足球似乎看到了希望。“苏超”第三轮,徐州将比赛场地换到了当地最大的奥体中心,现…

负债等于2.6个恒大!中国第一大企业,员工人数超200万 铁路背后的巨额负债

在公共交通出行领域,铁路的客运量远超航空和水路。五一小长假期间,14.65亿人次的出行中,有超过1亿人次选择铁路出行。这背后的服务企业是中国员工规模最大的企业之一,其负债额相当于2.6个恒大。交通运输部数据显示,今年五一假期(5月1日至5日),全社会跨区域人员流动量为…

媒体:大巴黎夺欧冠头号功臣是姆巴佩 平衡之道成就冠军

巴黎圣日耳曼以5比0横扫国际米兰,夺得队史首座欧冠奖杯。赛后,主帅恩里克被誉为居功至伟,有舆论将他与安切洛蒂、瓜迪奥拉并列,称其“自此进入史上最伟大教练行列”。从带领两支不同球队荣获欧冠、11次杯赛决赛全胜以及帮助卡塔尔财团完成欧冠梦想等角度来看,这种评价可谓…

李在明是否能够入主青瓦台 选情胶着悬念待解

韩国宪法法院的8名法官于4月4日宣布总统尹锡悦严重违反了宪法和法律,因此在当地时间11时22分将其罢免。根据韩国宪法规定,总统缺位后必须在60天内举行新总统选举。于是,韩国总统大选随之展开。经过近两个月的激烈竞争,最终共同民主党候选人李在明和国民力量党候选人金文洙进…

健合集团“首亏”背后 起底保健品巨头的“前世今生” 从益生菌到奶粉的转型之路

2024年,健合集团亏损5372万元。曾几何时,通过电视广告的传播,合生元益生菌风靡大江南北。现在不少母婴论坛上,还有一些已经为人父母的80后、90后对合生元进行“考古”,回忆小时候吃益生菌的经历、询问该品牌是否还存在。实际上,合生元从未离开,其背后的港股上市公司H&am…

朴槿惠李明博力挺 金文洙能翻盘吗 保守派最后希望

2025年4月,前总统尹锡悦被弹劾下台后,韩国进入总统大选阶段。最大在野党共同民主党的强劲势头加上尹锡悦带来的负面影响,使执政党国民力量党遭受巨大冲击。在这种背景下,曾在尹锡悦政府任职的前雇佣劳动部长官金文洙作为候选人,将代表这个保守派政党与李在明展开对决。金文…

Day 35 训练

Day 35 训练 环境准备 确保已安装 PyTorch、sklearn、matplotlib、tqdm 等必要的 Python 库。若未安装&#xff0c;可通过以下命令安装&#xff1a; pip install torch scikit-learn matplotlib tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple由于网络原因&#xff0c;使…

C++实现伽罗华域生成及四则运算(三)

目录 原来的求行列式代码改进后的求行列式代码GF(256)域幻方4阶矩阵求逆致敬 上一篇文章介绍了用C实现伽罗华域 G F ( 2 n ) GF(2^n) GF(2n)数的次幂、矩阵数乘、方阵次幂、求行列式、求伴随矩阵、逆矩阵的函数&#xff0c;本篇继续&#xff0c;对求行列式的函数进行改进&#…

【AIGC专栏】微软Bing ImageCreator 创建图片

图像创建器是一款产品,可帮助用户使用 DALLE 3 生成 AI 图像。得到文本提示后,AI 将生成一组与该提示匹配的图像。 当前的Bing Image Creator 依然处在预览周期,所以很多区域无法访问。特别是位于中国大陆和香港、澳门区域都无法正常使用这些服务。 另外还有两个条件: 注…

2025年05月总结及随笔之家电询价及以旧换新

1. 回头看 日更坚持了882天。 读《数据自助服务实践指南&#xff1a;数据开放与洞察提效》更新完成读《数据科学伦理&#xff1a;概念、技术和警世故事》开更并更新完成读《红蓝攻防&#xff1a;技术与策略》开更并持续更新 2023年至2025年05月底累计码字2356176字&#xff…