Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Faire un cercle en C
Pokallan Hors ligne Membre Points: 30 Défis: 0 Message

Faire un cercle en C

Posté le 07/06/2017 22:39

Bonjour tout le monde, je cherche juste un code qui me permette de mettre l'endroit du centre du cercle ainsi que son rayon pour qu'il se trace, j'ai donc essayé avec ça:
void cercle(int x0, int y0, int r)
{
    int x,y;
    double a;
    while(a<2*3.1416){
        x=r*cos(a)+x0;
        y=r*sin(a)+y0;
        if(x>=0 && x<128 && y>=0 && y<64)Bdisp_SetPoint_VRAM(x,y,1);
        a=0.015+a;
    }
}

Malheuresement, cela fait bugger mon programme en m'affichant une erreur "Nonexisting memory by data read access at FFFFFFE4". Auriez-vous des idées?
Merci d'avance pour ceux qui prendront de leur temps!


Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/06/2017 22:44 | #


Tu as oublié d'initialiser ta variable a, ce qui est relativement dommage parce que ton cercle ne sera probablement pas complet, voire vide, voire mettra très longtemps à se dessiner. Sinon ça m'a l'air correct, vérifie que tu as bien inclus <math.h> dans ce fichier.

Par ailleurs, cet algorithme naïf ne sera pas toujours très satisfaisant, ou rapide. Si tu es curieux, jette un œil au (classique) algorithme de Bresenham pour quelque chose de plus optimisé.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Pokallan Hors ligne Membre Points: 30 Défis: 0 Message

Citer : Posté le 07/06/2017 22:53 | #


Ai-je besoin d'une bibliothèque particulière pour l'algorithme de Bresenham?
Merci beaucoup d'avoir répondu aussi vite!
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/06/2017 22:55 | #


Il te suffit d'ajouter la ligne :
#include <math.h>

au début du fichier dans lequel la fonction cercle() est définie. Le SDK fournit une version de <math.h> compatible avec la machine ; tu ne devrais ni en utiliser un autre ni en écrire un toi-même.

L'algorithme de Bresenham n'a besoin que d'opérations arithmétiques basiques, tu peux l'implémenter sans même utiliser <math.h>.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Pokallan Hors ligne Membre Points: 30 Défis: 0 Message

Citer : Posté le 07/06/2017 23:01 | #


Je viens d'essayer le programme proposé dans le wikipedia mais il y a beaucoup trop d'erreur, rien que sur la première ligne de code, "public static List<Point>" qui me mets 4 erreurs pour chaque mots, soit "Undeclared name" ou "Illegal token" pour "static", je n'y comprends pas grands chose, un peu d'aide serait la bienvenue
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/06/2017 23:05 | #


Ouh là, ce n'est pas si simple !

D'abord, on ne peut pas implémenter un algorithme avant de l'avoir compris. Il s'agit d'une méthode théorique : tu es supposé la lire et (grossièrement) comprendre son fonctionnement pour écrire toi-même un programme qui fasse ce qui est demandé.

En l'occurrence le code d'exemple sur la page Wikipédia est du C# (le dièse est important) : c'est un langage certes proche du C (et pas que dans le nom), mais ce n'est pas du C. Aucune chance que ça compile ! À la place, tu devrais écrire ta propre fonction en effectuant les bons calculs. En plus, cette fonction ne trace pas le cercle mais renvoie une liste des points à tracer pour obtenir le cercle... ce qui est assez différent.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Pokallan Hors ligne Membre Points: 30 Défis: 0 Message

Citer : Posté le 07/06/2017 23:14 | #


void cercle(int x0, int y0, int r)
{
    int x,y,p;
    x=0;
    y=r;
    ML_pixel(x0+x,y0-y,ML_BLACK);
    p=3-(2*r);
    for(x=0;x<=y;x++)
    {
        if (p<0)
    {
        p=(p+(4*x)+6);
    }
    else
    {
        y=y-1;
        p=p+((4*(x-y)+10));
    }

    ML_pixel(x0+x,y0-y,ML_BLACK);
    ML_pixel(x0-x,y0-y,ML_BLACK);
    ML_pixel(x0+x,y0+y,ML_BLACK);
    ML_pixel(x0-x,y0+y,ML_BLACK);
    ML_pixel(x0+y,y0-x,ML_BLACK);
    ML_pixel(x0-y,y0-x,ML_BLACK);
    ML_pixel(x0+y,y0+x,ML_BLACK);
    ML_pixel(x0-y,y0+x,ML_BLACK);
    }
}

Ça, ça marcherait mieux?


Nathan Belge Invité

Citer : Posté le 17/06/2017 17:28 | #


Sinon j'ai vu un code sur Wikipédia et il disait d'encoder "public static" mais je n'ai pas trouvé cette option. Y-a-t-il moyen de le faire sur une Casio Graph 35+?
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 17/06/2017 18:09 | #


public n'est pas un mot-clé en C. Tu as vu un exemple de code sur un autre langage, et il y a très peu de chance que tu puisses en faire quoi que ce soit.

@Pokallan (désolé pour le vide de réponse '-' ), pourquoi ne pas avoir suivi les indications de l'algorithme ? Tu as implémenté, euh... autre chose, manifestement (pas les mêmes formules, pas la même boucle, etc).
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 78 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd