Anaglyphes

Vous avez mis un diaporama en ligne, vous utilisez CaRMetal dans votre site Web, dans un article SPIP, vous pouvez indiquer leurs adresses ici accompagnées d'un bref résumé. Vous êtes arrivé sur des pages utilisant CaRMetal non encore référencées ici, n'hésitez pas à présenter ces pages.
Répondre
Avatar du membre
alain974
Messages : 150
Enregistré le : sam. juin 13, 2009 9:08 am
Localisation : Réunion

Anaglyphes

Message par alain974 »

Si nous percevons le relief, c'est parce que nos yeux gauche et droit ne voient pas la figure sous le même angle: La figure vue par l'oeil gauche est tournée vers la droite, et celle aperçue par l'oeil droit est tournée vers la gauche.

Pour construire un anaglyphe, il faut donc faire la figure en deux exemplaires, l'un tourné vers la gauche, en rouge et l'autre, tourné vers la droite, en cyan. Le port de lunettes rouge-cyan permet à chaque oeil de voir sa propre version de l'image, et le cerveau reconstitue le tout si tout va bien.

Ci-jointe une figure très dépouillée avec seul un repère: Le point Z est resté seul, et noir, alors que le point X a été dédoublé en deux points Xr, rouge et Xc, cyan, et le point Y a été remplacé par Yr, rouge et Yc, cyan. Les points ont des alias qui les rendent homonymes (X et Y).

Pour construire une figure en 3D et en relief, il faut remplacer la classique construction du point de coordonnées (x,y,z):

Code : Tout sélectionner

e=Point("x(O)+_x*(x(X)-x(O))+_y*(x(Y)-x(O))+_z*(x(Z)-x(O))",
"y(O)+_x*(y(X)-y(O))+_y*(y(Y)-y(O))+_z*(y(Z)-y(O))");
par deux points, l'un avec Xr et Yr à la place de X et Y, en rouge, et l'autre avec Xc et Yc à la place de X et Y, en cyan:

Code : Tout sélectionner

ar=Point("x(O)+_x*(x(Xr)-x(O))+_y*(x(Yr)-x(O))+_z*(x(Z)-x(O))",
"y(O)+_x*(y(Xr)-y(O))+_y*(y(Yr)-y(O))+_z*(y(Z)-y(O))");
SetColor(a,"red");
ac=Point("x(O)+_x*(x(Xc)-x(O))+_y*(x(Yc)-x(O))+_z*(x(Z)-x(O))",
"y(O)+_x*(y(Xc)-y(O))+_y*(y(Yc)-y(O))+_z*(y(Z)-y(O))");
SetColor(ac,"cyan");
Pour voir le relief, on doit mettre bien sûr des lunettes rouge-cyan, mais aussi régler le curseur "e" pour que l'angle ne soit ni trop gros (on verrait double) ni trop petit (on verrait plat).
Fichiers joints
BaseAnaglyphe.zir
Figure de base pour faire des anaglyphes en CarScript.
(25.62 Kio) Téléchargé 198 fois

Avatar du membre
alain974
Messages : 150
Enregistré le : sam. juin 13, 2009 9:08 am
Localisation : Réunion

Exemple: l'ananas

Message par alain974 »

L'exemple présent n'est pas le résultat d'un script appliqué à la figure vierge du sujet précédent: Il a fallu créer deux curseurs "alpha" (un angle) et "h" (le pas de l'hélice) pour appliquer le script ci-dessous:

Code : Tout sélectionner

for (i=0; i<100; i++){

ar=Point("Pr"+i,"x(O)+cos(alpha*_i)*(x(Xr)-x(O))+sin(alpha*_i)*(x(Yr)-x(O))+(2-h*_i)*(x(Z)-x(O))","y(O)+cos(alpha*_i)*(y(Xr)-y(O))+sin(alpha*_i)*(y(Yr)-y(O))+(2-h*_i)*(y(Z)-y(O))");
        switch(i%3){
                case(0):{SetColor(ar,"red");break;
                }
                case(1):{SetColor(ar,"red");break;
                }
                case(2):SetColor(ar,"brown");
        }
        SetPointType(ar,"cross");

ac=Point("Pc"+i,"x(O)+cos(alpha*_i)*(x(Xc)-x(O))+sin(alpha*_i)*(x(Yc)-x(O))+(2-h*_i)*(x(Z)-x(O))","y(O)+cos(alpha*_i)*(y(Xc)-y(O))+sin(alpha*_i)*(y(Yc)-y(O))+(2-h*_i)*(y(Z)-y(O))");
        switch(i%3){
                case(0):{SetColor(ac,"green");break;
                }
                case(1):{SetColor(ac,"blue");break;
                }
                case(2):SetColor(ac,"cyan");
        }
        SetPointType(ac,"cross");

}
for(i=12;i<120;i++){
        j=i-13;
        s=Segment("Pr"+i,"Pr"+j);
        SetColor(s,"red");
        SetThickness(s,"normal");
        s=Segment("Pc"+i,"Pc"+j);
        SetColor(s,"blue");
        SetThickness(s,"normal");
}
for(i=20;i<120;i++){
        j=i-21;
        s=Segment("Pr"+i,"Pr"+j);
        SetColor(s,"brown");
        SetThickness(s,"normal");
        s=Segment("Pc"+i,"Pc"+j);
        SetColor(s,"green");
        SetThickness(s,"normal");
}
Il s'agit d'une "simple" transformation du tournesol que voici

http://www.reunion.iufm.fr/recherche/ir ... article210

d'une spirale vers une hélice.

Seulement j'ai profité de l'occasion pour explorer les anaglyphes en couleurs: En fait il suffit que le point de gauche soit dans une couleur chaude (ici rouge ou marron) et que le point de droite soit dans une couleur froide (bleu, cyan, vert) pour que le relief soit perceptible. Les deux groupes de spirales tous les 13 ou 21 noeuds sont dans des couleurs différentes, mais peu perceptibles (un bleu violacé et du verdâtre).

Le fichier, où on peut modifier le pas de l'hélice et surtout l'angle, est téléchargeable ci-dessous.
Fichiers joints
ananas.zir
la figure finale, en anaglyphes couleurs
(151.58 Kio) Téléchargé 216 fois

Avatar du membre
alain974
Messages : 150
Enregistré le : sam. juin 13, 2009 9:08 am
Localisation : Réunion

Message par alain974 »

Autre exploration des anaglyphes couleur, cette fois-ci avec des nuages de points (on voit encore moins les couleurs): Le tétraèdre de Sierpinski. Le fichier de base comprend deux tétraèdres, l'un rouge bien sûr, et l'autre cyan. On peut télécharger le fichier "sierpinski3d1" ci-dessous. Le script est alors le suivant:

Code : Tout sélectionner

ar="Ar";br="Br";cr="Cr";dr="Dr";ac="Ac";bc="Bc";cc="Cc";dc="Dc";
rouge=Point("0.9*x(O)+0.1*x(Ar)","0.9*y(O)+0.1*y(Ar)");
bleu=Point("0.9*x(O)+0.1*x(Ac)","0.9*y(O)+0.1*y(Ac)");
SetHide(rouge,true);SetHide(bleu,true);
for (i=0; i<1000; i++){
	astragale=Math.floor(4*Math.random());
	switch(astragale){
		case 0:{
			gauche=MidPoint(rouge,ar);
			SetColor(gauche,"red");
			SetPointType(gauche,"point");
			droit=MidPoint(bleu,ac);
			SetColor(droit,"cyan");
			SetPointType(droit,"point");
		}
		break;
		case 1:{
			gauche=MidPoint(rouge,br);
			SetColor(gauche,"red");
			SetPointType(gauche,"point");
			droit=MidPoint(bleu,bc);
			SetColor(droit,"blue");
			SetPointType(droit,"point");
		}
		break;
		case 2:{
			gauche=MidPoint(rouge,cr);
			SetColor(gauche,"red");
			SetPointType(gauche,"point");
			droit=MidPoint(bleu,cc);
			SetColor(droit,"green");
			SetPointType(droit,"point");
		}
		break;
		case 3:{
			gauche=MidPoint(rouge,dr);
			SetColor(gauche,"brown");
			SetPointType(gauche,"point");
			droit=MidPoint(bleu,dc);
			SetColor(droit,"cyan");
			SetPointType(droit,"point");
		}
	}
	rouge=gauche;
	bleu=droit;
}
Le script est long, et le sera encore plus si on crée 2000 ou 4000 points... (attention: 1000 points veut dire ici 2000 puisqu'en anaglyphe, tout est doublé)

Le résultat est téléchargeable ci-dessous (en zirz) mais très long à ouvrir...

Il est à comparer avec la version Euler Math Toolbox:

http://eumat.sourceforge.net/
Fichiers joints
sierpinski3d1.zir
fichier avant script
(33.67 Kio) Téléchargé 142 fois
tetraedres.zirz
le résultat final
(32.08 Kio) Téléchargé 127 fois

Avatar du membre
alain974
Messages : 150
Enregistré le : sam. juin 13, 2009 9:08 am
Localisation : Réunion

boule remplie

Message par alain974 »

Pour représenter un volume en 3D, il faut que celui-ci soit transparent (sinon on ne représente qu'une surface close). En anaglyphes, un nuage de points aléatoires fait l'affaire. Par exemple, pour montrer l'intérieur de la boule de rayon 1, on crée trois variables aléatoires uniformes:
  • theta (longitude) de 0 à 2 pi
  • phi (latitude) de -pi/2 à pi/2
  • r (rayon) de 0 à 1
Le code est le suivant:

Code : Tout sélectionner

for(n=0;n<400;n++){
	theta=2*Math.PI*Math.random();
	phi=Math.PI*Math.random()-Math.PI/2;
	r=Math.random();
	x=r*Math.cos(theta)*Math.cos(phi);
	y=r*Math.sin(theta)*Math.cos(phi);
	z=r*Math.sin(phi);
	ar=Point("x(O)+_x*(x(Xr)-x(O))+_y*(x(Yr)-x(O))+_z*(x(Z)-x(O))",
	"y(O)+_x*(y(Xr)-y(O))+_y*(y(Yr)-y(O))+_z*(y(Z)-y(O))");
	SetColor(ar,"red");
	SetPointType(ar,"point");
	ac=Point("x(O)+_x*(x(Xc)-x(O))+_y*(x(Yc)-x(O))+_z*(x(Z)-x(O))",
	"y(O)+_x*(y(Xc)-y(O))+_y*(y(Yc)-y(O))+_z*(y(Z)-y(O))");
	SetColor(ac,"cyan"); 
	SetPointType(ac,"point");
}
En passant il y a une erreur dans l'instruction qui donne le point rouge dans le message qui ouvre cette rubrique: c'est "ar" et non "a".

Au bout de quelques centaines de points, on voit que la boule est plus dense au centre qu'au pourtour: La loi n'est pas uniforme (on s'en doutait un peu, non?). Déjà, est-ce que les diamètres sont distribués uniformément? Pour le voir, il suffit de remplacer r par 1 dans le script ci-dessus, et on a une sphère remplie aléatoirement. Les lunettes rouge-bleue montrent assez nettement que les pôles sont plus souvent visités que l'équateur. Correction (sur la sphère) avec le script suivant (c'est la ligne 3 qui a été corrigée):

Code : Tout sélectionner

for(n=0;n<400;n++){
	theta=2*Math.PI*Math.random();
	phi=Math.asin(2*Math.random()-1);
	r=1;
	x=r*Math.cos(theta)*Math.cos(phi);
	y=r*Math.sin(theta)*Math.cos(phi);
	z=r*Math.sin(phi);
	ar=Point("x(O)+_x*(x(Xr)-x(O))+_y*(x(Yr)-x(O))+_z*(x(Z)-x(O))",
	"y(O)+_x*(y(Xr)-y(O))+_y*(y(Yr)-y(O))+_z*(y(Z)-y(O))");
	SetColor(ar,"red");
	SetPointType(ar,"point");
	ac=Point("x(O)+_x*(x(Xc)-x(O))+_y*(x(Yc)-x(O))+_z*(x(Z)-x(O))",
	"y(O)+_x*(y(Xc)-y(O))+_y*(y(Yc)-y(O))+_z*(y(Z)-y(O))");
	SetColor(ac,"cyan");
	SetPointType(ac,"point");
}
Maintenant la sphère est uniformément peinte (peinture à l'aérographe en l'occurence!).

Pour remplir uniformément la boule, il suffit de modifier la variable aléatoire r pour qu'elle ne soit pas uniforme. La recette ci-dessous, trouvée empiriquement (merci les lunettes rouge-bleue), semble fonctionner:

Code : Tout sélectionner

for(n=0;n<400;n++){
	theta=2*Math.PI*Math.random();
	phi=Math.asin(2*Math.random()-1);
	r=Math.pow(Math.random(),1/3);
	x=r*Math.cos(theta)*Math.cos(phi);
	y=r*Math.sin(theta)*Math.cos(phi);
	z=r*Math.sin(phi);
	ar=Point("x(O)+_x*(x(Xr)-x(O))+_y*(x(Yr)-x(O))+_z*(x(Z)-x(O))",
	"y(O)+_x*(y(Xr)-y(O))+_y*(y(Yr)-y(O))+_z*(y(Z)-y(O))");
	SetColor(ar,"red");
	SetPointType(ar,"point");
	ac=Point("x(O)+_x*(x(Xc)-x(O))+_y*(x(Yc)-x(O))+_z*(x(Z)-x(O))",
	"y(O)+_x*(y(Xc)-y(O))+_y*(y(Yc)-y(O))+_z*(y(Z)-y(O))");
	SetColor(ac,"cyan");
	SetPointType(ac,"point");
}
Cette technique est adaptable à d'autres volumes (exercice: cylindre, pyramide) mais l'exercice qu'il soulève en premier est celui-ci:

La loi construite ici est-elle uniforme à l'intérieur de la boule?

Avatar du membre
yves974
Messages : 268
Enregistré le : mar. oct. 30, 2007 3:11 am
Localisation : Réunion

Message par yves974 »

Bon aller je me lance ... dur dur de faire des anaglyphes après tout ce que Alain a fait !!!

Alors une variante du tournesol du site de l'IREM en 3D directement inspirée de Wolfram

Il faut en plus de la figure de base du premier topic de ce fil, ajouter un curseur v3d qui va de 0 à 0,03 et un curseur ang qui va de 135 à 140 (par exemple)

Alors on applique ce script

Code : Tout sélectionner

c=0.12;
for (i=1; i<500; i++){
	ar=Point("x(O)+(x(Xr)-x(O))*_c*sqrt(_i)*cos(_i*ang)+(x(Yr)-x(O))*_c*sqrt(_i)*sin(_i*ang)+(x(Z)-x(O))*v3d*(_i+0.0000000001)","y(O)+(y(Xr)-y(O))*_c*sqrt(_i)*cos(_i*ang)+(y(Yr)-y(O))*_c*sqrt(_i)*sin(_i*ang)+(y(Z)-y(O))*v3d*(_i+0.0000000001)");
SetColor(ar,"red");
	ac=Point("x(O)+(x(Xc)-x(O))*_c*sqrt(_i)*cos(_i*ang)+(x(Yc)-x(O))*_c*sqrt(_i)*sin(_i*ang)+(x(Z)-x(O))*v3d*(_i+0.0000000001)","y(O)+(y(Xc)-y(O))*_c*sqrt(_i)*cos(_i*ang)+(y(Yc)-y(O))*_c*sqrt(_i)*sin(_i*ang)+(y(Z)-y(O))*v3d*(_i+0.0000000001)");
SetColor(ac,"cyan");
		
}

Ce qui donne la figure proposée ci-dessous
Fichiers joints
AnaglypheTournesol.zir
(641.72 Kio) Téléchargé 140 fois

Avatar du membre
alain974
Messages : 150
Enregistré le : sam. juin 13, 2009 9:08 am
Localisation : Réunion

Message par alain974 »

Les points cyan ont tendance à cacher les points rouges (ce sont des disques blancs cercléd de cyan) et l'effet de relief est moins net.

Pour améliorer ce script, un

Code : Tout sélectionner

SetPointType(ar,"cross");
SetPointType(ac,"cross";
donne quelque chose de moins beau mais plus en relief (idem avec "dcross" ou "point" du moment que c'est le même choix pour les deux points).

Avatar du membre
yves974
Messages : 268
Enregistré le : mar. oct. 30, 2007 3:11 am
Localisation : Réunion

Message par yves974 »

Bien vu, effectivement je me disais "tiens ça fait pas comme avec Alain" mais bien sir c'était les points ...

Avatar du membre
alain974
Messages : 150
Enregistré le : sam. juin 13, 2009 9:08 am
Localisation : Réunion

Message par alain974 »

Voici une représentation graphique de fonction de deux variables en anaglyphes: couleur verte pour la grille du sol (z=0) et violette pour la surface. On peut régler le curseur "e" en haut à droite pour le confort du relief mais aussi changer la fonction (par l'outil "modifier") de x et y en bas. Par contre il est nécessaire que la fonction continue à s'appeler f(x,y).

Chaque composante de couleur est formée de 2 polygones (sol) plus deux lieux (surface). La fonction est représentée sur [-4;4]x[-4;4].

Le résultat est moins beau que celui d'Euler Math Toolbox (surtout qu'EuMathT a un mode "hue") mais plus dynamique. On peut par exemple faire dépendre f(x,y) de la valeur d'un curseur (fonction dépendant d'un paramètre).
Fichiers joints
fct2var3.zir
représentation de fonction en anaglyphe
(68.75 Kio) Téléchargé 141 fois

Avatar du membre
yves974
Messages : 268
Enregistré le : mar. oct. 30, 2007 3:11 am
Localisation : Réunion

Message par yves974 »

un

Code : Tout sélectionner

(x^2-y^2)/8+1
permet (pour mes yeux) de mieux voir le relief

De tous tes anaglyphes c'est celui où je vois le mieux le relief dans toute sa profondeur. Je trouve ça géant

Vivement que le script du poly aux 100 divisions fonctionne ... on aura un truc d'une finesse parfaite ...

Avatar du membre
alain974
Messages : 150
Enregistré le : sam. juin 13, 2009 9:08 am
Localisation : Réunion

Cercles de Villarceau

Message par alain974 »

Voici un tore en anaglyphe (gris pointillé) représenté par deux courbes de Lissajous (donc 4 lieux, 2 par courbe). Et pour faire joli, deux cercles de Villarceau qui sont l'intersection du tore et d'un plan tangent à celui-ci.

L'un des cercles est en mauve, l'autre en marron. Ce sont des lieux (pas des coniques).

On remarque qu'en mettant le paramètre "e" à zéro on a une figure normale (pas anaglyphe). Il est possible de régler les deux rayons r1 et r2 par des curseurs. J'ai choisi que le rayon r2 ne puisse pas être supérieur à r1 (pour que le tore ressemble vraiment à un tore) mais même si r2>r1 les cercles de Villarceau existent toujours.
Fichiers joints
villarceau3.zir
tore et deux cercles en anaglyphes
(40.62 Kio) Téléchargé 126 fois

Répondre