Problème de paramétrisation ?

Discussions générales concernant les mathématiques.
[ce forum est modéré par les modérateurs globaux du site]
Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser le mode LaTeX (voir ici) afin de rendre vos formules plus lisibles.
> Pour obtenir de l'aide sur un exercice ou un problème, consulter cette section. (ce forum est destiné aux discussions plutôt théoriques)

Problème de paramétrisation ?

Messagepar rebouxo » Vendredi 04 Janvier 2019, 09:25

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) Vu 327 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
rebouxo
Modérateur
 
Messages: 6927
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Problème de paramétrisation ?

Messagepar OG » Vendredi 04 Janvier 2019, 17:20

Et avec $z=au\sin(v)$ ?
Fichiers joints
Figure_1.png
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Problème de paramétrisation ?

Messagepar OG » Vendredi 04 Janvier 2019, 18:56

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
Fichiers joints
Figure_1.png
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Problème de paramétrisation ?

Messagepar rebouxo » Samedi 05 Janvier 2019, 10:23

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
rebouxo
Modérateur
 
Messages: 6927
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Problème de paramétrisation ?

Messagepar OG » Samedi 05 Janvier 2019, 11:06

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.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Problème de paramétrisation ?

Messagepar rebouxo » Samedi 05 Janvier 2019, 15:59

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
rebouxo
Modérateur
 
Messages: 6927
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Problème de paramétrisation ?

Messagepar OG » Dimanche 06 Janvier 2019, 22:53

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).
Fichiers joints
h167.png
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Problème de paramétrisation ?

Messagepar rebouxo » Dimanche 06 Janvier 2019, 23:08

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
rebouxo
Modérateur
 
Messages: 6927
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Problème de paramétrisation ?

Messagepar OG » Dimanche 06 Janvier 2019, 23:27

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
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Problème de paramétrisation ?

Messagepar OG » Lundi 07 Janvier 2019, 13:51

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()

Fichiers joints
snapshot.png
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Problème de paramétrisation ?

Messagepar rebouxo » Lundi 07 Janvier 2019, 23:34

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
rebouxo
Modérateur
 
Messages: 6927
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant


Retourner vers Tribune des mathématiques

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités