如何计算二次贝塞尔曲线与水平线的交点?

3

我想要做的是获取一条贝塞尔曲线与水平线(y坐标)相交的X坐标。目前,我有以下代码:

function self.getX(y)
    if y > maxY or y < minY then
        return
    end
    local a = y1 - y
    if a == 0 then
        return
    end
    local b = 2*(y2 - y1)
    local c = (y3 - 2*y2 + y1)

    local discriminant = (b^2 - 4*a*c )

    if discriminant < 0 then
        return
    else
        local aByTwo = 2*a
        if discriminant == 0 then
            local index1 = -b/aByTwo
            if 0 < index1 and index1 < 1 then
                return (1-index1)^2*x1+2*(1-index1)*index1*x2+index1^2*x3
            end
        else
            local theSQRT = math.sqrt(discriminant)
            local index1, index2 = (-b -theSQRT)/aByTwo, (-b +theSQRT)/aByTwo
            if 0 < index1 and index1 < 1 then
                if 0 < index2 and index2 < 1 then
                    return (1-index1)^2*x1+2*(1-index1)*index1*x2+index1^2*x3, (1-index2)^2*x1+2*(1-index2)*index2*x2+index2^2*x3
                else
                    return (1-index1)^2*x1+2*(1-index1)*index1*x2+index1^2*x3
                end
            elseif 0 < index2 and index2 < 1 then
                return (1-index2)^2*x1+2*(1-index2)*index2*x2+index2^2*x3
            end
        end
    end     
end

一些规格:

  • 这是Lua代码。
  • local表示变量仅在代码块中本地使用,因此不影响代码的功能。
  • y1、y2和y3是三个点的y坐标。x1、x2和x3也是如此。
  • y是我正在计算的水平线的y坐标。
  • maxY是三个y值中最大的。
  • minY是最小的。

目前这段代码给我这个结果:

enter image description here

  • 有8条贝塞尔曲线
  • 绿色的曲线是使用常规方法生成的:(1-t)^2*x1+2*(1-t)*t*x2+t^2*x3
  • 红点是控制点。
  • 白线是使用上述代码描述的方法生成的。
  • 直线是线条,请忽略它们。
  • 应该有8条曲线,但只呈现了4条。

提前感谢,

创建者!


4
贝塞尔曲线的方程式为y(t)=(1-t)^2*y1+2(1-t)*t*y2+t^2*y3,展开后可得(y1-2 *y2+y3)*t^2+2(y2-y1)*t+y1。所以你似乎交换了ac - lhf
我从0迭代到600,这是函数的输入。 - Creator
好的,因为这里已经是凌晨两点了,我明天会完成它。晚安。 - Creator
3
关于“为什么没有人回复”的问题,请记住,Stack Overflow不是您个人的支持热线。您发布了一段相当复杂的代码,需要花费某人一些时间来阅读。人们在这里花费的任何时间都是他们本可以赚钱或做其他喜欢的事情的时间。更尊重他人的做法是耐心等待。 - Nate Eldredge
1
@lhf有解决方案:您在二次方程中混淆了二次项和常数项。交换ac的值,您应该会得到良好的结果。 - M Oehm
显示剩余7条评论
1个回答

2
贝塞尔曲线具有以下特点:
y(t)=(1-t)^2*y1+2(1-t)*t*y2+t^2*y

它的扩展为

(y1-2*y2+y3)*t^2+2(y2-y1)*t+y1

您已经在解决 y(t)=y 所需的二次方程式 a*t^2+b*t+c=0 中交换了ac

非常感谢。附言:我有一些愚蠢的错误浪费了你们几天的时间! - Creator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接