Как нарисовать ленту, обернутую вокруг сферы, в matplotlib?Python

Программы на Python
Ответить
Anonymous
 Как нарисовать ленту, обернутую вокруг сферы, в matplotlib?

Сообщение Anonymous »

Я пытаюсь построить ленту, обернутую вокруг сферы, но без особого успеха.
Результат должен выглядеть следующим образом: по сути это часть поверхности сферы, но только часть ленты.
Изображение

Код, который я написал:

Код: Выделить всё

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()
Это текущий результат:
Изображение

Кто-нибудь может мне помочь?

Подробнее здесь: https://stackoverflow.com/questions/778 ... matplotlib
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»