我试图在给定一系列形成路径的(蓝色)点的情况下,找到相对于给定轴(绿线)的拐点。从下图可以看到有两个拐点(粉红色线),或者是路径相对于任务轴改变方向的地方。
棘手的部分是轴的方向可能会改变,因此它必须沿任何方向工作。我的第一次尝试是沿着路径获取两个连续的点,获取它们之间的方向,然后将其与轴的方向进行比较。
跳过一些无聊的步骤(例如记录先前的点),伪代码如下所示:
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
不幸的是,这不起作用。关于我要去哪里的任何指示?
答案 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
注意:如果曲线是连续的且具有解析性,则可能存在闭式公式