如何在java中进行抗锯齿?(无内置方法)

如何在java中进行抗锯齿?(无内置方法),java,image,image-processing,geometry,antialiasing,Java,Image,Image Processing,Geometry,Antialiasing,我将尽力为下面的代码提供上下文。这是一种用于在50x50白色正方形背景中绘制圆及其中心点的方法。使用了以下变量: xc,yx-用于计算圆的中心坐标 r-圆的半径 步骤-在圆周上绘制新点的频率 x、 y-构成圆的每个点的坐标 现在,我的方法使用for循环,根据圆心和半径沿圆周计算每个点的R、G和B坐标。我想做的是反锯齿我的输出圆,这样圆的部分就不会像锯齿一样。但是,我只想使用数学和变量来实现这一点,而不想使用任何Java的内置方法。感谢任何能帮助我或为我指明正确方向的人 以下是我的日常工作:

我将尽力为下面的代码提供上下文。这是一种用于在50x50白色正方形背景中绘制圆及其中心点的方法。使用了以下变量:

  • xc,yx-用于计算圆的中心坐标
  • r-圆的半径
  • 步骤-在圆周上绘制新点的频率
  • x、 y-构成圆的每个点的坐标
现在,我的方法使用for循环,根据圆心和半径沿圆周计算每个点的R、G和B坐标。我想做的是反锯齿我的输出圆,这样圆的部分就不会像锯齿一样。但是,我只想使用数学和变量来实现这一点,而不想使用任何Java的内置方法。感谢任何能帮助我或为我指明正确方向的人

以下是我的日常工作:

protected void proc_21() {
    info = "Draw anti-aliased circle";
    int xc = (int) rand(1, imgW - 2);
    int yc = (int) rand(1, imgH - 2);
    int r = (int) rand(4, 0.35f * (imgW + imgH));
    int STEP = (2 * (int) Math.PI * r) * 57;
    System.out.printf("circle centered at (%d,%d), radius = %d, draw in %d steps. \n", xc,yc,r,STEP);
    for (int i = 0; i < STEP; i++) {
        int x = (int) Math.round(xc + r * Math.cos(i));
        int y = (int) Math.round(yc + r * Math.sin(i));
        if (0 <= x && x < imgW) {
            if ( 0 <= y && y < imgH) {
                imgNew.setR(x, y, 0);
                imgNew.setG(x, y, 0);
                imgNew.setB(x, y, 1);
            }
        }
    }
    // set center to red
    imgNew.setR(xc, yc, 1);
    imgNew.setG(xc, yc, 0);
    imgNew.setB(xc, yc, 0);
}
受保护的无效程序21(){
info=“绘制抗锯齿圆”;
int xc=(int)rand(1,imgW-2);
int yc=(int)rand(1,imgH-2);
int r=(int)兰德(4,0.35f*(imgW+imgH));
整数步长=(2*(int)Math.PI*r)*57;
System.out.printf(“以(%d,%d)为中心的圆,半径=%d,以%d步进绘制。\n”,xc,yc,r,步进);
对于(int i=0;i如果(0供参考:在GPU/图形库上做任何事情通常都会更好/更快/更容易…但您可能知道…找到一本教科书或在线资源,从理论上介绍抗锯齿。然后实施。研究应由您自己完成。如果您在实施公式时遇到问题,可以在此处询问。您是专业人士bably将很难调整用于添加抗锯齿的算法,而不是从角度开始计算(x,y)坐标,从x开始计算y。你可以在开始的45度内这样做,然后旋转/反射以获得圆的其余部分。如果圆对于步长来说太大,你不必担心跳过任何像素,而且效率更高,因为你只需计算每个像素一次(并且避免了触发功能)。这应该不难适应Java。一旦你有了这一点作为出发点,你可以使用吴小林的直线算法的推广来添加抗锯齿。