Este es un problema trivial, pero me lo encuentro una y otra vez y estoy seguro de que hay una solución elegante que me gustaría utilizar.

Hago matemáticas con numpy y me gustaría trazar líneas que son resultados de cálculos de álgebra lineal. Estas líneas vienen en forma ingrese la descripción de la imagen aquí

Así que me gustaría "subcontratar" el trabajo de encontrar el punto final de inicio de mi línea a un trazo inteligente de código Python, para que mi línea resultante se dibuje en mi trama 3D, respetando las dimensiones existentes de la trama. P.ej. si tracé una parábola 3D de x = -2 a 2 yz = -3 a 3, y quisiera dibujar una línea ingrese la descripción de la imagen aquí, se daría cuenta de que tendría que empezar en (-2,1, -2) y terminar en (2,1,2).

¿Cómo podría funcionar eso?

1
Andreas Schuldei 22 oct. 2020 a las 00:54

1 respuesta

La mejor respuesta

Al principio, es importante definir el parámetro projection. En segundo lugar, debe trabajar con diferentes formas de P, v y z para obtener los parámetros X, Y, Z que corresponde a las coordenadas del método plot:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

P = np.array([1,1,1]).reshape(-1,1)
v = np.array([1,0,1]).reshape(-1,1)
z = np.linspace(-3,3,100)
X, Y, Z = P + v*z

ax.plot(X, Y, Z)
plt.show()

Por comentarios

reshape(-1, 1) agrega una dimensión adicional que se requiere para la transmisión (también puede leer un buen tutorial sobre este tema). También es un sustituto de reshape(3, 1). El caso simple (arr1 = v; arr2 = np.linspace(-3,3,11)) se puede visualizar así:

enter image description here

Los puntos finales de una curva g = (1, 1, 1) + z * (1, 0, 1) están en los límites del intervalo de z, a saber:

g1 = (1, 1, 1) + (-3) * (1, 0, 1) = (-2, 1, -2)
g2 = (1, 1, 1) + 3 * (1, 0, 1) = (4, 1, 4)

Tenga en cuenta que se necesita z = 1 para obtener el punto final = (2,1,2)

3
mathfux 22 oct. 2020 a las 17:34