计算机图形学-边界标志算法-java实现

这篇博客介绍了一种使用Java实现的边界标志算法,用于计算机图形学中的二维图形填充。首先创建了一个`BoundaryColor`类,并通过`TwoDimen`环境类来处理图形。博主给出了一个四边形ABCD的坐标,并详细展示了如何计算直线斜率,遍历边界并设置标志来填充图形。最后,博主使用双层循环遍历整个区域,根据标志判断是否绘制或清除像素点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import javax.swing.JFrame;

public class BoundaryColor {
 TwoDimen env;
 public static void main(String args[]) {
  new BoundaryColor();
 }

 public BoundaryColor() {
  // A(3,15)B(18,30)C(33,15)D(15,3)
  // AB BC CD DA
  JFrame frame = new JFrame();
  env = new TwoDimen();
  frame.getContentPane().add(env);
  frame.setBounds(100, 100, 600, 600);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setResizable(false);
  frame.setVisible(true);
  int[] X = new int[] { 3, 18, 33, 15, 3 };
  int[] Y = new int[] { 15, 30, 15, 3, 15 };
  int i = 0;
  double x, y;
  double dy, dx;
  int ymin, ymax;
  for (i = 0; i < X.length - 1; i++) {
//   System.out.println(i);
   dy = Y[i + 1] - Y[i];
   if (dy != 0) {
    dx = (X[i + 1] - X[i]) / dy;
    if (dy > 0)
     x = X[i];
    else
     x = X[i + 1];
    if (Y[i] >= Y[i + 1]) {
     ymin = Y[i + 1];
     ymax = Y[i];
    } else {
     ymin = Y[i];
     ymax = Y[i + 1];
    }
    /*for (y = ymin; y <= ymax - 1; y++) {
     x = x + dx;
     if (env.isFlag((int) x, (int) y)) {
      env.setFlag((int) (x + 1), (int) y);
     } else {
      env.setFlag((int) x, (int) y);
     }
    }*/
    int k,j;
    k=Math.abs(X[i+1]-X[i]);
    if(Math.abs(Y[i+1]-Y[i])>k)k=Math.abs(Y[i+1]-Y[i]);
    dx=(float)(X[i+1]-X[i])/k;
    dy=(float)(Y[i+1]-Y[i])/k;
    x=(float)(X[i]);
    y=(float)(Y[i]);
    for(j=0;j<k;j++){
     if (env.isFlag((int) (x+0.5), (int) (y+0.5))) {
      env.setFlag((int) (x + 1.5), (int) (y+0.5));
     } else {
      env.setFlag((int) (x+0.5), (int) (y+0.5));
     }
     x=x+dx;
     y=y+dy;
    }
   }
  }

  // ************************************
  double maxx, maxy, minx, miny;
  double x1, y1;
  int in_flag = 0;
  minx = X[0];
  maxx = X[2];
  miny = Y[3];
  maxy = Y[1];
  for (y1 = miny - 1; y1 <= maxy - 1; y1++) {
   in_flag = 0;
   for (x1 = minx - 1; x1 <= maxx - 1; x1++) {
    if (env.isFlag((int) x1, (int) y1)) {
     if (in_flag==0)
      in_flag=1;
     else
      in_flag=0;
    }
    if(in_flag!=0)
     env.drawPoint((int)x1,(int)y1);
    else
     env.cleanPoint((int)x1,(int)y1);
   }
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值