获取弧/扇区的每个像素

时间:2015-10-29 19:16:19

标签: geometry

在我的模拟器中,我试图检查弧的每个像素。中心(x& y),半径和弧的角度(半径,currentAngle和newAngle)有固定的协调,所以我能够用颜色填充它以向用户表示它。但此外我需要对覆盖的像素执行一些操作。 我试过的是:

for (int i = 0; i < newAngle; i++)
  for (int j = 0; j < radius; j++) {
    Point point = new Point((int)(x + j * Math.cos(currentAngle - Math.toRadians(i))), (int)( y + j * Math.sin(currentAngle - Math.toRadians(i))));

check(point.x, point.y);

我认为改变角度和半径是很好的,但是,正如我后面所理解的那样,由于弧的边界上的每个度数都包含超过1个像素,所以很多像素都会被遗漏。

我尝试在网上搜索并找到了一些方法来浏览圈子的每个像素。没有设法将其转换为圆弧像素。

2 个答案:

答案 0 :(得分:1)

您可以从极坐标切换到笛卡尔并迭代属于段的点:

double curCos = Math.cos(currentAngle);
double curSin = Math.sin(currentAngle);
double curTan = curSin/curCos;
double newCos = Math.cos(newAngle);
double newSin = Math.sin(newAngle);
double newTan = newSin/newCos;
double xMax = curCos*radius
double r2 = radius*radius

for(int i=0; i < xMax; i++) {
    for(int j=curTan*x; j < newTan*x; j++) {
        if(i*i + j*j > r2) {
            continue;
        }
        Point point = new Point(x + i, y + j);
    } 
}

此代码段仅涵盖newAngle&gt; currentAngle和整个片段位于第一象限(x> 0和y> 0的区域)的情况,但您可以了解如何迭代点以及如何将解决方案概括为任何角度组合。

答案 1 :(得分:1)

你需要光栅化弧 - 按顺序获取所有彩色像素。着名的Bresenham algorithm for circle旨在实现这一目标。只需调整它以仅绘制圆圈所需的部分 还有另一种选择 - Midpoint circle algo