天马座 发表于 2021-6-14 00:57:04

【VB6】N阶贝塞尔曲线

本帖最后由 天马座 于 2021-6-14 03:29 编辑

vbs写的 vb直接调用就行,手机打字费劲,参数自行修改全部ByVal,不该也不影响

Function Bezier1(p0x,p0y,p1x,p1y,k)
    '1阶贝塞尔曲线
    Bezier1 = BezierN(Array(p0x,p0y,p1x,p1y),k)
End Function
Function Bezier2(p0x,p0y,p1x,p1y,p2x,p2y,k)
    '2阶贝塞尔曲线
    Bezier2 = BezierN(Array(p0x,p0y,p1x,p1y,p2x,p2y),k)
End Function
Function Bezier3(p0x,p0y,p1x,p1y,p2x,p2y,p3x,p3y,k)
    '3阶贝塞尔曲线
    Bezier3 = BezierN(Array(p0x,p0y,p1x,p1y,p2x,p2y,p3x,p3y),k)
End Function
Function BezierN(p,k)
    'n阶贝塞尔曲线
    '参数p 起点 控制点 终点的集合,用数组表示
    '参数k 从起点到终点的曲线经过多少个点来链接
    '返回值 曲线点集合数组数组的元素也是数组 (0)为x(1)为y
    'k>=1
    Dim i,d,t,tstep
    Set d = CreateObject("Scripting.Dictionary")
    tstep = 1 / (k + 1)
    t = 0
    For i = 0 To k
      d.add d.count,b(p,t)
      t = t + tstep
    Next
    d.add d.count,b(p,1)
    BezierN = d.Items
End Function
Function b(p,t)
    Dim i,n,x,y,c
    n = (UBound(p) + 1) \ 2 - 1
    For i = 0 To n
      c = fac(n) / (fac(i) * fac(n - i))
      'b = b + c * (1 - t) ^ (n - i) * t ^ i * p(i)
      x = x + c * (1 - t) ^ (n - i) * t ^ i * p(2 * i)
      y = y + c * (1 - t) ^ (n - i) * t ^ i * p(2 * i + 1)
    Next
    b = Array(Fix(x),Fix(y))
End Function
Function fac(n)
    Dim f,i
    f = 1
    For i = 2 To n
      f = f * i
    Next
    fac = f
End Function

0xAA55 发表于 2021-6-14 16:58:32

搞个贝塞尔曲线竟然用到了字典!

如果不是手机打字的话,你大概还是会正经使用数组的吧。

天马座 发表于 2021-6-14 20:39:59

0xAA55 发表于 2021-6-14 16:58
搞个贝塞尔曲线竟然用到了字典!

如果不是手机打字的话,你大概还是会正经使用数组的吧。 ...

写着玩用啥都一样,vbs用字典当动态数组可以减少全局变量正常写我会用全局数组,把组合数c 0.n提前求出来,减少函数调用

clhenyan 发表于 2021-6-21 07:28:14

谢谢分享
页: [1]
查看完整版本: 【VB6】N阶贝塞尔曲线