【问题标题】:Plot circles with centre and radius绘制具有中心和半径的圆
【发布时间】:2014-02-28 13:38:03
【问题描述】:

我目前正在使用 WritableRaster 和它的 setPixed 方法,我需要它不只设置一个像素,而是设置一个半径为 r 的“圆”。 我在想的是这样的:

for(int y = -r; y < r; y++)
{
    for(int x = -r; x < r; x++)
    {
         raster.setPixel(x,y,color);
 }}

问题是,这是否可以制作一个圆圈,如果可以,我如何让它穿过里面的所有像素?

提前致谢!

编辑:对不起,我没有说清楚 - 我正在透明画布上制作橡胶工具,因此,如果我用透明颜色绘制一个圆圈,它不会删除之前的内容......这就是为什么我正在使用 setPixel。

编辑编辑:这是代码的输出(在 g2d 上,使用具有相同值的 drawLine,因此它只填充一个像素,就像方法 setPixel 中一样): http://i.imgur.com/a5QNMuX.png?1

EDIT EDIT EDIT:如果有人出于同样的原因想要使用此代码,我建议使用 BufferedImage.setRGB() 因为它更快。如果您不知道如何处理颜色(最后一个参数),请使用以下内容:

...
buffImg.setRGB(x,y,new Color(r,g,b,a).getRGB());
...

【问题讨论】:

  • 你试过这个代码吗?你得到了什么?
  • 这是基本的计算机图形学,有很多关于它的资料,你甚至可以从维基百科开始:en.wikipedia.org/wiki/Midpoint_circle_algorithm
  • 您必须使用 WritableRaster 吗?如果这是 BufferedImage 的一部分,您应该使用 BufferedImage 的 Graphics 上下文绘制圆。 (如果它不是 BufferedImage 的一部分,(我想知道它来自哪里以及您在那里做什么,但是)人们甚至可以考虑将 WriteableRaster “包装”在 BufferedImage 中,以使用方便的方法通过图形对象)。
  • 对不起,伙计们-我不小心删除了问题并忘记将其放回...问题是,这是否可以制作一个圆圈,如果可以,我将如何使它通过所有像素里面?
  • @Marco13 对不起,我没有说清楚-我正在透明画布上制作橡胶工具,因此,如果我用透明颜色画一个圆圈,它不会删除之前的内容。 .. 这就是我使用 setPixel 的原因。

标签: java graph geometry raster coords


【解决方案1】:

您必须按照自己的方式单独填写每一行,但请注意,您必须调整x 的半径范围。这有点类似于进行 2D(离散)集成。基本思路是x^2 + y^2 = r^2在外界,yr都是固定的,所以……:

for(int y = -r; y < r; y++)
{
    int bound = (int)(sqrt(r * r - y * y) + 0.5);
    for(int x = -bound; x < bound; x++)
    {
         raster.setPixel(x,y,color);
    }
}

... + 0.5 是一种安全的四舍五入到最接近整数的方法(而不是只使用 floor 进行强制转换),因为 bound 将始终为正数。

【讨论】:

  • 谢谢!但是有一个问题:您需要强制转换为 int,否则完美!这是输出:imgur.com/c3V99EW
猜你喜欢
  • 1970-01-01
  • 2014-01-12
  • 2013-12-15
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多