C' est pas vraiment ce qu' il y a de plus simple contrairement aux apparences , et je regrette le bon vieux basic des années 80 .
pour les pointillés , une approche
soit lplein la longueur du 'noir ' et lvide la longueur du blanc
pour un pointillé suivant l' axe x :
calculer si l' on est dans le plein ou le vide
soit ltot =lplein+lvide
la position dans le segment est donné par le reste (entier ) de la division x/ltot ( x modulo ltot qui s' écrit x%ltot )
si ce reste est inférieur à lplein+1 , c' est noir , autrement on est dans le blanc
pour l' épaisseur , toujours suivant l' axe x , y peut etre compris entre 0 et epaisseur . if (y>=0) && (y< epaisseur){ alors on calcul}
pour regler l' endroit du trait , dans la fenetre de droite on écrit cy=endroit du trait , Gonta va de cette façon calculer le y qu' il nous fournit en fonction de la hauteur qu' on lui donne . On lui indique ou se trouve le centre de l' image par cx= et cy=
donc à gauche 4 infos à recuperer :
la hauteur du trait , la longueur du noir , celle du blanc et l' epaisseur du trait .Il vaut mieux traduire la hauteur du trait en pourcentage de la taille de l' image en s' aidant de la taille de l' image ys fournie par Gonta
Un bouton glissiere s' ecrit:
?(on creer un bouton),mem (nom de la variable),Affiche ( le titre du bouton), valeur mini,valeur maxi, valeur par défaut;
Gauche :
---------------------------------------
- Code: Tout sélectionner
coord=0;
?haut,Hauteur,1,100,10;
?lplein,Noir,0,100,10;
?lvide,Blanc,0,100,5;
?ep,Epaisseur,1,20,5;
cy=ys*haut/100;
cx=0;
ltot=lplein+lvide;
---------------------------------------
nous avons nos 4 glissieres et la place du trait (cy=ys*cy/100; )
___________________________
Droite : ( les calculs pour chaque pixels )
----------------------------------------------------
- Code: Tout sélectionner
if((y>=0)&&(y<ep)){
pos=x%ltot;
if (pos<=lplein){
R=0;G=0;B=0;
}
}
---------------------------------------------------------------
Logiquement c' est bon . Il serait élégant de finir par un plein (noir) ...
Maintenant la rotation ...
soit on calcule l' angle d' un point avec l' origine et la distance de ce point avec cette origine puis on change l' angle et on garde la meme distance pour le nouveau et le nouveau y
distance =racine carré (x*x)+(y*y)
angle =atn ( y/x ) avec angle en radian. (tangente
pposé/adjacent)
ou :
angle =acos(x/distance)
ou angle =asin(y/distance)
la valeur retournée est en radian . 360 degrés = 2 *pi *radian
puis modification:
angle2=angle+ajout;
et calcul des nouvelles coordonnees:
x2=distance*cos(angle2); y2=distance*sin(angle2);
Soit , parceque que j' ai fait ça souvent mais c' est tres tres tres lointain
je retrouve un peu du passé chez wikipédia
http://fr.wikipedia.org/wiki/Rotation_plane
soit teta l' angle de rotation:
x2=x*cos(teta)+y*sin(teta)
y2=-x*sin(teta)+y*cos(teta)
Cette méthode est preferable des lors que le centre du repere cartésien n' est pas en haut à gauche.
Rappel:Gonta ne travaille qu' en radian !
On peut maintenant ajouter une autre boucle dans le script qui se chargera de la rotation.
ajoutons:
à gauche un bouton glissiere :
?ang,Angle,0,360,0;
la conversion en radian
ang=ang*2*pi/360;
deux boucles:
loop=2;
à doite : loop=2 ( premier passage ) : les pointillés
loop=1: la rotation
calcul de x2 et y2
puis R=R(x2,y2);G=G(x2,y2);B=B(x2;y2) ce qui donne au point de coordonnée x y les composants R G B du point x2 y2
donc :
if (loop ==2){ comme avant}
else {
x2=(x*cos(ang))+(y*sin(ang));
y2=(y*cos(ang))-(x*sin(ang));
R=R(x2,y2);
G=G(x2,y2);
B=B(x2;y2)
}
Le principe fonctionne , mais pas pratique :
si on fait ça sur une image: toute l' image tourne
Suivant l' angle , on a plusieurs traits .... ( des qu' un point sort de l' image Gonta utilise le modulo cité plus haut et remet le point dans l'image
Souvent pratique , mais quelques fois casse pied !!!)
Dernier obstacle : la longueur de l' axe choisi par rapport à celle de la diagonale
Effectivement , c' est pas simple cette affaire , meme sans les pointillés
Autre piste : l' equation d' une droite : y =ax+b et que l' on peut calculer sachant que cette droite passe par deux points
en général a est la tangente de l' angle de la droite ( en radian pour Gonta)
à gauche : coord=-1, puis les boutons
à droite :
R=0;G=0;B=0; le pinceau
y2=ax+b a et b venant des boutons et x de Gonta
_Pset(x,y2) pour un point à tracer
Aiie ! c' est pire que tout !
La droite est naturellement pointillée et y' en a partout des bouts de droites ....
AH! ce bon vieux basic
Reverrais ça demain .
+ Eric