Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1410 connectés 

  FORUM HardWare.fr
  Programmation
  C

  pb calcul de rayon entre deux points sans sqrt

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pb calcul de rayon entre deux points sans sqrt

n°1782219
lanfeust37
Posté le 03-09-2008 à 17:26:10  profilanswer
 

Bon voila je suis sur un projet Open source avec 2 autres personne. Je suis en 2eme annee d'informatique et j'ai besoin de calculer le rayon d'un cercle entre deux points (x1,y1) et (x2, y2)  , ou (x1,y1) correspond au centre du cercle.
J'utlise un programme de SDL qui affiche en temps reel un cercle, sachant que son rayon varie tout le temps le programme ram quand le rayon depasse 500.  
Ce qui pose un petit probleme, est ce que quelqu'un aurait un autre formule que celle la  :??: :
R = sqrt((x0 - x2) * (x0 - x2) + (y0 - y2) * (y0 - y2));
 
Merci d'avance   ;)

mood
Publicité
Posté le 03-09-2008 à 17:26:10  profilanswer
 

n°1782222
flo850
moi je
Posté le 03-09-2008 à 17:28:26  profilanswer
 

il y a des methode de calcul plus rapide pour la racine carré, mais je serai surpris que ce soit ce calcul qui fasse ramer ( a moins que  tu ne fasse tourner ca sur du matériel embarqué )

n°1782230
lanfeust37
Posté le 03-09-2008 à 17:33:00  profilanswer
 

bah y a deux truc qui font ramer le programme la premiere est sqrt pour le rayon et la deuxieme est le fais que je parcours une boucle while pour tracer le cercle sur 360 degres j'ai regler ce probeme en fesant un symetrie et en ne fesant que 90 degres du cercle.
Cependant si je met en commentaire ma boucle while le programme ram encore quand le rayon est trop grand... je cherche depuis ce matin un moyen efficace pour ce probleme. Mais je dois chercher mal malheureusement T.T

n°1782232
MagicBuzz
Posté le 03-09-2008 à 17:33:02  profilanswer
 

c surtout le coup du "500" qui me pose problème à moi.
 
à part que tu dessines ton cercle, tu tenterais pas de faire de la détection de collision ou autre ? genre quand t'arrive à 500 t'as beaucoup plus d'objets à tester et du coup ça effondre les perfs ?

n°1782240
lanfeust37
Posté le 03-09-2008 à 17:37:23  profilanswer
 

Nan aucune gestion de collision, c'est juste que le cercle devient trop grand. Et pour le moment je ne test que mon cercle comme objet donc je n'ai pas d'autre objet a tester.
Mais sinon pour ce probleme de sqrt y a un autre moyen une autre formule ??

n°1782281
preposteru​s
Posté le 03-09-2008 à 19:13:49  profilanswer
 

Que fais-tu avec le rayon, des fois on peut se contenter de la valeur carrée par ex si on cherche à savoir si un point est dans le cercle

n°1782286
Joel F
Real men use unique_ptr
Posté le 03-09-2008 à 19:34:33  profilanswer
 

preposterus a raison, en genral pour eviter de faire une sqrt, on change l'algo en le mettant au carré.

n°1782294
Un Program​meur
Posté le 03-09-2008 à 19:57:01  profilanswer
 

Je ne vois pas pourquoi pour tracer un cercle on a besoin de calculer des racines carrées, à la rigueur une si le cercle est défini par le centre et un point.

 

Voir http://homepage.smc.edu/kennedy_john/BCIRCLE.PDF par exemple.

Message cité 1 fois
Message édité par Un Programmeur le 03-09-2008 à 20:24:58
n°1782315
gilou
Modérateur
Modzilla
Posté le 03-09-2008 à 21:05:01  profilanswer
 

Un Programmeur a écrit :

Je ne vois pas pourquoi pour tracer un cercle on a besoin de calculer des racines carrées, à la rigueur une si le cercle est défini par le centre et un point.
 
Voir http://homepage.smc.edu/kennedy_john/BCIRCLE.PDF par exemple.

En fait, ce qu'il calcule la, avec sa formule, c'est la distance entre deux points. Apres, si tu prends pour centre l'un des points et que tu traces un cercle passant par l'autre, cette distance est le rayon du cercle...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1782398
el muchach​o
Comfortably Numb
Posté le 04-09-2008 à 07:30:09  profilanswer
 

Et pourquoi le calcul du rayon serait plus lent quand le cercle est plus grand ???


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
mood
Publicité
Posté le 04-09-2008 à 07:30:09  profilanswer
 

n°1782419
MagicBuzz
Posté le 04-09-2008 à 09:03:00  profilanswer
 

el muchacho a écrit :

Et pourquoi le calcul du rayon serait plus lent quand le cercle est plus grand ???


ça, c'est bien le truc qui me fait tiquer, d'où ma question sur d'éventuels autres traîtements

n°1782429
theshockwa​ve
I work at a firm named Koslow
Posté le 04-09-2008 à 10:08:35  profilanswer
 

ce ne serait pas tout bêtement que le rayon est calculé à chaque itération au lieu d'être calculé une seule fois et réutilisé ?
 
Edit : http://fr.wikipedia.org/wiki/Algor [...] _Bresenham ca peut aussi éventuellement te servir ...


Message édité par theshockwave le 04-09-2008 à 10:17:56
n°1782437
MagicBuzz
Posté le 04-09-2008 à 10:26:38  profilanswer
 

ceci dit, si c'est calculé pour dessiner le cercle selon chaque degré d'angle, le nombre de points est le même quelle que soit la taille du rayon, donc pas de lien avec la dimension du cercle

n°1782443
theshockwa​ve
I work at a firm named Koslow
Posté le 04-09-2008 à 10:39:45  profilanswer
 

MagicBuzz a écrit :

ceci dit, si c'est calculé pour dessiner le cercle selon chaque degré d'angle, le nombre de points est le même quelle que soit la taille du rayon, donc pas de lien avec la dimension du cercle


 
tant que je n'ai pas vu l'algorithme utilisé, je ne ferai pas ce genre de suppositions :) Ca ne me surprendrait pas qu'il ait augmenté le nombre d'itération en fonction du rayon justemnt pour éviter d'avoir des blancs entre les points.
Reste que cet algorithme naïf n'est clairement pas le melleur choix si on se soucie des performances ...

n°1782444
lanfeust37
Posté le 04-09-2008 à 10:41:42  profilanswer
 

en tout cas merci, pour toute vos reponse je pense avoir reussit a trouver mon probleme, vu que en SDL je creer une surface qui va contenir on cercle, seulement plus le cercle est grand plus la surface a creer va etre grand d'ou le lag de mon prog.
Jvais me poster sur ce probleme merci encore (ps: venez me voir au forum "paris capital du libre ;) )

n°1782505
MagicBuzz
Posté le 04-09-2008 à 12:11:40  profilanswer
 

theshockwave a écrit :


 
tant que je n'ai pas vu l'algorithme utilisé, je ne ferai pas ce genre de suppositions :) Ca ne me surprendrait pas qu'il ait augmenté le nombre d'itération en fonction du rayon justemnt pour éviter d'avoir des blancs entre les points.
Reste que cet algorithme naïf n'est clairement pas le melleur choix si on se soucie des performances ...


c'est lui qui a dit qu'il faisait le dessin en faisant un angle de 1° à chaque fois ;) et que pour accélérer le truc il faisait le dessin sur 90° puis faisait des symétries ;)

n°1782522
theshockwa​ve
I work at a firm named Koslow
Posté le 04-09-2008 à 12:42:55  profilanswer
 

MagicBuzz a écrit :


c'est lui qui a dit qu'il faisait le dessin en faisant un angle de 1° à chaque fois ;) et que pour accélérer le truc il faisait le dessin sur 90° puis faisait des symétries ;)


 
Trouve-moi où c'est précisé 1° à la fois :)
 
mais bref, osef

n°1782547
xilebo
noone
Posté le 04-09-2008 à 13:45:40  profilanswer
 

Ceci peut surement t'aider :
 

Code :
  1. float InvSqrt(float x)
  2. {
  3. float xhalf = 0.5f*x;
  4. int i = *(int*)&x; // get bits for floating value
  5. i = 0x5f3759df - (i>>1); // gives initial guess y0
  6. x = *(float*)&i; // convert bits back to float
  7. x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
  8. return x;
  9. }


 
http://www.lomont.org/Math/Papers/2003/InvSqrt.pdf

n°1782558
lanfeust37
Posté le 04-09-2008 à 13:55:49  profilanswer
 

thx ;)

n°1782621
MagicBuzz
Posté le 04-09-2008 à 15:25:22  profilanswer
 

lanfeust37 a écrit :

je parcours une boucle while pour tracer le cercle sur 360 degres j'ai regler ce probeme en fesant un symetrie et en ne fesant que 90 degres du cercle.


désolé, mais c'est écrit :spamafote:
 
faire une boucle sur 360° c'est faire une boucle pour chacun des 360° degrés :spamafote:

n°1783346
Sve@r
Posté le 06-09-2008 à 10:07:40  profilanswer
 

lanfeust37 a écrit :

Bon voila je suis sur un projet Open source avec 2 autres personne. Je suis en 2eme annee d'informatique et j'ai besoin de calculer le rayon d'un cercle entre deux points (x1,y1) et (x2, y2)  , ou (x1,y1) correspond au centre du cercle.
J'utlise un programme de SDL qui affiche en temps reel un cercle, sachant que son rayon varie tout le temps le programme ram quand le rayon depasse 500.  
Ce qui pose un petit probleme, est ce que quelqu'un aurait un autre formule que celle la  :??: :
R = sqrt((x0 - x2) * (x0 - x2) + (y0 - y2) * (y0 - y2));
 
Merci d'avance   ;)


 
La formule du rayon d'un cercle est mathématique. Ca ne peut donc pas changer.
 
En revanche, tu peux utiliser cet algo issu de la propriété de la suite  
- U0 = X (X nombre quelconque différent de 0)
- Un+1 = ½ (Un + N/Un)
Et qui est croissante vers racine(N)
 

Code :
  1. // Fonction "racine"
  2. double racine(
  3.     double nb)                // Paramètre recevant le nombre dont on veut la racine
  4. {
  5.     // Déclaration des variables
  6.     double calc;            // Calcul de la racine dans la boucle
  7.     double diff;                // Pour tester la différence avec la valeur précédente
  8.  
  9.     // Si la racine n'a pas besoin d'être calculée (pour "0" ou "1" )
  10.     if (nb == 0.0 || nb == 1.0) return (nb);
  11.  
  12.     // Initialisation début de boucle
  13.     calc=nb;                // Ou n'importe quel nombre différent de "0"
  14.  
  15.     do {
  16.         // Récupération de "calc" pour comparer avec le calcul suivant
  17.         diff=calc;
  18.  
  19.         // Approximation de la racine
  20.         calc=0.5 * (calc + nb / calc);
  21.     
  22.     // Tant que le processeur peut faire la différence entre ce calcul et le précédent (limite)
  23.     } while (calc != diff);
  24.  
  25.     return (calc);                // Ou bien "return (diff)" puisque ici, "diff" = "calc"
  26. }


 
Je sais pas si c'est plus ou moins rapide que sqrt() mais c'est mathématiquement équivalent.


Message édité par Sve@r le 06-09-2008 à 10:08:50

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1783798
theshockwa​ve
I work at a firm named Koslow
Posté le 08-09-2008 à 10:57:47  profilanswer
 

sinon, si tu veux rester sur ton algo, tu peux aussi assez facilement faire de la symétrie par coups de 45° et aussi faire des tables de précalcul (tableau de sinus et cosinus), t'assurer que tu ne calcules qu'une seule fois ton rayon (le sqrt hors de ta boucle, donc)
 
Précision : parce que je doute que ce soit juste d'avoir même 90 sqrt  pour tracer ton cercle qui te fasse un ralentissement notable si tu ne el fais qu'une fois


Message édité par theshockwave le 08-09-2008 à 10:59:18
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  pb calcul de rayon entre deux points sans sqrt

 

Sujets relatifs
Problème de calcul modulomise a jour feuille avec excel des calcul d'une fonction
[EXCEL] Calcul complexe : répartition via colonneQuels sont les points forts d'UML ?
[ACCESS] convertir virgules en points[VBA] Problème de calcul d'une maturité pour un pricer d'option
Aide code VBA -calcul Moyenne mobile-calcul automatique dans un formulaire
Fonction de calcul de stock par ordre d'insertionExcel modifier régle général de calcul
Plus de sujets relatifs à : pb calcul de rayon entre deux points sans sqrt


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR