获取给定支点和准线的抛物线的第三个控制点二次贝塞尔曲线,Lua

问题描述 投票:0回答:1

我正在尝试制作相当于给定抛物线的二次贝塞尔曲线,该抛物线被定义为焦点(fx,fy)和准线dirY。

曲线受点 A (ax, ay) 和 B (bx, by) 限制。

我需要找到第三个控制点C(cx,cy),如下所示: https://en.m.wikipedia.org/wiki/File:Quadratic_Bezier_parabola_equivalence.svg 或者 https://en.wikipedia.org/wiki/File:Relationship_ Between_parabola_and_quadratic_Bezier.svg

function getBezierControlPoint_focus_directrix(fx, fy, ax, ay, bx, by)
    -- (x-h)^2=4*p*(y-k)
    if (ay == by) then
        -- exception: horizontal AB
        local k = (fy + dirY) / 2
        local h = fx
        local cx = h
        local cy = ay + 2*(k-ay)
        return cx, cy -- it works perfect
    else
--  [Axis direction](https://en.wikipedia.org/wiki/Parabola#Axis_direction)
        local h = fx
        local k = (fy + dirY) / 2
        local cx = (ax+bx)/2
        local f = (k-dirY)/2
        
        -- vertex
        -- h = -b/(2*a)
        -- k = (4*a*c-b*b)/(4*a)
        
        local a = -1/(dirY-ay)
        local b = -2 * a * h
        local c = h * h * a + k
        print ('h', h, -b/(2*a)) -- ok, same
        print ('k', k, (4*a*c-b*b)/(4*a)) -- ok, same
        
        -- derivative value of parabola in point A (ax):
        local day = a*2*ax + b
        local cy = ay + day * (bx-ax)/2
        
        return cx, cy -- not right, here is problem
    end
end

用法:三个控制点绘制抛物线:

controlPoints = {ax, ay, cx, cy, bx, by}
math lua geometry trigonometry
1个回答
0
投票

如果您使用焦点 x=a,y=b 和准线 y=c,那么我们已经轴对齐,这样就可以节省大量工作。

我们有两个距离值,都与抛物线的“尖端”x,y有关:

  1. dist((x,y), (a,b))
    =
    sqrt((x-a)² + (y-b)²)
    ,并且
  2. dist((x,y), (x,c))
    =
    abs(y - c)

因此,求解等式

sqrt((x-a)² + (y-b)²) = abs(y - c)
(通过使用 Wolfram alpha 之类的方法手动 pr),我们得到:

        x² - 2ax + a² + b² -c²
f(x) = -----------------------
               2(b-c)

现在无论 a、b 或 c 是什么,我们都有多项式函数。然后,我们想要找到端点 A=(xa,f(xa)) 和 B=(xb,f(xb)) 的线段的等效贝塞尔表达式,这意味着我们已经“完成”了:贝塞尔曲线{A,C,B},控制点C是A处的切线和B处的切线的交点。我们知道这些线是什么,因为我们知道f(x)的导数(同样,要么是因为我们手工计算出来的,要么是我们只是告诉计算机为我们做的):

        x-a
f'(x) = ---
        b-c

因此找到控制点就是计算标准线/线交点的问题,因为你知道 A 和 A 处的切线,并且你知道 B 和 B 处的切线。Stackoverflow 上的很多帖子和网络上的页面都提到了解释如何计算线/线交点,所以我将把这部分作为一个相当快速解决的练习。

© www.soinside.com 2019 - 2024. All rights reserved.