10
votes

Dessiner le cercle (à l'aide de pixels appliqués dans une image avec une boucle)

Je veux dessiner un cercle (avec 1 ou 2 pour les boucles) à l'aide de pixels Position (commence à gauche en haut à gauche et en bas à droite)

J'ai attiré avec succès un rectangle avec cette méthode: P>

img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();


1 commentaires

Vous voulez probablement google "Bresenham Circle" pour l'algorithme :-)


5 Réponses :


2
votes

Un moyen de faire cela serait de tester, pour chaque point dans le rectangle, que la distance entre ce pixel au centre du carré est inférieure au rayon de cercle prévu. Vous pouvez ensuite dessiner les pixels qui passent le test et sauter les pixels qui ne le font pas. Le rapport de la zone du cercle vers la zone du carré total est π / 4, qui est environ 0,77, ce n'est donc pas tout ce qui n'est pas inefficace.

Si vous voulez dessiner une ovale arbitraire qui convient au rectangle, vous pouvez utiliser cette même idée, mais modifierait le calcul qui déterminerait la distance au centre de telle sorte que vous donniez de manière proportionnelle moins de poids au long axe de la Ellipse.

J'espère que cela vous aidera!


0 commentaires

4
votes

Puisque vous avez déjà un bufferedimage code>, pourquoi ne pas créer d'objet graphique pour elle et utiliser cela pour dessiner le cercle? De cette façon, vous n'avez pas à réinventer la roue: xxx pré>

update strong> p>

voici un SSCCE : P>

public class DrawCircleExample extends Canvas {
    private static final int WIDTH = 32;
    private static final int HEIGHT = 32;

    public static void main(String[] args) {
        JFrame f = new JFrame("Draw circle example");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new DrawCircleExample());
        f.pack();
        f.setVisible(true);
    }

    private final BufferedImage img;

    public DrawCircleExample() {
        img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = img.createGraphics();
        g.setColor(Color.WHITE);
        g.fillOval(8, 8, 14, 14);
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(img.getWidth(),img.getHeight());
    }
}


4 commentaires

Je ne sais pas pourquoi mais je ne peux pas voir l'ovale.Me cadre est vide. D'AILLEURS. Pour rendu, j'utilise un imaginaire gros comme mon cadre


J'ai ajouté le code de test que j'utilisais à titre d'exemple. Est ce que ça aide?


J'utilise F.Ajouter (Class_Object); donc à cause de cela, rien ne fonctionne. Audd ceci à votre code drawcircleExample Circle = nouveau drawcircleexample (); F.Ajouter (cercle); Mais écrivez près de la classe publique DrawCirlerExampleExplent cette étendue


Vous devez écraser la méthode de peinture de la toile pour dessiner l'image sur la canvas. J'ai mis à jour l'exemple.



0
votes

désolé pour le retard Ce code fonctionne parfaitement xxx


2 commentaires

La double boucle est lente, vous pouvez utiliser une seule boucle pour faire le même travail. Pour augmenter encore les performances, vous pourriez alors faire quatre fois moins d'opérations carrées et de Squareroot en exploitant les deux symétries.


Si vous avez besoin de contour uniquement: si (D> = rayon -1 && d



11
votes

Voici le code du cercle de dessin avec des pixels: il utilise la formule xend = x + r cos (angle) et yend = y + r sin (angle). XXX

Référence: http://www.softwareanddfinance.com/turbo_c/drawcircle.html


3 commentaires

bios.h , graphique.h ... des tonnes sérieusement des dépendances inutiles. Et au-dessus de cela, vous avez math.h , qui a une constante de pi, mais vous allez définir votre propre ...


Si votre cercle est trop gros, cela ne fonctionnera pas; Vous obtiendrez juste 360 ​​points arrangés dans un cercle sans rien entre les deux.


Super! C'est le 6 (environ) et certainement le meilleur algorithme de cercle que j'ai essayé ce soir. Non seulement de la cohésion et de la densité aspect, mais aussi d'une vue de dessin: il suit exactement une trajectoire de cercle (jamais vu cela et l'aimer.) Et un avantage supplémentaire: on peut "jouer" avec "l'étape" pour dessiner le cercle plus vite . En fait, il n'y a pas besoin de 3 600 points. 720 points, en utilisant une étape de 0,5, sont déjà très bien. Upvoted.



4
votes

Vous pouvez calculer l'angle minimum entre deux pixels et améliorer la solution Kathir xxx


0 commentaires