好的,所以两个红点是图像上的点。它们之间的距离并不重要。
我想要做的是,使用两个点的坐标,计算它们之间的空间角度(如红点之间的黑线所示)
然后,一旦找到角度,在最后一个红点上,创建两个与第一条线的角度交叉的点。然后,扫描半个半圆,得到橙色线所经过的图像每个像素的坐标。
我不知道这对你有多大意义所以我画了另一张照片: alt text http://i48.tinypic.com/2mwsfly.png
正如您在第二张图片中看到的那样,我的想法适用于在黑色canavs上绘制的线条。两个红点是起始坐标,然后在两个点的末尾,创建不到半个半圆。橙色部分显示应记录的图像像素。
我不知道如何开始这个,所以如果有人对我如何能够或我需要做什么有任何想法,我们非常感谢任何帮助:)
EDIT。 我已经创建了这个图像,希望它能使我想要做的更清楚:) alt text http://i50.tinypic.com/1zdyhkw.png
再次抱歉,如果这让任何人感到困惑,因为我真的不知道如何解释它。
答案 0 :(得分:0)
我相信不需要蓝点。我认为你建议的是简单地扫描一个圆中的一个点(红点),找到该圆的交点,并确定该交点的角度与第二个点(另一个红点)的角度。 / p>
我认为你知道如何计算两个红点之间的角度,这非常简单。
有许多方法可以计算与圆的交点,蛮力方法是应用迭代公式,如:
x = r * sin(t)
y = r * cos(t)
以您的第一个红点为中心,其中r是您的扫描半径。
将公式应用于像素网格,您应该能够确定哪些像素是两个方程的解。
至少应该有两个与你的圆相交的点,我相信消除不必要的点应该相当简单(取决于你所追踪的线的属性)。
现在您可以计算该交点和中心红点的角度。使用该角度和先前计算的红点之间的角度来获得我认为你想要的东西。
编辑:从实现的角度来看,如果你的位图足够稀疏,那么在算法上将所有像素坐标放在一个数组中会更加有效,并以连续的方式排序。这样可以更容易地从当前像素中搜索特定半径的相应像素。
答案 1 :(得分:0)
好的,所以打开角度是恒定的,横向线只用于构造。好。
您想使用Bresenham circle选择要扫描的点。
首先计算终点。为此你做了一个像这样的小矢量数学
X_+ = x + R*cos(theta + 70) // angles expressed in degrees for ease here,
Y_+ = y + R*sin(theta + 70) // your language probably expects radians
X_- = x + R*cos(theta - 70)
Y_- = y + R*sin(theta - 70)
请注意,theta应该运行整个圆圈(0--360度或0-2 \ pi弧度)。
然后,您使用圆形算法来选择像素(如果您正在绘制,则会被着色,但在这种情况下会被复制),这些像素按顺序放入数组中。而Bjorn Strongingthearm是你的叔叔。
答案 2 :(得分:0)
只是为了澄清:
让我们将A点的坐标定义为(Ax,Ay)。 让我们来定义A&的距离。 B为r(圆圈/弧的半径)
因此,对于圆使用基本公式,当
时,圆(x,y)将位于圆上(x-Ax)^2 + (y-Ay)^2 = r^2
现在您只需要将此设置限制在所需的四分之一圈内。我建议最简单的方法是在弧的中点附近包含一些点。
要做到这一点,首先要计算弧的中点。设点B由(Bx,By)定义,然后将点C定义为弧的中点(Cx,Cy)
Cx = Ax + (Ax-Bx)
Cy = Ay + (Ay-By)
现在,对于弧上的任何点,从该点(x,y)到弧的中点绘制一个和弦(圆上两点之间的直线)。
该线的长度可以通过圆的半径和两个半径之间的角度来计算。弦长的公式是2r.sin(a / 2),其中r是半径,a是半径之间的角度。我们想要中点的任一侧45度,因此最大弦长
2r.sin(45/2)
因此,在我们的点(Cx,Cy)的2r.sin(45/2)内的点将足够接近以绘制四分之一圆。你的结果是
Any coordinate (x, y) such that
(x-Ax)^2 + (y-Ay)^2 = r^2
(x-Cx)^2 + (y-Cy)^2 <= (2r.sin(45/2))^2
好玩!