Нарисуйте круг (используя пиксели, примененные к изображению с помощью цикла for) - PullRequest
9 голосов
/ 25 января 2012

Я хочу нарисовать круг (с 1 или 2 для циклов), используя положение пикселей (начинается слева сверху и заканчивается справа внизу)

Я успешно нарисовал прямоугольник с помощью этого метода:

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
        }

    }

}

Массив пикселей содержит индекс пикселей, за которым следует его цвет.

pixels[index]=color;

Перед этим я использую этот код для массива "изображения" и "пикселей" (если вам это поможет)

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

Но как я могу нарисовать только белые пиксели, как на этом изображении, и игнорировать другие пиксели?

Пиксельное изображение http://oi42.tinypic.com/2u61sud.jpg

Ответы [ 4 ]

6 голосов
/ 23 ноября 2013

Вот код для рисования круга с пикселями: он использует формулу xend = x + r cos (угол) и yend = y + r sin (угол).

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

Ссылка: http://www.softwareandfinance.com/Turbo_C/DrawCircle.html

4 голосов
/ 25 января 2012

Поскольку у вас уже есть BufferedImage, почему бы не создать для него графический объект и использовать его для рисования круга?Таким образом, вам не нужно заново изобретать колесо:

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

Обновление

Вот это 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());
    }
}

Это должно создать изображение, подобное этому:

Example output from circle example

1 голос
/ 23 июня 2012

Извините за задержку Этот код отлично работает

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

}
0 голосов
/ 25 января 2012

Один из способов сделать это - проверить для каждой точки в прямоугольнике, меньше ли расстояние от этого пикселя до центра квадрата, чем предполагаемый радиус круга.Затем вы можете нарисовать пиксели, которые проходят тест, и пропустить пиксели, которые не проходят.Отношение площади круга к площади всего квадрата составляет π / 4, что составляет около 0,77, так что на самом деле это не так уж и неэффективно.

Если вы хотите нарисовать произвольный овалкоторый вписывается в прямоугольник, вы можете использовать эту же идею, но измените вычисление, которое определит расстояние до центра, так, чтобы вы пропорционально меньше весили длинной оси эллипса.

Надеюсь, это поможет!

...