在我的 iOS 应用程序中,我使用一种算法通过一组 2D 点绘制一条贝塞尔曲线,该算法为连接两个连续点的每个贝塞尔曲线计算一组第一和第二控制点。该算法工作出色,但我的问题是现在我在带有 X 和 Y 轴的图形上显示这条曲线。每当有几个点或在轴上,其余的在里面时,曲线似乎掉头并超出轴,然后通过两个点和里面的点返回。从算法的角度来看,这没有错。在这种情况下,控制点将在坐标轴之外生成。有没有办法可以通过这些点并查看它们中的一些是否在轴上并修改控制点,以便曲线而不是走出曲线,而是通过轴上的两个点作为一条直线与坐标轴。 最佳答案 检测离开屏幕的曲线贝塞尔曲线实际上只是多项式方程。有 multiple types of Bezier curves ,对应曲线的不同程度。因此,只需采用生成的方程(一个用于 x ,一个用于 y ),并找到根(它们通过 0 的点)。如果根存在,则曲线通过轴。例如,对于二次 (degree=2) Bezier 曲线,给定我们的三个点 (x0, y0), (x1, y1), (x2, y2) equations 是x(t) = (x0 - 2x1 + x2)t2 - 2(x0 + x1)t + x0y(t) = (y0 - 2y1 + y2)t2 - 2(y0 + y1)t + y00 在这一点上,我们可以使用 quadratic formula 来解决 t ,并检查解决方案是否不存在或在 [0,1] 的 t 域之外。然而,还有另一种方法可以推广三次贝塞尔曲线,而不必接触复杂的 cubic formula - 只需检查极值点。这些是导数 = 0 的点。因为导数是x'(t) = 2(x0 - 2x1 + x2)t - 2(x0 + x1)y'(t) = 2(y0 - 2y1 + y2)t - 2(y0 + y1)这意味着极值在textrema-x = (x0 + x1)/(x0 - 2x1 + x2)textrema-y = (y0 + y1)/(y0 - 2y1 + y2)因此,只需检查 x(textrema-x) > 0 和 y(textrema-y) > 0(我们假设端点 x0 和 x2 已知在屏幕上,也就是 > 0)。对于三次贝塞尔曲线,做同样的事情,但使用二次公式来求解极值(在这种情况下,x 和 y 各有两个极值)。防止曲线离开屏幕如果我们通过将上面的 textrema-x 方程代入 x(t) 来求解 x(textrema-x) > 0,我们会在一些代数之后发现,为了防止穿过 x 轴,我们需要-4x0x1 + x0x2 - x12 > 0 如果 (x0 + x2) > 2x1-4x0x1 + x0x2 - x12 (如果 (x0 + x2) = 2x1,我们从 x0 线性移动到 x2 所以,假设两者都是正的,我们 不能 穿过 x 轴)仔细观察这些方程应该会让你相信,如果 (x0 + x2) > 2x1,我们可以简单地减小 x1,直到满足左边的条件;如果 (x0 + x2) y 的等式是类似的。这告诉我们如何防止曲线偏离屏幕的左侧 ( x=0 ) 和顶部 ( y=0 ) 部分 - 右侧 ( x=screen_width ) 和底部 ( y=screen_height ) 怎么样?我们可以通过想象我们将屏幕翻转到它的镜像来轻松做到这一点,因此右侧是 x=0 ,左侧是 x=screen_width 。这可以通过在上述所有方程中用 x 替换 (screen_width-x) 的每个实例并检查我们的条件来完成。然后,例如,当之前在第一种情况下我们将减小 x1 时,在这种情况下我们希望减小 (screen_width-x1),这与增加 x1 相同。用 y 替换 (screen_height-y) 的逻辑相同。关于algorithm - 如何阻止贝塞尔样条超出坐标轴?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9992732/ 10-12 17:24