traçage d'une étoile à l'aide de carscript

Lieu d'échange sur les pratiques et les réalisations de scripts
Post Reply
mohjer
Posts: 58
Joined: Wed Jun 10, 2009 9:09 pm
Location: Tunis
Contact:

traçage d'une étoile à l'aide de carscript

Post by mohjer » Sun Feb 05, 2012 7:25 pm

Bonjour,

Je souhaiterai tracer une étoile à 5 branches ou plus qui est remplie telle l'image pièce jointe ,

j'ai déniché un script mais qui laisse sous ma faim
j'ai fait plusieurs essais mais en vain,je débute en carscript;

Ci_après le script :


// nombre de branche de l'étoile
n=5;
// rayon de l'étoile initiale
R=9/10;
angle=360/n;
Point("O",0,0);
Point("A",R,0);SetPointType("A","circle");
SetHide("O",true);
FixedCircle("O",R);
// compteur de sommets, de centres et de segments
b=1;
c=1;
t=1;
// détermination des sommets de l'étoile initiale
for (i=1; i<2*n; i=i+1){
a=(i-1)*angle;
Point("A"+b,"(x(A)-x(O))*cos(_a)-(y(A)-y(O))*sin(_a)","(x(A)-x(O))*sin(_a)+(y(A)-y(O))*cos(_a)");
SetHide("A"+b,true);
b=b+1;
}
k=Math.floor(n/2)
// on trace l'étoile
for (i=1; i<n+1; i=i+1){
j=i+k+1;
s_t=Segment("A"+i,"A"+j);
SetRGBColor(s_t,100,(255/n)*i,230);
t=t+1;
}
Attachments
étoile à 5 branches.PNG
(29.08 KiB) Downloaded 771 times

jerome
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Post by jerome » Mon Feb 06, 2012 2:51 pm

Une piste : utiliser les polygones

Code: Select all

// on trace l'étoile 
//for (i=1; i<n+1; i=i+1){ 
	//j=i+k+1; 
	//s_t=Segment("A"+i,"A"+j); 
	//SetRGBColor(s_t,100,(255/n)*i,230); 
	//t=t+1; 
	//}
Polygon("A1,A3,A5,A7,A2,A4,A6")
Attachments
n_egale_7.png
(14.53 KiB) Downloaded 769 times

mohjer
Posts: 58
Joined: Wed Jun 10, 2009 9:09 pm
Location: Tunis
Contact:

Post by mohjer » Tue Feb 07, 2012 4:49 pm

Bonjour Jerôme,

Après réflexion , j'ai trouvé un script qui me donne ce que je voulais;
le script est simple ;
je vous l'enverrai bientôt car je ne suis pas actuellement sur mon pc portable;mais je cherche à généraliser ce que j'ai trouvé et à améliorer le script;
En tous les cas, je te remercie pour ton idée que je suivrai certainement pour la généralisation du coeur de l'étoile et non de l'étoile.

mohjer
Posts: 58
Joined: Wed Jun 10, 2009 9:09 pm
Location: Tunis
Contact:

Post by mohjer » Wed Feb 08, 2012 10:56 am

Bonjour,

voici le script qui me donne ce que j'appelle le coeur de l'étoile à 5 branches;
j'aimerai bien améliorer ce script qui me parait long et essayer de le généraliser à n branches:

le script


a1=Point(9/10,0);
a2=Point(9/10*Math.cos(Math.PI*2/5),9/10*Math.sin(Math.PI*2/5));
a3=Point(9/10*Math.cos(Math.PI*4/5),9/10*Math.sin(Math.PI*4/5));
a4=Point(9/10*Math.cos(Math.PI*6/5),9/10*Math.sin(Math.PI*6/5));
a5=Point(9/10*Math.cos(Math.PI*8/5),9/10*Math.sin(Math.PI*8/5));
s1=Segment(a1,a3);
s2=Segment(a1,a4);
s3=Segment(a2,a5);
s4=Segment(a2,a4);
s5=Segment(a3,a5);
g1=Intersection(s1,s4);
g2=Intersection(s1,s3);
g3=Intersection(s2,s3);
g4=Intersection(s2,s5);
g5=Intersection(s5,s4);
Polygon("_a1,_g2,_a2,_g1,_a3,_g5,_a4,_g4,_a5,_g3");
SetHide(a1,true);
SetHide(a2,true);
SetHide(a3,true);
SetHide(a4,true);
SetHide(a5,true);
SetHide(g1,true);
SetHide(g2,true);
SetHide(g3,true);
SetHide(g4,true);
SetHide(g5,true);

monique31
Posts: 373
Joined: Sat Nov 03, 2007 3:33 pm
Location: Toulouse

Post by monique31 » Fri Feb 10, 2012 6:44 pm

Je viens d'essayer ceci :
- afin de pouvoir généraliser à d'autres valeurs de n, il me semble intéressant de travailler avec des tableaux à une dimension, c'est à dire des listes. Comme tu débutes en javascript je te conseille de lire sur le "Site du zéro" la page correspondante.
- j'ai gardé, comme sur le script que tu as récupéré, le Math.floor(n/2)+1 pour le choix du sommet suivant. Manifestement ça pose problème pour certaines valeurs paires de n : on n'a pas de permutation sur l'ensemble des sommets !!! Mes souvenirs sur les congruences, permutations etc sont un peu lointains. Bref, quelqu'un peut donner une meilleure solution ?
Attention ! ce script ne fonctionne qu'avec la 3.7.3 bêta ! (voir 2 posts plus loin ...)

Code: Select all

var n=Input("Nombre de sommets ?");
var Indices = [];
var Points = [];

for (i=0; i<n; i=i+1){
	ai=Point("A_i",Math.cos(2*(Math.PI)*i/n),Math.sin(2*(Math.PI)*i/n));SetHide("A_i",true); 
}
k=Math.floor(n/2)+1;
for (j=0; j<n; j=j+1){
	Indices[j]=(j*k)%n;
	Points[j]="A"+Indices[j];

}
Println(Indices);
Println(Points);
var poly=Points.join(",");//remplace la liste des points Ai par une unique chaîne de caractères en les séparant par une virgule

Etoile=Polygon(poly);
SetThickness(Etoile,"normal");
Même si ce script ne fonctionne pas à tous les coups, je l'ai quand même mis en ligne, puisque comme moi tu débutes en javascript et programmation : que tu voies un peu comment fonctionnent les tableaux :wink:
Last edited by monique31 on Sun Feb 12, 2012 3:56 pm, edited 1 time in total.

monique31
Posts: 373
Joined: Sat Nov 03, 2007 3:33 pm
Location: Toulouse

Post by monique31 » Sat Feb 11, 2012 7:01 pm

Le code précédent ne fonctionne pas si : n%4==2;
Dans ce cas, il faut tracer deux polygones, et c'est le script c-dessous qu'on utilisera ...

Code: Select all

var n=Input("Nombre de sommets ?");
var FirstIndices = [];
var SecondIndices =[];
var FirstPoints = [];
var SecondPoints = [];

for (i=0; i<n; i=i+1){
	ai=Point("A_i",Math.cos(2*(Math.PI)*i/n),Math.sin(2*(Math.PI)*i/n));SetHide("A_i",true); 
}
p=n/2+1;
for (j=0; j<n/2; j=j+1){
	FirstIndices[j]=(j*p)%n;
	FirstPoints[j]="A"+FirstIndices[j];
	SecondIndices[j]=(j*p)%n+1;
	SecondPoints[j]="A"+SecondIndices[j];

}

Println(FirstIndices);Println(SecondIndices);

var Firstpoly=FirstPoints.join(",");
var Secondpoly=SecondPoints.join(",");
FirstEtoile=Polygon(Firstpoly);
SecondEtoile=Polygon(Secondpoly);

SetThickness(FirstEtoile,SecondEtoile,"normal");

monique31
Posts: 373
Joined: Sat Nov 03, 2007 3:33 pm
Location: Toulouse

Post by monique31 » Sun Feb 12, 2012 11:50 am

Désolée pour ceux qui auraient essayé mes scripts ! Ils ne fonctionnent pas vraiment. Parce que j'ai utilisé la version 3.7.3 béta qui permet par exemple Point("A_i", ...). Avec la 3.7.2 on est obligé d'utiliser Point("A"+i, ...). Ce code devrait fonctionner avec la version officielle (faire la même modif pour le second code) :

Code: Select all

var n=Input("Nombre de sommets ?"); 
var Indices = []; 
var Points = []; 

for (i=0; i<n; i=i+1){ 
	ai=Point("A"+i,Math.cos(2*(Math.PI)*i/n),Math.sin(2*(Math.PI)*i/n));SetHide("A"+i,true); 
} 
k=Math.floor(n/2)+1; 
for (j=0; j<n; j=j+1){ 
	Indices[j]=(j*k)%n; 
	Points[j]="A"+Indices[j]; 

} 
Println(Indices); 
Println(Points); 
var poly=Points.join(",");//remplace la liste des points Ai par une unique chaîne de caractères en les séparant par une virgule 

Etoile=Polygon(poly); 
SetThickness(Etoile,"normal");

mohjer
Posts: 58
Joined: Wed Jun 10, 2009 9:09 pm
Location: Tunis
Contact:

Post by mohjer » Wed Feb 15, 2012 8:04 pm

Merci Monique pour tes essais et tes conseils;je suis entrain de creuser tout ça malgré certaines difficultés.

Post Reply