Problème de paramétrisation ?

Discussions générales concernant les mathématiques et n'entrant pas dans les catégories suivantes.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Problème de paramétrisation ?

Message non lu par rebouxo »

Bonjour à tous et bonne année.
Je suis tombé sur un article et j'essaye de refaire une figure. Il s'agit d'un cercle sur cylindre. J'ai cette paramétrisation :
$x = a\cos(u \cos(v))$, $y = a\sin(u \cos(v))$, $z = r\sin(v)$

J'ai donc fait un code en python (car pour l'instant, asymptote continue à refuser de me faire de la 3D) que voici :

Code : Tout sélectionner


from mpl_toolkits.mplot3d import Axes3D

from pylab import *
from mpl_toolkits.mplot3d import Axes3D

a = 1
r = 5

fig = figure()
ax = Axes3D(fig)
# On fabrique les deux paramètres u et v
# a priori on est dans des fct trigo, donc entre 0 et 2pi
u = np.linspace(-pi,pi,32)
v = np.linspace(-pi,pi,40)



def x(u,v):
    """
    """
    return a*np.cos(u*np.cos(v))

def y(u,v):
    """
    """
    return a*np.sin(u*np.cos(v)) 

def z(v):
    """
    """
    return r*np.sin(v)

# On trace les lignes à U constant
for U in u :
    X = x(U,v)
    Y = y(U,v)
    Z = z(v)
    ax.plot(X,Y,Z,color='k')
# On trace les lignes à V constant
for V in v :
    X = x(u,V)
    Y = y(u,V)
    Z = z(V)
    ax.plot(X,Y,Z,color='r')

    
# On frabrique la grille en u et v
# Ici, u et v sont des matrices 40*32
u, v = np.meshgrid(u,v)
X = x(u,v)
Y = y(u,v)
Z = z(v)

# on trace la surface 
ax.plot_surface(X, Y, Z)#,antialiased=False)

show()
Pour l'instant j'arrive à faire ceci :
ferreol_03.png
et je voudrais cela :
ferreol_03.jpg
ferreol_03.jpg (24 Kio) Consulté 6586 fois
Il me semble avoir tracé les lignes correspondants à $u$ et $v$ constants. Celles-ci sont en noires sur la 2e images (selon l'auteur). Et je les ai mises en rouges et en noires sur ma figure. Dans les deux figures elles ne se ressemblent pas du tout. Je pense à un problème de parcours de mes paramètres, mais sans en être sur.

Est-ce que quelqu'un a une idée ?
Est-ce que l'on peut avoir une image sans transparence avec python ?



Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
OG
Modérateur honoraire
Modérateur honoraire
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Problème de paramétrisation ?

Message non lu par OG »

Et avec $z=au\sin(v)$ ?
Pièces jointes
Figure_1.png
OG
Modérateur honoraire
Modérateur honoraire
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Problème de paramétrisation ?

Message non lu par OG »

Pour la transparence, c'est possible mais visiblement limité, voir
https://matplotlib.org/mpl_toolkits/mplot3d/faq.html

Code : Tout sélectionner

ax.plot_surface(X, Y, Z,
                 #rstride=5, cstride=5,
                        cmap='seismic',
                        alpha=.5,
                        linewidth=0,
                        antialiased=True)
donne ceci
Pièces jointes
Figure_1.png
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: Problème de paramétrisation ?

Message non lu par rebouxo »

Salut Olivier et merci pour les suggestions cela à l'air de fonctionner. Comment tu as pensé à changer la fonction z ?
Edit : une petite recherche internet, et j'ai la solution... Dans l'article, il y a une coquille. J'ai bien fait d'essayer de refaire la ficgure.
Pour la transparence j'avais réglé le problème en passant à python3, et une version plus récente de matplotlib. Mais maintenant j'ai les lignes ou la surface.
EDIT 2 : bon, ben si en réglant, alpha, cela règle le problème. Bon, j'aimerais quand même avoir les lignes et pas de transparence (dans le genre pénible...)

Donc le problème n'est pas complètement résolu. Est-ce que quelqu'un peut essayer avec asymptote ? Je n'arrive pas à régler mon problème d'asymptote avec la 3D. J'ai un core dumped.

Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
OG
Modérateur honoraire
Modérateur honoraire
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Problème de paramétrisation ?

Message non lu par OG »

Hello Olivier

Pour la fonction, plutôt que de me lancer dans les calculs, j'ai fait une recherche internet, comme toi.

Peux-tu donner ton code final en Python ? et le code Asymptote ?

A+
O.G.
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: Problème de paramétrisation ?

Message non lu par rebouxo »

Code : Tout sélectionner


from mpl_toolkits.mplot3d import Axes3D

from pylab import *
from mpl_toolkits.mplot3d import Axes3D
print(matplotlib.__version__)
a = 1
r = 5

fig = figure()
#ax = Axes3D(fig) #
ax = fig.gca(projection='3d')
ax.set_axis_off()
# On fabrique les deux paramètres u et v
# a priori on est dans des fct trigo, donc entre 0 et 2pi
u = np.linspace(-pi,pi,32)
v = np.linspace(-pi,pi,40)



def x(u,v):
    """
    """
    return a*np.cos(u*np.cos(v))

def y(u,v):
    """
    """
    return a*np.sin(u*np.cos(v)) 

def z(u,v):
    """
    """
    return a*u*np.sin(v)
    
# On frabrique la grille en u et v
# Ici, u et v sont des matrices 40*32
u, v = np.meshgrid(u,v)
X = x(u,v)
Y = y(u,v)
Z = z(u,v)

# on trace la surface 
ax.plot_surface(X, Y, Z,cmap='Blues',antialiased=True,alpha=0.6)

# On repart sur des lignes, donc on recréer u et v
u = np.linspace(-pi,pi,32)
v = np.linspace(-pi,pi,40)

# On trace les lignes à U constant
for U in u :
    X = x(U,v)
    Y = y(U,v)
    Z = z(U,v)
    ax.plot(X,Y,Z,color='k',lw=2)
# On trace les lignes à V constant
for V in v :
    X = x(u,V)
    Y = y(u,V)
    Z = z(u,V)
    ax.plot(X,Y,Z,color='k',lw=2)


show()
Et cela donne cela :
ferreol_03.png
Par contre pour l'asymptote c'est virtuel ;-). Vu que je ne peux rien tester du tout.

Code : Tout sélectionner

import graph3;
import grid3;
import palette;

currentprojection=orthographic(0.8,1,1);

real a = 1 ;
real r = 5 ;
  

real x(pair z){return  a*cos(z.x*cos(z.y)) ;}

real y(pair z){return  a*sin(z.x*cos(z.y)) ;}

real z(pair z){return  a*z.x*sin(z.y) ;}

triple f(pair Z){return (x(Z),y(Z),z(Z)) ;}

surface s=surface(f,(-pi,-pi),(pi,pi),50);

draw(s,mean(palette(s.map(zpart),Rainbow())),black);

grid3(XYZgrid);
Me renvoi un singular matrix dans ma g (avec emacs) et en ligne de commande :

Code : Tout sélectionner

olivier@olivier-UX303LN:~/Documents/APMEP/AFDM/531/images$ asy -vvv ferreol_03.asy
Using configuration directory /home/olivier/.asy
Loading config.asy from /home/olivier/.asy/config.asy
Using history /home/olivier/.asy/history
Welcome to Asymptote version 2.47
cd /home/olivier/Documents/APMEP/AFDM/531/images
Processing ferreol_03
Loading plain from /home/olivier/asymptote/share/asymptote/plain.asy
Including plain_constants from /home/olivier/asymptote/share/asymptote/plain_constants.asy
Loading version from /home/olivier/asymptote/share/asymptote/version.asy
Including plain_strings from /home/olivier/asymptote/share/asymptote/plain_strings.asy
Including plain_pens from /home/olivier/asymptote/share/asymptote/plain_pens.asy
Including plain_paths from /home/olivier/asymptote/share/asymptote/plain_paths.asy
Including plain_filldraw from /home/olivier/asymptote/share/asymptote/plain_filldraw.asy
Including plain_margins from /home/olivier/asymptote/share/asymptote/plain_margins.asy
Including plain_picture from /home/olivier/asymptote/share/asymptote/plain_picture.asy
Loading plain_scaling from /home/olivier/asymptote/share/asymptote/plain_scaling.asy
Loading simplex from /home/olivier/asymptote/share/asymptote/simplex.asy
Loading plain_bounds from /home/olivier/asymptote/share/asymptote/plain_bounds.asy
Including plain_scaling from /home/olivier/asymptote/share/asymptote/plain_scaling.asy
Including plain_prethree from /home/olivier/asymptote/share/asymptote/plain_prethree.asy
Including plain_Label from /home/olivier/asymptote/share/asymptote/plain_Label.asy
Including plain_shipout from /home/olivier/asymptote/share/asymptote/plain_shipout.asy
Including plain_arcs from /home/olivier/asymptote/share/asymptote/plain_arcs.asy
Including plain_boxes from /home/olivier/asymptote/share/asymptote/plain_boxes.asy
Including plain_markers from /home/olivier/asymptote/share/asymptote/plain_markers.asy
Including plain_arrows from /home/olivier/asymptote/share/asymptote/plain_arrows.asy
Including plain_debugger from /home/olivier/asymptote/share/asymptote/plain_debugger.asy
Loading ferreol_03.asy from ferreol_03.asy
Loading graph3 from /home/olivier/asymptote/share/asymptote/graph3.asy
Loading math from /home/olivier/asymptote/share/asymptote/math.asy
Loading graph from /home/olivier/asymptote/share/asymptote/graph.asy
Loading graph_splinetype from /home/olivier/asymptote/share/asymptote/graph_splinetype.asy
Loading graph_settings from /home/olivier/asymptote/share/asymptote/graph_settings.asy
Loading three from /home/olivier/asymptote/share/asymptote/three.asy
Loading embed from /home/olivier/asymptote/share/asymptote/embed.asy
Including three_light from /home/olivier/asymptote/share/asymptote/three_light.asy
Including three_surface from /home/olivier/asymptote/share/asymptote/three_surface.asy
Loading bezulate from /home/olivier/asymptote/share/asymptote/bezulate.asy
Loading interpolate from /home/olivier/asymptote/share/asymptote/interpolate.asy
Including three_margins from /home/olivier/asymptote/share/asymptote/three_margins.asy
Including three_tube from /home/olivier/asymptote/share/asymptote/three_tube.asy
Including three_arrows from /home/olivier/asymptote/share/asymptote/three_arrows.asy
Loading grid3 from /home/olivier/asymptote/share/asymptote/grid3.asy
Loading palette from /home/olivier/asymptote/share/asymptote/palette.asy
Exporting ferreol_03 as 16x32 image using tiles of size 16x32
/home/olivier/asymptote/share/asymptote/three.asy: 2906.13: runtime: 
Merci du coup de main.
Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
OG
Modérateur honoraire
Modérateur honoraire
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Problème de paramétrisation ?

Message non lu par OG »

Bonsoir Olivier

Avec Python, l'idéal doit être d'utiliser mayavi. J'ai fait des tests mais j'ai un souci, je n'arrive pas à avoir des surfaces opaques,
peut-être une question d'OpenGL, de driver. Ça vaut la peine d'aller voir.

Avec asymptote (qui fonctionne) j'ai modifié la perspective, la commande surface pour avoir les lignes
plus épaisses et aussi une surface bien lisse Spline et une subdivision de 40 au lieu de 50 (sinon message d'erreur).
Pour plus d'efficacité du code, il faudrait séparer la tracé de la surface (un nombre plus raisonnable que 40)
et le tracé des cercles.

Code : Tout sélectionner

size(10cm);
    //currentprojection=orthographic(0.8,1,1);
currentprojection=perspective(
camera=(6.89555204358565,-0.202651025110598,0.560478864645526),
up=(-0.00202991052033317,-2.45275889184512e-05,0.0257124463336049),
target=(0.0205858388675395,-0.0346730678176943,0.0178815384665421),
zoom=1,
angle=55.8441918782128,
autoadjust=false);
 surface s=surface(f,(-pi,-pi),(pi,pi),40,Spline);
draw(s,mean(palette(s.map(zpart),Rainbow())),black+1bp);
et voici le résultat joint (après mise à dimension).
Pièces jointes
h167.png
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: Problème de paramétrisation ?

Message non lu par rebouxo »

Cool.
Tu es sur quel système ?
Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
OG
Modérateur honoraire
Modérateur honoraire
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Problème de paramétrisation ?

Message non lu par OG »

rebouxo a écrit :Cool.
Tu es sur quel système ?
Olivier
Depuis plus de 10 ans : Linux Debian Sid 64bits (à la sauce Siduction), asymptote svn (récent de deux jours)
O.G.
OG
Modérateur honoraire
Modérateur honoraire
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Problème de paramétrisation ?

Message non lu par OG »

Avec Mayavi2, voici ce que l'on peut obtenir (sans optimisation...), là sur mon pc de bureau pas de pb de surface à moitié non-transparente.

Code : Tout sélectionner

import numpy as np
from mayavi import mlab



a = 1
r = 1
mlab.figure(1, fgcolor=(0, 0, 0), bgcolor=(1, 1, 1))
mlab.clf()

# On fabrique les deux paramètres u et v
# a priori on est dans des fct trigo, donc entre 0 et 2pi



def x(u,v):
    """
    """
    return a*np.cos(u*np.cos(v))

def y(u,v):
    """
    """
    return a*np.sin(u*np.cos(v))

def z(u,v):
    """
    """
    return r*u*np.sin(v)

u = np.linspace(-np.pi,np.pi,32)
v = np.linspace(-np.pi,np.pi,40)


uu, vv = np.meshgrid(u,v)
X = x(uu,vv)
Y = y(uu,vv)
Z = z(uu,vv)

# on trace la surface

mlab.mesh(X, Y, Z,colormap='gist_earth',opacity=1)

   
# On trace les lignes à U constant
for U in u :
    X = x(U,v)
    Y = y(U,v)
    Z = z(U,v)
    mlab.plot3d(X,Y,Z)
# On trace les lignes à V constant
for V in v :
    X = x(u,V)
    Y = y(u,V)
    Z = z(u,V)
    #mlab.plot3d(X,Y,Z,color='r')

  
mlab.show()

Pièces jointes
snapshot.png
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: Problème de paramétrisation ?

Message non lu par rebouxo »

J'avais vu mayavi, mais samedi quand j'ai voulu l'installer mon apt était un peu cassé. Je vais essayer d'installer mayavi et je vais installer asymptote sur une autre machine.

Edit : Mayavi, trop cool. Tout cela me plais bien. Merci Olivier

Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.