圆周上每个点的坐标

11 浏览
0 Comments

圆周上每个点的坐标

首先,请注意,这个问题不是这些问题的重复:1st2nd ,和 3rd。\n我使用Delphi和OpenCV,但我正在寻找一种算法,一种不受语言限制的解决方案。\n为了进行精确的图像分析,我需要检查圆形区域中像素强度的变化。因此,我在一个不断增长的圆的周长上读取像素值。当然,为了能够做到这一点,我需要知道像素的坐标。\n我找到的最佳解决方案是 y:= Round(centerY + radius * sin(angle)), x:= Round(centerX + radius * cos(angle)),但由于仅使用360度计算几乎是不够的,当圆的半径大于约60像素时,角度的计算方式是这样的:angle:= angle + (360 / (2 * 3.14 * currentRadius)) -> 我从0到360的每个值进行遍历,同时值每次增加360/圆的周长的像素。但这种方法并不是很精确。圆越大,角度的分数需要越小,而精度受到Pi的不准确性和四舍五入的影响。\n如果我使用上述方法,并尝试用以下代码绘制计算出的像素:\n

  centerX:= 1700;
  centerY:= 1200;
  maxRadius:= 500;
  for currentRadius:= 80 to maxRadius do
  begin
    angle:= 0;
    while angle < 360 do
    begin
      xI:= Round(centerX + currentRadius * cos(angle));
      yI:= Round(centerY + currentRadius * sin(angle));
      angle:= angle + (360 / (2 * 3.14 * currentRadius));
      //这是OpenCV的函数,为了测试代码,您可以使用任何绘制点的函数...
      cvLine(image,cvPoint(xI,yI),cvPoint(xI,yI),CV_RGB(0, 255, 0));
    end;
  end;

\n结果如下:\n\"circles\"\n这并不差,但考虑到在圆形区域中大约有三分之一的像素是黑色的,您会意识到有很多像素被“跳过”了。另外,仔细看最后一个圆的边缘,可以清楚地看到一些点离实际的周长有些偏差-这是不准确性的另一个结果...\n我可能可以使用公式 (x - xorig)^2 + (y - yorig)^2 = r^2 来检查围绕中心的稍大于圆直径的矩形区域内的每个可能的像素是否落在圆的周长上。但是,随着圆的增长,重复这个过程会非常慢。\n有没有更好的解决方法?有人能帮我改进吗?我对我的解决方案没有任何坚持,将接受任何其他解决方案,只要它能给出所需的结果=> 让我读取给定中心和半径的圆周上的所有(或绝大多数-95%以上)像素的值。越快越好...

0
0 Comments

首先,你想要获取圆周上的所有点。如果你使用任何(好的)算法,或者一些内置的圆形函数,你确实可以得到所有的点,因为圆周是连通的。但是,你的图片显示,邻近圆之间存在空洞,例如r=100和r=101。这是在绘制圆周的函数中经常出现的情况。

现在,如果你希望你的像素集合中的像素覆盖所有具有递增半径的像素,你可以简单地使用以下方法:

1. 构建一个填充了圆形像素的集合,例如r=101。

2. 构建一个填充了圆形像素的集合,例如r=100。

3. 从集合2中排除集合1。

填充圆形的算法通常比连接的圆周更高效、更简单,因此你不会损失太多性能。

这样你就会得到一个略微粗一点的圆周,但是这个集合将确保在半径增加的情况下覆盖整个表面,没有任何空洞。但是也有可能在这种方式构建的集合中存在与之前的集合(r-1)重叠的像素,所以最好进行测试。

另外,你的代码中并不清楚为什么会出现任何三角函数。我不知道有任何有效的圆形算法会使用除了平方根以外的任何函数。

PS:此外,你的代码中并不清楚为什么会出现任何三角函数。我不知道有任何有效的圆形算法会使用除了平方根以外的任何函数。

0
0 Comments

问题的出现原因是为了提高代码的运行速度,不希望在内部循环中频繁调用三角函数。为了解决这个问题,可以使用递推公式来更新角度的正弦和余弦值,从而避免在每次循环中调用三角函数。

具体的解决方法如下:

1. 在循环开始前,设置初始的正弦值(sinangle)为0,余弦值(cosangle)为1。

2. 计算每次步长(step),步长的倒数(1 / currentRadius)用于计算正弦和余弦的递推公式。

3. 在循环中,使用递推公式更新正弦和余弦的值,同时计算每个点的坐标。

4. 最后,在每次循环结束后,可以根据需要进行其他操作。

通过这种方法,我们可以在不频繁调用三角函数的情况下,计算出圆周上每个点的坐标,从而提高代码的运行效率。

以下是具体的代码实现:

...

for currentRadius:= 80 to maxRadius do

begin

sinangle:= 0;

cosangle:= 1;

step:= 1 / currentRadius;

sinstep:= sin(step);

cosstep:= cos(step);

while {? } do

begin

xI:= Round(centerX + currentRadius * cosangle);

yI:= Round(centerY + currentRadius * sinangle);

newsin:= sinangle*cosstep + sinstep*cosangle;

newcos:= cosangle*cosstep - sinstep*sinangle;

sinangle:= newsin;

cosangle:= newcos;

...

end;

end;

通过使用这种优化方式,我们可以在计算圆周上每个点的坐标时,避免频繁调用三角函数,从而提高代码的运行速度。

0
0 Comments

在计算机图形学中,经常需要确定圆的周长上每个点的坐标。这个问题的出现是因为需要在绘制圆形图形时,能够准确地确定每个点的位置。

为了解决这个问题,可以采取以下步骤:

1) 创建一个最小半径周长的像素列表。只需要保留圆的第一象限(坐标系的第一象限中的0..Pi/4范围)的点,并通过镜像得到对称点。可以使用Bresenham圆算法或者圆方程来实现。

2) 对于下一次迭代,遍历列表中的所有坐标(如果有两个具有相同Y值的点,则选择右侧的点),并检查右侧邻居(或者两个邻居!)是否在下一个半径内。对于最后一个点,还要检查顶部和右上角邻居(在Pi/4对角线上)。将好的邻居(一个或两个)插入到下一个坐标列表中。

通过这种方法,可以使用最大半径圆上的所有像素点,而且列表生成的检查过程相当快速。

编辑:

代码实现了另一种方法,它使用较低行像素限制来构建上行。它在给定的范围内生成圆形,并将其绘制为令人迷幻的颜色。所有的计算都是整数运算,没有浮点数,也没有三角函数!像素仅用于演示目的。

以上是解决确定圆的周长上每个点的坐标的方法。通过构建像素列表并检查邻居,可以准确地确定圆的周长上每个点的坐标。

0