Salut,
En fait, une ligne courbe n'est jamais… qu'une succession de droites très petites [clindoeil], et meme plutot à une succession de point suffisement proche pour etre considérée comme une suite continue[clindoeil]
Pour te permettre de comprendre, je vais me permettre de t'initier vaguement à la trigonométrie (en passant sur les détails), et pour cela, il me faut un petit dessin que voici [img]http://koala01.free.fr/images/trigo.PNG[/img]
Il faut savoir que, quand on regarde un angle, on peut en fait se dire qu'il représente une certaine partie d'un cercle, dont le centre serait le point d'intersection des deux droites, et d'un
Diametre unitaire (comprend: quelle que puisse etre la taille des segments de droite envisagée (10 cm, 15 metre, 255 km) la taille vaudrait toujours 1)
Le cosinus d'un angle est la valeur de la coordonnée horizontale (forcément comprise entre 1 et -1) et le sinus la valeur de la coordonnée verticale (forcément comprise entre 1 et -1) de l'intersection entre la demi droite qui fait l'angle et le cercle imaginaire tracé.
Le calcul d'un angle dans un cercle part toujours de l'horizontale et augmente dans le sens inverse des aiguilles d'une montre [clindoeil]
Il y a donc moyen de diviser le cerle en quatre secteurs bien distincts (numérotés de I à IV) de telle manière qu'un angle compris entre 0 et 90° aie un sinus et un cosinus positifs, qu'un angle entre 90,000000001 et 180° aie un cosinus positif et un sinus négatif, un angle entre 180.000000001 et 270° aie un cosinus et un sinus négatifs et qu'un angle compris entre 270.00000001 et 360° aie un cosinus négatif et un sinus positif.
Dans le but de tracer une courbe, on ne va pas réellement s'intéresser à l'angle, mais bel et bien aux coordonnées relatives du point d'intersection entre la demi droite qui fait l'angle et le cercle imaginaire.
Il faut savoir que de nombreux langages utilisent le radian comme unité de mesure des angles…
Si c'est le cas, la transformation de degré en radian est une constante que l'on peut définir comme étant
X(degre)=X/180*PI (radian)
PI ayant une valeur fixe (3,1415926...) il devient très facile d'utiliser une règle de trois pour effectuer le calcul [clindoeil]
Ainsi, pour un angle de 30 degré, on a 30=30/180*3.14159266 ~=0.5935598 radians [clindoeil]
Partant de là, on peut très facilement calculer une position (relative au centre du cercle) à laquelle se positionne le point:
On commence par calculer le sinus et le cosinus de l'angle, et ma calculatrice me donne
sin(30°)=0.5
cos(30°)~=0.99995
Il n'y a alors plus qu'à positionner le point par rapport au centre calculé, en utilisant les valeurs des sinus et des cosinus comme rapport de la taille réelle (et, selon les fonctions utilisables).
De cette manière, le tracé d'un cercle d'un rayon de 100 pixels et ayant son centre en 150,150 (en n'utilisant pas la commande circle) pourrait très bien se faire sous la forme d'un code ressemblant à
int i;
float angle;
float cosinus;
float sinus;
for(i;i<360;i++)
{
//on donne la valeur de i à angle
angle=i;
//la conversion de l'angle en radians si nécessaire
//(à vérifier dans la doc de allegro
angle=angle/180*3.1415926;
//calcul du sinus et du cosinus
sinus=sin(angle);
cosinus=cos(angle);
//on applique le rapport (sur 100pixels)
sinus*=100;
cosinus*=100;
//on aurait très bien pu faire les deux sur une seule commande avec
//sinus=100*sin(angle) et
//cosinus=100*cos(angle)[clindoeil]
//il ne reste plus qu'à demander de tracer un point au bon endroit
vline(bitmap,150+cosinus,150+cosinus,1,makecol(0,0,0));
//d'ailleurs, on aurait très bien pu directement faire le caclul de la position d'une seule traite avec
//sinus=150+100*sin(angle);
//et
//cosinus=150+100*cos(angle);
//et avec la commande
//vline(bitmap,cosinus,sinus,1,makecol(0,0,0));
//on autrait d'aillerus très bien pu utiliser la commande hline plutot que vline [clindoeil]
}
Si tu veux créer, par exemple, la courbe sinusoïdale (en partant d'une coordonnée x de 150, et ayant l'axe y en 150 vertical, le code n'est que très peu modifié:
int x;
int i;
float angle;
float sinus;
for(i=0;i<360;i++)
{
//comme avant, récupération de l'angle et convertion si nécessaire
angle=i;
angle=angle/180*3.1415926;
//on calcule directement la coordonnée y du point
sinus=150+100*sin(angle);
//et la coordonnée horizontale est 150 (le point de départ)+i
x=150+i;
//il ne reste plus qu'à faire tracer placer un point
vline(bitmap,x,sinus,1,makecol(0,0,0));
}
Maintenant, si tu souhaites créer des courbes plus complexes, il ne te reste qu'à adapter les formules [clindoeil]