【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
搞个贝塞尔曲线竟然用到了字典!
如果不是手机打字的话,你大概还是会正经使用数组的吧。 ...
写着玩用啥都一样,vbs用字典当动态数组可以减少全局变量正常写我会用全局数组,把组合数c 0.n提前求出来,减少函数调用 谢谢分享
页:
[1]