Tracer un cercle sans : sin() , cos() ni la propriété circle [que du calcul (rapide) en fait ]

Soyez le premier à donner votre avis sur cette source.

Vue 8 707 fois - Téléchargée 356 fois

Description

Bon ce code est explique dans le fichier Explication du zip.
C'est des maths alors ce qui y sont alergique : FUYEZ !

Bon pour tracer un cercle avec ce code; il faut :
--> Le Centre (Cx,Cy)
--> Le Rayon

L'algo de mon cru a besoin de 3 point situés sur le cercle.
Il n'y a donc que 2 valeurs qui sont vraiment a connaitre (dur !!! ) pour tracer le cercle : Cos( 2.Pi/3 ) et Sin(2.Pi/3 )
-1/2 sqr(3)/2

Avec ces deux valeurs, on peut calculer tout les autres points !
Mais je vous conseille de regarder l'explication, si vosu êtes matheux vous comprendrez sinon... ben vous vous forcerez si ca vous interesse ! :)

Note : Idée fondatrice de ma prochain source : Simulation d'onde sur l'eau avec réflexion. That's all !

Source / Exemple :


' Pour les faignasses y'a tjrs le zip ! :þ

'Voici un aperçu de ce qu'il faut modifier pour pouvoir integrer ce code à un projet :

'Form.ScaleMode = 3 - Pixel

'Créer une PictureBox nommée "Plan"
'            Plan.Appearance = 0 - Flat
'            Plan.AutoRedraw = True No
'            Plan.BorderStyle = 0 - None
'            Plan.AutoRedraw = True
'            Plan.Height = 481
'            Plan.Width = 601
'            Plan.scaleMode = 3- Pixel
'            Plan.ScaleHeight = -481
'            Plan.ScaleLeft = 0
'            Plan.ScaleTop = 480
'            Plan.ScaleWidth = 601

'Creer un cmdButton nommé cmdTracer
'Creer un label nommé lblX
'Creer un label nommé lblY

'Déclaration :
Private Type Spot
X As Single
Y As Single
Lien As Long
End Type

Private Sub cmdTracer_Click()

'Vérifier que le traçage recouvre bien le cercle
Plan.Circle (300, 240), 200 ' N'entre pas dans l'algo ! c'est juste une Vérif !

'Déclaration des propriétés du cercle
Dim Cx As Single, Cy As Single 'Centre
Dim Rayon As Single 'Rayon

Dim lstP() As Spot, nbrP As Long ' Liste des points créés, ainsi que leur nombre
Dim n As Byte 'Précision (IMPORTANT)
n = 10 ' Faites varier ce nombre

    Dim p As Long, K As Long    ' Variable de boucles
    
Cx = 300       '
Cy = 240       '' Définition du centre et du rayon.
Rayon = 200    '

' On génére les trois points et on les lie l'un à l'autre.
nbrP = 3
ReDim lstP(nbrP)

lstP(1).X = Cx + Rayon * 1
lstP(1).Y = Cy + Rayon * 0
lstP(1).Lien = 2
Plan.PSet (lstP(1).X, lstP(1).Y), vbRed

lstP(2).X = Cx - Rayon / 2
lstP(2).Y = Cy + Rayon * Sqr(3) / 2
lstP(2).Lien = 3
Plan.PSet (lstP(2).X, lstP(2).Y), vbRed

lstP(3).X = Cx - Rayon / 2
lstP(3).Y = Cy - Rayon * Sqr(3) / 2
lstP(3).Lien = 1
Plan.PSet (lstP(3).X, lstP(3).Y), vbRed

For K = 1 To n 'Recréée successivement des points au mileu de ceux déja existant.
     DoEvents
     For p = 1 To K * 2 ^ K
         nbrP = nbrP + 1
         ReDim Preserve lstP(nbrP)
         U = (lstP(p).X + lstP(lstP(p).Lien).X) / 2 - Cx
         V = (lstP(p).Y + lstP(lstP(p).Lien).Y) / 2 - Cy
         lstP(nbrP).X = Rayon * U / Sqr(U ^ 2 + V ^ 2) + Cx
         lstP(nbrP).Y = Rayon * V / Sqr(U ^ 2 + V ^ 2) + Cy
         lstP(nbrP).Lien = lstP(p).Lien
         lstP(p).Lien = nbrP
         Plan.PSet (lstP(nbrP).X, lstP(nbrP).Y), vbRed
     Next p
     'Pause ': Mettez pause pour visionner Pas à Pas la construction.
Next K

End Sub

'Juste un affichage
Private Sub Plan_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
lblX.Caption = "X = " & X
lblY.Caption = "Y = " & Y
End Sub

Conclusion :


Pas de MAJ, Pas de bug...
Cet algo utilise un peu de mémoire, mais pas suffisement pour vraiment ralentir le pc.

A noter que la dim de lstP = 3 + 3 *1 + 3*2 + 3*4 + 3* 8 + 3*16 ... + 3*2^n
= 3 * ( 1 + 2 + 4 + 8 + 16 + ... + 2^n )
Magique ça ressemble a quelquechose de connu
soit : 3 * ( 2^ ( n + 1 ) - 1 )
Donc allez-y quand même molo avec n ! :) Pas de folie !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
vendredi 9 avril 2004
Statut
Membre
Dernière intervention
16 août 2004

il suffit d'utiliser le fait que sin² + cos² = 1 ce qui fait en remplacant : X² + Y² = 1 X et Y étant les coordonnées des points du cercle de centre O(0;0)

suffit de faire varier Y de -1 à 1 par pas très faible (genre 0.01 ou 0.01) on obtient X ( racine_carre(1-Y²) )
et le tour est joué !
Messages postés
438
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
26 juillet 2007
3
je dis pas le contraire, je dis juste ke ton titre est faux, je sais bien ke c casi impossible sans...
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010

Nargzul => Si tu avait un langage qui ne possede pas les fonctions cos() et sin() Comment ferai tu ?
Ici le code, ne demande que 2 valeurs ( en fait 4 avec cos(0) et sin(0) )
Un algo utilisant sin et cos ne pourrai etre retranscrit ! Avec celui la on contourne le problème en ne lui fournissant que 3 valeurs (connues), ce qui est relativement faible !

Craps => C'est un code sans prétention qui, a la base, n'est pas fait pour tracer 1 000 000 de cercles !
Il suffit amplement pour des softs de dessinage genre Paint brush etc ... où on trace une dizaine de cercles au max ; si par exemple on est contraint de ne pas utiliser cos et sin (et la fonction circle ou bien une homogue dans un autre langage )!
( De toutes façons quand on utilise paintbrush c'est qu'on a du temps à perdre ! :p )
Ce code permet de tracer une petite dizaine de cercles que l'utilisateur demande , pas pour mettre dans une boucle i=1 to 1000000 c'est évident ! :)
Messages postés
3
Date d'inscription
vendredi 1 mars 2002
Statut
Membre
Dernière intervention
1 juillet 2003

il existe surtout des algos aui permettent de n'utiliser que des additions... et donc assez rapide, si ca te bote, je peux essayer de retrouver la source (pbeck@gphy.campus.univ-poitiers.fr)
car la tu utilise les racines carre, fodrait faire des tests en tracant 1 million de cercle successif, pour voir....
Messages postés
438
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
26 juillet 2007
3
euh
TRACER UN CERCLE SANS : SIN() , COS() NI LA PROPRIÉTÉ CIRCLE [QUE DU CALCUL (RAPIDE) EN FAIT ]


et pis

Il n'y a donc que 2 valeurs qui sont vraiment a connaitre (dur !!! ) pour tracer le cercle : Cos( 2.Pi/3 ) et Sin(2.Pi/3 )
-1/2 sqr(3)/2

un peu contradictoire....

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.