2012-01-25 23 views
9

quiero dibujar un círculo (con 1 o 2 para bucles) utilizando la posición pixeles (comienza desde la parte superior izquierda y termina en la parte inferior derecha)círculo Draw (usando pixeles aplicados en una imagen con bucle)

I con éxito dibujó un rectángulo con este método:

private void drawrect(int width,int height,int x,int y) { 
    int top=y; 
    int left=x; 

    if(top<0){ 
     height+=top; 
     top=0; 
     } 
    if(left<0){ 
     width+=left; 
     left=0; 
    } 

    for (int j = 0; j <width; j++) { 
     for (int i = 0; i <height; i++) { 
        pixels[((i+top)*w)+j+left] = 0xffffff;//white color 
     } 

    } 

} 

la matriz de píxeles contiene el índice de píxel seguido por su color.

pixels[index]=color; 

Antes de que yo uso este código para "imagen" y la serie "píxeles" (si esto le ayuda)

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

Pero ¿Cómo se dibuja sólo los píxeles blancos como en esta imagen y pasar por alto los otros píxeles?

Pixel Image http://oi42.tinypic.com/2u61sud.jpg

+1

Es posible que desee Google, “Bresenham Círculo” para el algoritmo :-) – BRFennPocock

Respuesta

1

Siento el retraso Este código funciona perfectamente

private void drawcircle(int x,int y,int radius){ 
    for(int i=x;i<radius*2;i++) 
     for(int j=x;j<radius*2;j++){ 
      int d= (int) Math.sqrt((i-radius)*(i-radius)+(j-radius)*(j-radius)); 
       if(d<radius) 
        pixels[i+j*WIDTH]=346346; 
     } 

} 
+2

El bucle doble es lento, puede usar un solo bucle para hacer el mismo trabajo. Para aumentar aún más el rendimiento, puedes hacer cuatro veces menos operaciones de raíz cuadrada y cuadrada explotando las dos simetrías. –

+0

¡Gracias por el consejo! – boyd

+0

Si solo necesita contorno: if (d> = radius -1 && d

0

Una forma de hacer esto sería probar, para cada punto en el rectángulo, sea o no la distancia de ese pixel con el centro del cuadrado es menor que el radio previsto del círculo. A continuación, puede dibujar los píxeles que pasan la prueba y omitir los píxeles que no lo hacen. La relación entre el área del círculo y el área del cuadrado total es π/4, que es aproximadamente .77, por lo que en realidad esto no es tan ineficiente.

Si desea dibujar un óvalo arbitrario que se ajuste al rectángulo, puede usar esta misma idea, pero modificaría el cálculo que determinaría la distancia al centro de manera que proporcione proporcionalmente menos peso al eje largo de la elipse

Espero que esto ayude!

4

Dado que ya tiene un BufferedImage, ¿por qué no crear un objeto gráfico para él y usarlo para dibujar el círculo? De esa manera usted no tiene que reinventar la rueda:

BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = img.createGraphics(); 
    g.setColor(Color.WHITE); 
    g.fillOval(x, y, width, height); 

actualización

Aquí es un SSCCE:

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()); 
    } 
} 

debe producir una imagen como esta:

Example output from circle example

+0

No sé por qué, pero no puedo ver el marco oval.My está en blanco. BTW. Para renderizar estoy usando una imagen grande como mi marco – boyd

+0

Agregué el código de prueba que estaba usando como ejemplo. ¿Eso ayuda? –

+0

estoy usando f.add (class_object); Por eso, nada funciona.agregue esto a su código DrawCircleExample circle = new DrawCircleExample(); f.add (circle); pero escriba cerca de la clase pública DrawCircleExample this extends Canvas – boyd

3

Este es el código para la elaboración de círculo con píxeles: Utiliza los cos fórmula xend = x + r (ángulo) y yEnd = y + r sen (ángulo) .

#include <stdio.h> 
#include <graphics.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <bios.h> 
#include <math.h> 

void DrawCircle(int x, int y, int r, int color) 
{ 
     static const double PI = 3.1415926535; 
     double i, angle, x1, y1; 

     for(i = 0; i < 360; i += 0.1) 
     { 
      angle = i; 
      x1 = r * cos(angle * PI/180); 
      y1 = r * sin(angle * PI/180); 
      putpixel(x + x1, y + y1, color); 
     } 
} 

Referencia: http://www.softwareandfinance.com/Turbo_C/DrawCircle.html

+0

'bios.h',' graphics.h' ... En serio toneladas de dependencias innecesarias. Y encima de eso tienes 'math.h', que tiene una constante PI en él, pero vas a definir tu propio ... – rbaleksandar

+0

Si tu círculo es demasiado grande, entonces esto no funcionará; obtendrás 360 puntos dispuestos en círculo sin nada en el medio. – ostrichofevil

Cuestiones relacionadas