2012-01-25 23 views
9

chcę narysować okrąg (z 1 lub 2 pętle) przy użyciu pikseli pozycji (rozpoczyna się w lewym górnym rogu, a kończy się na dole po prawej)Draw koło (używając pikseli zastosowane w obrazie z pętli)

pomyślnie narysował prostokąt za pomocą tej metody:

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 
     } 

    } 

} 

Tablica pikseli zawiera indeks pikseli, po którym następuje jego kolor.

pixels[index]=color; 

Przedtem Używam tego kodu dla „obraz” i „pikseli” tablicy (jeśli to pomaga)

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

Ale jak mogę wyciągnąć tylko białych pikseli jak w tym obrazie i ignorować inne piksele?

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

+1

Prawdopodobnie chcesz Google, „Bresenham Krąg” dla algorytmu :-) – BRFennPocock

Odpowiedz

1

Niestety opóźnienia ten kod działa doskonale

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

Podwójna pętla jest powolna, można użyć pojedynczej pętli do wykonania tej samej pracy. Aby jeszcze bardziej zwiększyć wydajność, możesz wykonać czterokrotnie mniej kwadratowych i pierwiastkowych operacji, wykorzystując dwie symetrie. –

+0

Dziękujemy za napiwek! – boyd

+0

Jeśli potrzebujesz tylko konturu: jeśli (d> = promień -1 && d

0

Jednym ze sposobów, aby to zrobić, będzie test dla każdego punktu w prostokącie, czy odległość od tego piksela na środku placu jest mniejsza niż zamierzonym promieniem okręgu. Następnie można narysować piksele, które przejdą test i pomijać piksele, które nie są. Stosunek powierzchni koła do powierzchni całego kwadratu wynosi π/4, czyli około 0,77, więc nie jest to wcale tak mało wydajne.

Jeśli chcesz narysować dowolny owal pasujący do prostokąta, możesz użyć tego samego pomysłu, ale zmodyfikuje on obliczenie, które wyznaczy odległość do środka, dzięki czemu proporcjonalnie zmniejszysz wagę do długiej osi elipsa.

Mam nadzieję, że to pomoże!

4

Skoro masz już BufferedImage, czemu nie utworzyć obiektu graficznego i użyć go do narysowania okręgu? W ten sposób nie trzeba wyważać otwartych drzwi:

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

Aktualizacja

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

Należy uzyskać obraz tak:

Example output from circle example

+0

nie wiem dlaczego, ale nie mogę zobaczyć ramkę oval.My jest pusty. BTW. Do renderowania używam wyobrażenia wielkiego jak moja klatka – boyd

+0

Dodałem kod testowy, którego użyłem jako przykładu. To pomaga? –

+0

używam f.add (class_object), więc z tego powodu nic nie działa.dodaj to do swojego kodu DrawCircleExample circle = new DrawCircleExample(); f.add (circle); ale napisz w pobliżu klasy publicznej DrawCircleExample to extends Canvas – boyd

3

Oto kod rysunku koło z pikseli: Wykorzystuje cos wzór xKoniec = x + R (w pionie) i yend = y + R sin (kąt) .

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

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

+0

'bios.h',' graphics.h' ... Poważnie ton niepotrzebnych zależności. A do tego masz 'math.h', który ma stałą PI, a mimo to definiujesz swoje własne ... – rbaleksandar

+0

Jeśli twój krąg jest zbyt duży, to nie zadziała; dostaniesz 360 punktów ułożonych w kółko i nic pomiędzy nimi. – ostrichofevil