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.
Post Reply
User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Anaglyphes

Post by alain974 » Sun Oct 04, 2009 7:15 pm

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: Select all

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: Select all

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).
Attachments
BaseAnaglyphe.zir
Figure de base pour faire des anaglyphes en CarScript.
(25.62 KiB) Downloaded 95 times

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Exemple: l'ananas

Post by alain974 » Mon Oct 05, 2009 12:52 pm

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: Select all

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.
Attachments
ananas.zir
la figure finale, en anaglyphes couleurs
(151.58 KiB) Downloaded 99 times

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Post by alain974 » Tue Oct 06, 2009 8:33 am

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: Select all

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/
Attachments
sierpinski3d1.zir
fichier avant script
(33.67 KiB) Downloaded 80 times
tetraedres.zirz
le résultat final
(32.08 KiB) Downloaded 86 times

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

boule remplie

Post by alain974 » Sat Oct 10, 2009 12:37 pm

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: Select all

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: Select all

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: Select all

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?

User avatar
yves974
Posts: 268
Joined: Tue Oct 30, 2007 3:11 am
Location: Réunion

Post by yves974 » Sat Oct 10, 2009 4:35 pm

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: Select all

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
Attachments
AnaglypheTournesol.zir
(641.72 KiB) Downloaded 95 times

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Post by alain974 » Sat Oct 10, 2009 6:47 pm

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: Select all

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

User avatar
yves974
Posts: 268
Joined: Tue Oct 30, 2007 3:11 am
Location: Réunion

Post by yves974 » Sun Oct 11, 2009 6:23 am

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

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Post by alain974 » Wed Oct 14, 2009 2:30 pm

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).
Attachments
fct2var3.zir
représentation de fonction en anaglyphe
(68.75 KiB) Downloaded 99 times

User avatar
yves974
Posts: 268
Joined: Tue Oct 30, 2007 3:11 am
Location: Réunion

Post by yves974 » Wed Oct 14, 2009 8:37 pm

un

Code: Select all

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

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Cercles de Villarceau

Post by alain974 » Fri Oct 16, 2009 6:54 pm

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.
Attachments
villarceau3.zir
tore et deux cercles en anaglyphes
(40.62 KiB) Downloaded 82 times

Post Reply