沿任意轴查找拐点

时间:2018-06-25 23:22:03

标签: geometry line

我试图在给定一系列形成路径的(蓝色)点的情况下,找到相对于给定轴(绿线)的拐点。从下图可以看到有两个拐点(粉红色线),或者是路径相对于任务轴改变方向的地方。

enter image description here

棘手的部分是轴的方向可能会改变,因此它必须沿任何方向工作。我的第一次尝试是沿着路径获取两个连续的点,获取它们之间的方向,然后将其与轴的方向进行比较。

跳过一些无聊的步骤(例如记录先前的点),伪代码如下所示:

foreach point cur_point in path:
    direction = prev_point - cur_point
    (normalize direction)
    relative_direction = dir_towards_axis - direction
    (normalize relative direction)
    if the sign of either x or y has changed between relative_direction and prev_relative_direction
        # we have found an inflection point

不幸的是,这不起作用。关于我要去哪里的任何指示?

2 个答案:

答案 0 :(得分:1)

看看https://pomax.github.io/bezierinfo/#aligning-这个想法是通过将每个点移动{-p1.x, -p1.y},然后旋转所有定义曲线的坐标(只要您的曲线对仿射变换是不变的!),以便最后一个坐标位于轴上(使用atan2函数为其寻找旋转角度,几乎所有编程语言都将其定位)与)。

轴对齐后,您就可以执行所需的“关于轴”的任何分析。

答案 1 :(得分:1)

要找到所需的点,可以检测cross product在轴和当前曲线方向之间的符号变化(方向/手性测试)。

 axis_direction = axis_end - axis_start = B - A
 ....
 direction = cur_point - prev_point
 cross =  cross_product(direction, axis_direction) = 
          direction.x * axis_direction.y - direction.y * axis_direction.x

注意:如果曲线是连续的且具有解析性,则可能存在闭式公式