速度ベクトルで曲線を描画するスクリプト
三次関数の表現
三次関数を表現する方法として、パッと思い浮かぶのはベジェ曲線ですが、今回のスクリプトは速度ベクトルから三次関数を求めるスクリプトです。式はこちらにあります。 実用性はともかくとして、点毎に速度ベクトルを決めれるのはなんだか楽しいですね。
プログラム
code:spline.lua
--[[
spline.anm
]]
--track0:total,1,1000,10,0.01
--track1:len,-1000,1000,1,0.01
--check0:help,1
--dialog:set_anchor,pos={-200,200,0,-200,-200,0,200,-200,0,400,-200,0};
--------------------------------------------------
--P1,P2,V1,V2から三次関数の係数を求める関数
--------------------------------------------------
local function pV_M(P1,P2,V1,V2)
local sol={}
sol.a=2*(P1-P2)+V1+V2
sol.b=3*(P2-P1)-2*V1-V2
sol.c=V1
sol.d=P1
return sol
end
--------------------------------------------------
--------------------------------------------------
--------------------------------------------------
--三次式を求める関数
--------------------------------------------------
local function cM(a,b,c,d,t)
return ((a*t+b)*t+c)*t+d
end
--------------------------------------------------
--------------------------------------------------
--------------------------------------------------
--一次関数??
--------------------------------------------------
local function fade_M(a,b,t)
return a+(b-a)*t
end
--------------------------------------------------
--------------------------------------------------
--------------------------------------------------
--main
--------------------------------------------------
obj.setanchor("pos",4,"xyz")
local len=obj.track1
local sx=pV_M(pos1,pos7,(pos4-pos1)*len,(pos10-pos7)*len) local sy=pV_M(pos2,pos8,(pos5-pos2)*len,(pos11-pos8)*len) local sz=pV_M(pos3,pos9,(pos6-pos3)*len,(pos12-pos9)*len) local to=obj.track0
for i=0,to do
local t=i/to
obj.draw(cM(sx.a,sx.b,sx.c,sx.d,t),
cM(sy.a,sy.b,sy.c,sy.d,t),
cM(sz.a,sz.b,sz.c,sz.d,t))
end
if(obj.check0==true)then
obj.load("figure","六角形",0xff,5)
for i=0,30 do
local t=i/30
obj.draw(fade_M(pos1,pos4,t), obj.draw(fade_M(pos7,pos10,t), end
end
--------------------------------------------------
--------------------------------------------------
by metaphysical bard