2 votes

Existe-t-il un moyen simple de faire pivoter un maillage 3D de 90 degrés dans plotly ?

J'ai créé un maillage 3d dans plotly en utilisant la fonction plotly.graph_objects.Mesh3d. Veuillez voir l'image suivante.

enter image description here

Existe-t-il un moyen simple de faire pivoter ce maillage 3D de 90 degrés ? Veuillez voir l'image suivante pour voir comment je veux faire la rotation.

enter image description here

2voto

Derek O Points 4883

Bien que je ne sache pas exactement comment vous avez créé la surface rectangulaire en maillage 3d, je peux la recréer en passant les coordonnées x,y,z des quatre coins de votre surface, ainsi que l'axe de Delaunay à go.Mesh3d . L'axe de Delaunay indique à Plotly la direction perpendiculaire à votre surface afin de construire le maillage. Vous pouvez spécifier l'axe de Delaunay comme étant soit 'x' o 'y' et la surface sera rendue correctement :

import plotly.graph_objects as go

x = [11.5,11.5,14.5,14.5]
y = [19,19,13,13]
z = [436,441,436,441]

fig = go.Figure(data=[
    go.Mesh3d(
        x=x,
        y=y,
        z=z,
        delaunayaxis='y'
    )
])

fig.show()

enter image description here

Lorsque vous faites pivoter votre plan de manière à ce qu'il soit parallèle au plan xy, les deux coordonnées z d'origine au bas du plan restent fixes, mais les coordonnées des deux nouveaux plans peuvent être calculées en utilisant les propriétés des vecteurs perpendiculaires.

Considérons le diagramme ci-dessous (les vecteurs ne sont pas dessinés avec précision mais nous espérons que l'explication suivante aura un sens). Lorsque vous faites pivoter votre plan de maillage 3d jusqu'à z=436, le nouveau vecteur bleu doit être perpendiculaire au vecteur vert et avoir une longueur de 5 (la même distance de 436 à 441 dans le plan de maillage 3d original que vous avez dessiné). Le vecteur vert peut être décomposé en composantes x et y représentées en rouge. Si le vecteur vert a une direction (v_x, v_y) alors le vecteur bleu aura une direction (-v_y, v_x) . Nous pouvons ensuite normaliser ce vecteur (diviser par sa longueur) et le multiplier par 5 pour obtenir le vecteur final. Ajoutez ce vecteur aux points a y b et nous obtenons nos nouvelles coordonnées c y d .

! enter image description here

En utilisant quelques opérations de base de numpy pour nous aider, nous pouvons traduire ce qui précède en code ( a y b sont les coordonnées inférieures de la maille qui resteront les mêmes après la rotation, et c y d sont les nouvelles coordonnées). De même, lorsque vous ajoutez le maillage 3D pivoté, vous voudrez changer l'axe de Delaunay en z puisque l'axe z est perpendiculaire à notre nouvelle surface :

import numpy as np

## make points a and b the bottom two points
a = np.array((x[0], y[0], z[0]))
b = np.array((x[2], y[2], z[2]))
v = b-a

## create a perpendicular unit vector
v_perp_unit = np.array([-1*v[1], v[0], v[2]]) / np.linalg.norm(v)
v_length = max(z) - min(z)

v_perp = v_length*v_perp_unit

## calculate the coordinates of the final two points
c = a+v_perp
d = b+v_perp

x_new = [a[0],b[0],c[0],d[0]]
y_new = [a[1],b[1],c[1],d[1]]
z_new = [a[2],b[2],c[2],d[2]]

fig = go.Figure(data=[
    go.Mesh3d(
        x=x_new,
        y=y_new,
        z=z_new,
        delaunayaxis='z'
    )
])

fig.show()

enter image description here

Si vous ajoutez le plan de maillage 3d nouvellement tourné comme trace, vous pouvez voir que l'original et vérifier que les deux plans sont bien perpendiculaires :

fig.add_trace(
    go.Mesh3d(
        x=x_new,
        y=y_new,
        z=z_new,
        delaunayaxis='z'
    )
)

fig.show()

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X