如何光栅化特定的圆角,MIDPOINT

时间:2017-11-16 17:21:26

标签: java canvas graphics geometry

我遇到了问题。我正在尝试使用中点算法栅格化圆的一部分。该部分由startAngle,endAngle输入。

在谷歌的帮助下,我做到了这一点:

public RasterImage<PixelType> rasterizeCircleSector(RasterImage<PixelType> img,
                                                    double centerX, double centerY,
                                                    double x, double y,
                                                    int startAngle, int endAngle,
                                                    PixelType value){

    RasterImage<PixelType> result = img;

    int angle = (int)toDegrees(atan2(y, x));

    if(x<y) {
        if (90 - angle >= startAngle && 90 - angle <= endAngle) {
            result.withPixel((int) (centerX - y), (int) (centerY - x), value);
        }
        if (angle >= startAngle && angle <= endAngle) {
            result.withPixel((int) (centerX - x), (int) (centerY - y), value);
        }
        if (180 - angle >= startAngle && 180 - angle <= endAngle) {
            result.withPixel((int) (centerX + x), (int) (centerY - y), value);
        }
        if (angle + 90 >= startAngle && angle + 90 <= endAngle) {
            result.withPixel((int) (centerX + y), (int) (centerY - x), value);
        }
        if (270 - angle >= startAngle && 270 - angle <= endAngle) {
            result.withPixel((int) (centerX + y), (int) (centerY + x), value);
        }
        if (angle + 180 >= startAngle && angle + 180 <= endAngle) {
            result.withPixel((int) (centerX + x), (int) (centerY + y), value);
        }
        if (360 - angle >= startAngle && 360 - angle <= endAngle) {
            result.withPixel((int) (centerX - x), (int) (centerY + y), value);
        }
        if (angle + 270 >= startAngle && angle + 270 <= endAngle) {
            result.withPixel((int) (centerX - y), (int) (centerY + x), value);
        }
    }
    return result;
}

Angles工作正常,但问题是,我不知道如何光栅化圆上的每个点(此代码光栅化只有8个点)

通话功能:

    rasterImage = linerCircle.rasterizeCircleSector(rasterImage,200,200,
            15, 30,
            1, 200,
            0xf0f0f0);

结果是:

enter image description here

任何人都可以帮助我吗?或者这种方法完全错了?

谢谢。

1 个答案:

答案 0 :(得分:0)

中点(和Bresenham)算法通常填充圆的一个八分圆(有时是一个象限),镜像点以填充其他八分圆。

首先,您需要确定 - 八分圆的开始和结束角度是什么,以及完全填充的八分圆(如果存在)。

然后获得开始和结束角度的x / y限制。

然后应用中点算法,省略位于计算的x / y限制之外的点并填充圆的所需部分。