绘制圆圈(使用带有for循环的图像中应用的像素)

时间:2012-01-25 18:18:43

标签: java image draw geometry

我想使用像素位置绘制一个圆圈(带有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;

在此之前,我将此代码用于“image”和“pixels”数组(如果这有助于你)

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

但是如何只绘制像这个图像中的白色像素而忽略其他像素呢?

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

5 个答案:

答案 0 :(得分:6)

以下是用像素绘制圆的代码:它使用公式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

答案 1 :(得分:4)

既然你已经拥有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

答案 2 :(得分:1)

抱歉延误 这段代码完美无缺

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

}

答案 3 :(得分:1)

您可以计算两个像素之间的最小角度并改善Kathir解法

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

      // calculates the minimun angle between two pixels in a diagonal.
      // you can multiply minAngle by a security factor like 0.9 just to be sure you wont have empty pixels in the circle
      double minAngle = acos(1 - 1/r);

      for(double angle = 0; angle <= 360; angle += minAngle)
      {
            x1 = r * cos(angle);
            y1 = r * sin(angle);
            putpixel(x + x1, y + y1, color);
      }
}

答案 4 :(得分:0)

这样做的一种方法是对矩形中的每个点测试从该像素到正方形中心的距离是否小于圆的预期半径。然后,您可以绘制通过测试的像素,并跳过没有通过测试的像素。圆的面积与总平方的面积之比是π/ 4,约为0.77,所以这实际上并不是那么低效。

如果你想绘制一个适合矩形的任意椭圆,你可以使用同样的想法,但会修改决定距离中心距离的计算,这样你就可以按比例减少对长轴的权重。椭圆形。

希望这有帮助!