【问题标题】:Image Line Trace Math Help Hard To Explain图像线迹数学帮助难以解释
【发布时间】:2010-03-08 00:51:22
【问题描述】:

抱歉标题令人困惑,我真的很难解释我想要什么。所以我创建了这个图像:)

好的,所以两个红点是图像上的点。它们之间的距离并不重要。

我要做的是,使用两个点的坐标,计算出它们之间的空间角度(如红点之间的黑线所示)

找到角度后,在最后一个红点上创建两个与第一条线的角度相交的点。然后从中扫描一个半圆,得到橙色线经过的图像每个像素的坐标。

我不知道这对你们是否有意义,所以我画了另一张照片:

正如您在第二张图片中看到的那样,我的想法适用于在黑色画布上绘制的线条。两个红点是起始坐标,然后在两个点的末端,创建一个小于一半的半圆。橙色部分表示应记录的图像像素。

我不知道如何开始,所以如果有人对我可以如何或需要做什么有任何想法,非常感谢任何帮助:)

编辑。 我创建了这张图片,希望它能让我想做的事情更清晰:)

再次抱歉,如果这让任何人感到困惑,因为我真的不知道如何解释。

【问题讨论】:

  • 呃... “使用两个点的坐标,计算出它们之间空间的角度” 不清楚。从第三点看它们之间的角度?此外,您在每个图中都展示了一些蓝点,但没有提及它们。它们是测量“[红点]之间的角度”的点吗?它们有任何意义吗?请尝试更清楚地重述问题。我怀疑你脑子里有一些我们不知道的背景。
  • 我正在尽力解释,整个事情有点超出我的理解,但我想出了另一张图片,希望能提供一些背景信息 =)
  • 我认为'两点之间的角度'只是线的渐变。
  • ^ 我想可能是卷曲?

标签: math image-processing vector


【解决方案1】:

澄清一下:

  • 你有两个点 A 和 B,你需要画一个圆弧
  • 弧线应该是四分之一圆(又名“半个半圆”)
  • 第一个点 A 是圆弧的中心/旋转点
  • 由 A 和 B 定义的线应与圆弧的中点相交

让我们定义点 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

很好玩!

【讨论】:

    【解决方案2】:

    嗯...我想我明白你要做什么,但如果我错了,请发表评论。

    我相信蓝点并不是真正需要的。我认为您的建议是简单地围绕一个圆中的一个点(红点)扫描,找到该圆的交点并确定该交点的角度与第二个点(另一个红点)的角度。

    我想你知道如何计算两个红点之间的角度,这很简单。

    有很多方法可以计算与圆的交点,蛮力方法是应用一个迭代公式,如:

    x = r * sin(t)
    y = r * cos(t)
    

    以您的第一个红点为中心,其中 r 是您的扫描半径。

    将公式应用于像素网格,您应该能够确定哪些像素是两个方程的解。

    应该至少有 2 个点与您的圆相交,我相信消除不必要的点应该相当简单(取决于您正在追踪的线的属性)。

    现在您可以计算该交点与中心红点的角度。使用该角度和之前计算的红点之间的角度来得到我认为你想要的。

    编辑:从实现的角度来看,如果您的位图足够稀疏,那么在算法上将所有像素坐标放在一个数组中会更有效,并以某种连续的方式排序。这样可以更轻松地在当前像素的某个半径范围内搜索相应像素。

    【讨论】:

      【解决方案3】:

      好的,所以打开角度是恒定的,横向线只是用于构建。很好。


      您想使用Bresenham circle 选择要扫描的点。

      首先计算端点。为此,您可以像这样进行一些矢量数学运算

      • 令 (x, y) 为第二个红点的坐标,R 为您要扫描的半径(您尚未指定此值,但我假设您知道它是什么),theta 为线段与水平面的夹角。 (如果您在计算 theta 时需要帮助,请直接说)
      • 对于 [+,-] 中的 i,端点是 (X_i, Y_i)。在哪里

       

      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 是你的叔叔。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        • 2022-11-11
        • 2022-06-16
        • 2021-07-12
        相关资源
        最近更新 更多