【问题标题】:I want to fill a contour in java我想在java中填充轮廓
【发布时间】:2017-03-19 16:52:57
【问题描述】:

我创建了一个包含点列表的闭合轮廓,我想用颜色填充这些点。我使用了边界填充递归算法,但没有运气数组索引超出范围,因为我无法开发 if 条件,因为闭合轮廓内的颜色和轮廓外的颜色相同。我应该使用什么方法来让所需的轮廓被特定颜色填充。这是我尝试过的代码

public class BoundaryFillAlgorithm {
public static BufferedImage toFill = MemoryPanel.Crect;
static Graphics g1 = toFill.getGraphics();
static int seedx = toFill.getWidth()/2;
static int seedy = toFill.getHeight()/2;

public static void BoundaryFill(int x,int y){

    Color old = new Color(toFill.getRGB(x, y));     
    g1.setColor(Color.BLACK);
    if(old!=Color.BLACK){       
    g1.fillOval(x, y, 1, 1);
    BoundaryFill(x+1,y);
    BoundaryFill(x,y+1);
    BoundaryFill(x-1,y);
    BoundaryFill(x,y-1);
    }
}

这是图片

这是方法调用

BoundaryFillAlgorithm.BoundaryFill(BoundaryFillAlgorithm.seedx,BoundaryFillAlgorithm.seedy);

【问题讨论】:

    标签: java arrays swing marvin-framework marvinproject


    【解决方案1】:
    g.setColor(Color.red); // Set color to red
    g.fillRect(600, 400, 100, 100);// a filled-in RED rectangle
    

    【讨论】:

      【解决方案2】:

      为什么要重新发明轮子?
      Graphics2D 已经有一个方法 fill(Shape)。 有很多类实现了Shape 接口,尤其是Polygon, 可以重复使用。

      【讨论】:

      • 不规则形状如三角形 abd 一个矩形融合在一起意味着矩形的一侧是三角形的一侧
      • @NizamAhmed 我预计这里不会出现问题。使用PathGeneralPath,您可以构造由多个子路径组成的形状。
      【解决方案3】:

      终于更正了我的代码,这里是更正后的代码:

      import java.awt.Graphics;
      import java.awt.image.BufferedImage;
      
      public class BoundaryFillAlgorithm {
      public static BufferedImage toFill = MemoryPanel.Crect;
      Graphics g1 = toFill.getGraphics();     
      
      public BoundaryFillAlgorithm(BufferedImage toFill){
          int x = toFill.getWidth()/2-10;
          int y = toFill.getHeight()/2;
          int old = toFill.getRGB(x, y);
          this.toFill = toFill;
          fill(x,y,old);  
      }
      
      private void fill(int x,int y,int old) {
          if(x<=0) return;
          if(y<=0) return;
          if(x>=toFill.getWidth()) return;
          if(y>=toFill.getHeight())return;
      
          if(toFill.getRGB(x, y)!=old)return;
          toFill.setRGB(x, y, 0xFFFF0000);
          fill(x+1,y,old);
          fill(x,y+1,old);
          fill(x-1,y,old);
          fill(x,y-1,old);
          fill(x+1,y-1,old);
          fill(x+1,y+1,old);
          fill(x-1,y-1,old);
          fill(x+1,y-1,old);
      
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2014-11-26
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        相关资源
        最近更新 更多