You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算并绘制笛卡尔平面内二维卡西尼曲线的点

笛卡尔平面中二维卡西尼曲线的计算与绘制方法

嘿,我来帮你搞定卡西尼曲线的计算和绘制!先理清楚核心逻辑,再给你具体的实现方案~

卡西尼曲线的核心定义

卡西尼曲线的本质是:平面上任意一点到两个固定焦点的距离乘积等于常数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:29:20