如何计算并绘制笛卡尔平面内二维卡西尼曲线的点
笛卡尔平面中二维卡西尼曲线的计算与绘制方法
嘿,我来帮你搞定卡西尼曲线的计算和绘制!先理清楚核心逻辑,再给你具体的实现方案~
卡西尼曲线的核心定义
卡西尼曲线的本质是:平面上任意一点到两个固定焦点的距离乘积等于常数k。用公式表示就是:
$$r_1 = |p-a|$$
$$r_2 = |p-b|$$
$$r_1 r_2 = k$$
其中$p=(x,y)$是曲线上的点,$a$、$b$是两个焦点的坐标。通常我们会把焦点放在对称位置(比如$(-c, 0)$和$(c, 0)$)来简化计算,这样更直观——你提到的“外侧曲线k值更大”完全符合这个设定:k越大,曲线会向外舒展得越开。
计算与绘图思路
你提到的“从0到2π迭代计算x值”的思路非常可行,我们可以结合极坐标来简化计算,步骤如下:
- 先把卡西尼曲线转化为极坐标方程:当焦点在$(-c,0)$和$(c,0)$时,极坐标下的方程为:
$$r^4 - 2c^2 r^2 \cos2θ = k^2 - c^4$$ - 对这个方程求解$r$,得到:
$$r = \sqrt{c^2 \cos2θ + \sqrt{c^4 \cos^22θ + k^2 - c^4}}$$ - 遍历$θ$从0到2π的所有值,计算对应的$r$,再转换成直角坐标$(x=r \cosθ, y=r \sinθ)$,收集这些点后就能绘图了。
具体代码实现(Python + Matplotlib)
下面是可直接运行的代码,我们会绘制两个不同k值的曲线,对比“外侧大k曲线”的效果:
import numpy as np import matplotlib.pyplot as plt # 配置参数 c = 1 # 焦点到原点的距离,焦点坐标为(-c, 0)和(c, 0) k_list = [1.2, 2] # 两个k值,k=2的曲线会在外侧 theta = np.linspace(0, 2 * np.pi, 1000) # 生成0到2π的1000个角度点,保证曲线平滑 plt.figure(figsize=(8, 8)) for k in k_list: # 计算根号内的项,避免负数开平方 sqrt_inner = c**4 * np.cos(2 * theta)**2 + k**2 - c**4 sqrt_term = np.sqrt(np.maximum(sqrt_inner, 0)) # 处理可能的负数,取0替代 r_squared = c**2 * np.cos(2 * theta) + sqrt_term r = np.sqrt(np.maximum(r_squared, 0)) # 再次确保非负 # 极坐标转直角坐标 x = r * np.cos(theta) y = r * np.sin(theta) # 绘制曲线 plt.plot(x, y, label=f'k = {k}') # 标记两个焦点 plt.scatter([-c, c], [0, 0], color='red', marker='o', label='焦点') # 绘图美化 plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('卡西尼曲线对比') plt.legend() plt.axis('equal') # 保证坐标轴比例一致,曲线不失真 plt.grid(True, linestyle='--', alpha=0.7) plt.show()
额外说明
- 当$k > c$时,曲线是一条连通的闭合曲线;当$k = c$时,曲线退化为伯努利双纽线;当$k < c$时,曲线会分成两个分离的闭合曲线。
- 代码里的
np.maximum是为了处理某些$θ$下根号内出现负数的情况(此时没有实数解,直接跳过这些点)。
内容的提问来源于stack exchange,提问作者Francesco Boi
相关产品推荐
相关产品推荐

