Я пытаюсь построить ленту, обернутую вокруг сферы, но без особого успеха.
Результат должен выглядеть следующим образом: по сути это часть поверхности сферы, но только часть ленты.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Funzione per convertire le coordinate sferiche in coordinate cartesiane
# Le coordinate sferiche ci permettono di rappresentare la sfera in modo più semplice
def sferiche_a_cartesiane(r, theta, phi): # r raggio che varia, theta è la colatitudine
x = r * np.sin(phi) * np.cos(theta)
y = r * np.sin(phi) * np.sin(theta)
z = r * np.cos(phi)
return x, y, z
# Genera le coordinate sferiche per la sfera usando un numpy array di x numeri equidistanti
theta_sfera = np.linspace(0, 2 * np.pi, 100)
phi_sfera = np.linspace(0, np.pi, 50)
theta_sfera, phi_sfera = np.meshgrid(theta_sfera, phi_sfera) # coordinate vere e proprie
# Imposta il raggio della sfera
raggio_sfera = 1.0
# Calcola le coordinate cartesiane dalla sferiche
x_sfera, y_sfera, z_sfera = sferiche_a_cartesiane(raggio_sfera, theta_sfera, phi_sfera)
# Crea la figura e gli assi 3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Disegna la sfera
ax.plot_surface(x_sfera, y_sfera, z_sfera, color='r', alpha=0.1, edgecolors=None, zorder=0)
t = np.linspace(-1, 1, 1000) # t appartiene a [-1, 1]
# Genera la curva parametrica con raggio leggermente ingrandito. Si derivano dal fatto che la sfera ha eq. x**2 + y**2 + z**2 = 1
x_curva = 1.01 * ((1 - t**2)**0.5) * np.cos(10 * np.pi * t)
y_curva = 1.01 * ((1 - t**2)**0.5) * np.sin(10 * np.pi * t)
z_curva = 1 * t
# Ruota la curva parametrica attorno alla sfera
angolo_rotazione = np.pi / 4
x_rotato = x_curva * np.cos(angolo_rotazione) - y_curva * np.sin(angolo_rotazione)
y_rotato = x_curva * np.sin(angolo_rotazione) + y_curva * np.cos(angolo_rotazione)
z_rotato = z_curva
# Disegna la curva parametrica ruotata
ax.plot(x_rotato, y_rotato, z_rotato, 'y', linewidth=2, zorder=1)
# Imposta gli assi
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# Mostra il grafico
plt.show()
Я пытаюсь построить ленту, обернутую вокруг сферы, но без особого успеха. Результат должен выглядеть следующим образом: по сути это часть поверхности сферы, но только часть ленты. [img]https://i.sstatic.net/eAguK52v.png[/img]
Код, который я написал: [code]import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D
# Funzione per convertire le coordinate sferiche in coordinate cartesiane # Le coordinate sferiche ci permettono di rappresentare la sfera in modo più semplice def sferiche_a_cartesiane(r, theta, phi): # r raggio che varia, theta è la colatitudine x = r * np.sin(phi) * np.cos(theta) y = r * np.sin(phi) * np.sin(theta) z = r * np.cos(phi) return x, y, z
# Genera le coordinate sferiche per la sfera usando un numpy array di x numeri equidistanti theta_sfera = np.linspace(0, 2 * np.pi, 100) phi_sfera = np.linspace(0, np.pi, 50) theta_sfera, phi_sfera = np.meshgrid(theta_sfera, phi_sfera) # coordinate vere e proprie
# Imposta il raggio della sfera raggio_sfera = 1.0
# Calcola le coordinate cartesiane dalla sferiche x_sfera, y_sfera, z_sfera = sferiche_a_cartesiane(raggio_sfera, theta_sfera, phi_sfera)
# Crea la figura e gli assi 3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d')