Equation pour ligne et cercle - Algorithme ?

Signaler
Messages postés
129
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
12 février 2009
-
Messages postés
221
Date d'inscription
vendredi 30 novembre 2001
Statut
Membre
Dernière intervention
13 février 2010
-
Quelle est la meilleure méthode pour tracer un cercle dont on connait les coordonnées du centre et le rayon, sachant qu"après on doit balayer tout l'interieur du cercle avec une ligne (Correspondant à un rayon) qui tourne autour du centre du cercle.
L'objectif étant de tester chaque pixel contenu à l'intérieur du cercle pour le coloriser rouge ou vert en fonction d'un critère.
Exemple :
Je prend un point au hasard sur ma form
Le prog trace un cercle de rayon 100 pixels autour de mon point
Je me place sur le cercle sur un point précis
je trace une première ligne virtuelle entre le centre et ce point
Je vérifie chaque pixel sur cette ligne
Puis je prend le point suivant sur mon périmètre du cercle
Je trace une nouvelle ligne
Je vérifie tous les pixels de cette nouvelle ligne...
Etc jusqu'a faire tout le périmètre du cercle...
En fait il me faudrait savoir comment faire une équation pour tracer et suivre le périmétre de mon cercle et pour faire ma ligne baladeuse...
Si quelqu'un à une idée...
Merci d'avance...
;) Poète et cheminant
mon VB dans le sac à dos

5 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
23
equation cartesienne d'un cercle :
(x-a)²+(y-b)²=R²
avec (a,b) les coordonnées du centre et R le rayon.

mais ton principe me parait pas bon du tout.

imagine toi un grand cercle, autour de ton centre tu auras 8 pixel alors que le cercle fait plus de 8points en tracant ta mulitude de rayon, tu vas repeter trop de fois le meme travail, donc pert de performance ...

la solution que je te propose c'est de faire des maths, deux solutions, je sais pas laquelle est la moins fatigante pour l'ordi. tu veux verifier que ton point apparitient au cercle tu as les coordonnés de ton point P(A,B) et du centre O(X,Y)
donc tu resoud verifies cette equation :
(x-A)²+(Y-B)²<R² si c'est vrai ton cercle est à l'interieur rajoute =< pour accepter ton cercle sinon une autre méthode
tu as les coordonnés de tes deux points tu calculs la distance : rac((A-X)²+(B-Y)²) avec le rayon de ton cercle ...

je suis pas sur pour l'expression carthesienne du cercle: sur les signes -

je sais pas si je repond à ta question, mais je trouve que ma facon est un peu plus intelligente pour verifier que ton point appartient au disque ...
comme koi les maths peuvent servir :D

pour tracer un cercle, tu peux aussi te servir du sinus et cosinus

for i as integer 0 to 2pi step = pi/100
X=sin(i)
Y=cos(i)
next
bien sur faut que tu te regles en radian sinon tu fais de 0 à 360°

@+

Cyril
Messages postés
1858
Date d'inscription
samedi 29 juin 2002
Statut
Membre
Dernière intervention
17 octobre 2013
10
Bonjour

Soit le cercle de rayon R et de centre C dont les coordonnées sont (Xc, Yc)
Soit le point P de coordonnées (Xp, Yp).

La distance CP = Sqr((Xp - Xc) ^ 2 + (Yp - Yc) ^ 2)
ou bien CP² = (Xp - Xc) ^ 2 + (Yp - Yc) ^ 2
P est sur le cercle si et seulement si CP R (ou CP² R²)

P est "dans" le cercle si et seulement si CP < R.

Petite question : ton "balayage" doit-il être fait obligatoirement par un rayon ?
Messages postés
129
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
12 février 2009

Je comprend bien ce que tu veux dire, même si mes math remonte à terminale c en 1968...
Mon problème c'est que je dois procéder à une vérification pour chaque point situé à l'intérieur du cercle :
Imagine que le centre soit un radar qui balaye sa zone (le cercle final).
La transcription à plat est couplée avec une table 3D qui me donne pour chaque point son altitude réelle.

Lorsqu'un point à l'intérieur du cercle se trouve en réel plus élevé que le centre (radar), il crée un zone d'ombre entre lui et le périmè_tre du cercle sauf si des moints sont plus élévés que lui ...
Enfin j'espère que je m'explique bien...
C'est pour cela que j'avais l'idée de balayé mon intérieur de cercle en utilisant les rayons...
Chaqiue point en s'éloignant du centre est ou plus bas que le centre ou plus haut.
Si plus haut les suivants seront cachés sauf s'ils sont encore + haut...etc...
Voila mon problème...
Enfin merci de ta réponse, je vais déja essayer de créer le cercle etje suis preneur de toutes idées nouvelles pour avancer ce porog
Amicalement
JM
;) Poète et cheminant
mon VB dans le sac à dos
Messages postés
1858
Date d'inscription
samedi 29 juin 2002
Statut
Membre
Dernière intervention
17 octobre 2013
10
Bonjour
Pourquoi ne pas balayer par une ligne "horizontale" ?
Le centre ayant pour coordonnées (Xc, Yc) et le rayon étant R :
For y = Yc - R To Yc + R
  For x = Xc - R To Xc + R
    If (y - Yc) ^2 + (x - Xc) ^ 2 <= R * R Then
       ' Le point (x, y) est dans le disque => traitement
    End If
  Next x
Next y
Messages postés
221
Date d'inscription
vendredi 30 novembre 2001
Statut
Membre
Dernière intervention
13 février 2010
4
Sympa ton problème jmlucienvb !

il n'y a d'après moi pas d'autre méthode que la tienne pour faire ton programme. Le seul problème qui se pose, c'est le passage discret->continu (càd de combien tourner tes rayons pour parcourir tous tes pixels).

Pour t'aider tout de suite, voici les équations de tes rayons :

x = x0 + k * cos(alpha)
y = y0 + k * sin(alpha)

avec 0 <= alpha <= 2 Pi, (x0,y0) le centre de ton cercle et k un paramètre variant de 0 à R.

Le problème qui te reste à résoudre, c'est de choisir des alpha et des
k qui passent par tous tes pixels, mais sans faire trop de travail.

Un point crucial pour optimiser ton système, c'est de savoir comment sont stockées tes altitudes sur la carte. Car tu pourrais ensuite inverser le problème : au lieu de faire tous les rayons, tu regardes quels points sont plus haut que ta position, et ensuite seulement tu mets en couleur les parties concernées

VB Lover