3D 하트 그래픽: 파이썬으로 사랑을 표현하는 법, python으로 하트 만들기Memo/Things2023. 12. 1. 14:15
Table of Contents
반응형

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt
import numpy as np
from skimage import measure
# Set up mesh
n = 100
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
z = np.linspace(-3, 3, n)
X, Y, Z = np.meshgrid(x, y, z)
# Create cardioid function
def f_heart(x, y, z):
F = (2*x**2 + 2*y**2 + z**2 - 1)**3 - 1/10*x**2*z**3 - y**2*z**3
return F
# Obtain value at every point in mesh
vol = f_heart(X, Y, Z)
verts, faces, normals, values = measure.marching_cubes(vol, 0, spacing=(0.1, 0.1, 0.1))
# Create a 3D figure
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
# Plot the surface
ax.plot_trisurf(verts[:, 0], verts[:,1], faces, verts[:, 2],
cmap='Spectral', lw=1)
ax.view_init(20, -20)
plt.show()파이썬은 그 힘과 유연성으로 데이터 시각화에서 매우 중요한 도구입니다. 이 코드는 3차원 공간에 마치 심장 모양을 하고 있는 표면을 생성하고 시각화하는 것입니다. 이를 위해 여러 단계를 거치는데, 이를 하나씩 살펴보겠습니다.
라이브러리 임포트: 필요한 라이브러리들을 임포트합니다.
Axes3D는 3D 플롯을 생성하는 데 필요합니다.pyplot은 그래픽 관련 기능을 제공합니다.numpy는 수치 계산을 위해 사용됩니다.skimage.measure의marching_cubes함수는 3D 볼륨 데이터로부터 표면을 추출하는 데 사용됩니다.
메시 설정:
x,y,z는 각각 -3에서 3까지 범위의 값을 가지며, 이들의 조합을 통해 3D 공간상의 점들을 생성합니다.np.meshgrid함수는 이 1차원 배열들을 3차원 그리드로 변환합니다.
심장 모양 함수 정의:
f_heart함수는 주어진 (x), (y), (z) 좌표에 대해 심장 모양의 수학적 표현을 계산합니다.메시 포인트에 함수 적용:
vol은f_heart함수를 메시의 모든 점에 적용한 결과입니다. 이것은 3D 볼륨 데이터를 나타냅니다.
Marching Cubes 알고리즘 적용:
measure.marching_cubes함수는 이 볼륨 데이터로부터 표면(verts, faces)을 추출합니다. 이는 주어진 볼륨 데이터 내에서 0의 값에 해당하는 표면을 찾는 것입니다.
3D 플롯 생성:
plt.figure와add_subplot을 사용하여 3D 플롯을 생성합니다.plot_trisurf함수는 추출된 표면(verts, faces)을 시각화합니다. 이 때cmap은 색상 맵을,lw는 선의 두께를 지정합니다.
시점 설정 및 표시:
ax.view_init함수는 플롯의 시점을 조정합니다.- 마지막으로
plt.show()를 통해 생성된 3D 플롯을 표시합니다.
이렇게 전체 과정을 통해 3차원 심장 모양의 객체를 생성하고 시각화하는 것을 볼 수 있습니다.
이 과정을 통해 독자들은 파이썬을 사용하여 복잡한 수학적 표현을 시각화하는 방법과 함께, 3D 데이터를 플로팅하고 조작하는 기본적인 방법을 배울 수 있습니다. 이러한 프로젝트는 파이썬이 단순한 데이터 분석 이상의 것을 할 수 있음을 보여주며, 코딩과 수학을 접목시킬 수 있는 무한한 가능성을 열어줍니다.

반응형
@Ray 수학 :: Ray 수학
You know what's cooler than magic? Math.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!