绘制heart-shaped心形曲线

上网突然查到某水饮的广告,原来讲述的是一个很凄美的爱情传输——笛卡尔和瑞典公主的爱情故事。
可终于弄懂那个很含蓄的广告了。

然后发现了笛卡尔心形曲线这个好玩的东西。就上网查了查,还是有很多好玩的介绍和示例的。

数学这门科学,我觉得还是很深奥的,但是我确实是还给老师了都。
所以函数曲线这些算法,是真的不行了。
只能是参考网上的资料学习一下。

Cardioid-心脏线

心脏线,又称心形线,是有一个尖点的外摆线。也就是说,一个圆沿着另一个半径相同的圆滚动时,圆上一点的轨迹就是心脏线。(参考Cardioid - Wikipedia

笛卡尔心形公式

笛卡尔心形公式:r=a(1-sinθ)
通过python代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt

def plot_cardioid(a):
theta = np.linspace(0, 2 * np.pi, 1000)
r = a * (1 - np.sin(theta))
x = r * np.cos(theta)
y = r * np.sin(theta)

plt.figure(figsize=(8, 8))
plt.plot(x, y)
plt.axis('equal')
plt.title(f'Cardioid: r = {a}(1 - sinθ)')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()
# 绘制r=a(1-sinθ)曲线,其中a=1
plot_cardioid(1)

呈现效果:

更接近心形的曲线

找了些更接近心形的曲线,挺好看挺好看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import matplotlib.pyplot as plt

def plot_heart_curve():
x = np.linspace(-2, 2, 500)
y = np.linspace(-2, 2, 500)
X, Y = np.meshgrid(x, y)
Z = (X**2 + Y**2 - 1)**3 - X**2 * Y**3

plt.figure(figsize=(8, 8))
plt.contour(X, Y, Z, [0], colors='red')
plt.axis('equal')
plt.title('Heart Curve: (x^2 + y^2 - 1)^3 - x^2y^3 = 0')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()

# 绘制函数曲线 (x^2+y^2-1)^3-x^2y^3=0
plot_heart_curve()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2 * np.pi, 1000)
a = 16 * np.sin(t)**3
b = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)
x = a
y = b

plt.figure(figsize=(8, 8))
plt.plot(x, y)
plt.axis('equal')
plt.title('Closest Heart-Shaped Curve')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()