es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python – Recorte de una superficie en una trama 3D

Tengo un código Python para trazar dos superficies. Sin embargo, se superponen en una línea donde me gustaría “recortar” esas superficies para obtener un borde perfecto en su intersección. Mi código hasta ahora es:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import time
import pdb
start_time = time.time()

fig = plt.figure(figsize=(8,4))
ax = fig.add_subplot(projection='3d')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

x = np.linspace(-2.5,3.104,1000)
y = np.linspace(-0.746,0,1000)-1
X, Y = np.meshgrid(x, y)
Z = -1.0716*(Y+1)
solid = ax.plot_surface(X,Y,Z,cmap=cm.coolwarm,linewidth=0, antialiased=True)

y = np.linspace(-1.746,1,1000)
x = np.linspace(0,0.604,1000) + 2.5
X, Y = np.meshgrid(x, y) 
Z = 1.323*(X-2.5)
solid = ax.plot_surface(X,Y,Z,cmap=cm.coolwarm,linewidth=0, antialiased=True)

Mi plan original era trazar esas dos regiones “de esquina” por separado como triángulos de los que conozco los vértices, sin embargo, no estaba claro cómo podía adoptar el mismo mapeo de colores que deseo, ya que la forma conveniente de hacer estas regiones triangulares es establecer un plano limitado, por ejemplo, esta pregunta, donde el triángulo está definido estableciendo Z[Z<0]=0.

El problema es que no sé cómo establecer una condición similar para definir mi región triangular porque depende de una línea dentro de ese plano, que no es constante como en la otra pregunta. Todos los puntos donde ocurren las intersecciones entre los planos se pueden calcular, solo que no sé cómo establecer esta visualización en Python. ¡Gracias de antemano!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para “recortar” las superficies donde se superponen, se pueden establecer los valores Z de la región superpuesta como el promedio de los valores Z de las dos superficies en ese punto. Aquí hay un fragmento de código de ejemplo para lograr esto:

    intercept = 2.5 # valor x de la intersección
    idx = np.argmin(np.abs(x - intercept)) # encontrar el índice del valor x más cercano
    
    # establecer los valores Z de la región superpuesta como el promedio de las dos superficies
    Z[idx:, :] = 0.5 * (1.323*(X[idx:, :]-2.5) - 1.0716*(Y[idx:, :]+1))
    
    # dibujar las superficies recortadas
    solid = ax.plot_surface(X[:idx, :], Y[:idx, :], Z[:idx, :], cmap=cm.coolwarm, linewidth=0, antialiased=True)
    solid = ax.plot_surface(X[idx:, :], Y[idx:, :], Z[idx:, :], cmap=cm.coolwarm, linewidth=0, antialiased=True)
    

    En este fragmento, encontramos el índice del valor x más cercano al punto de intersección, luego establecemos los valores Z de la región superpuesta (con valores x mayores que intercept) como el promedio de las dos superficies en cada punto. Finalmente, dibujamos las superficies recortadas utilizando el código original para cada superficie, pero solo dibujamos las regiones que no se superponen (utilizando la segmentación para excluir la región superpuesta). Esto debería darle el resultado deseado con una intersección limpia entre las superficies.

Comments are closed.