複数の角度でスプライン補間するスクリプト
サイズの小さい図形等にでも。
code:liner_M.lua
--[[
liner_M.anm
複数の角度でスプライン補間をします。
]]
--track0:line,2,50,3,1
--track1:point,2,500,10,1
--track2:rot,-360,360,0,0.01
--track3:angle,0,180,30,0.01
--dialog:anchor(3~16),local n=3;set_anchor,pos={-obj.w/2,obj.h/2,0,0,obj.w/2,-obj.h/2};hue,local h=0;
--tdma
local function mtdma(a,b,c,d)
local n=#a
for i=2,n do
end
local i=n-1
while i>=1 do
i=i-1
end
return d
end
--spline
local function mspline(x,y)
local max_p=#y
local a,b,c,d,h,w={},{},{},y,{},{}
for i=1,max_p-1 do
end
for i=2,max_p-1 do
end
b=mtdma(a,w,c,b)
for i=1,max_p-1 do
end
return {a,b,c,d}
end
--sort
local function msort(x,y)
for i=1,#x-1 do
for j=i+1,#x do
end
end
return x,y
end
--cubic
local function mcubic(d,c)
return ((c1*d+c2)*d+c3)*d+c4 end
--curve
local function mcurve(d,x,y,c)
else
local ix=1
while true do
else ix=ix+1 end
end
end
return d
end
--rot
local function mrot(x,y,th)
return x*math.cos(th)-y*math.sin(th),x*math.sin(th)+y*math.cos(th)
end
--main
local line,point,rot,angle=obj.track0,obj.track1,obj.track2,obj.track3
obj.setanchor("pos",math.min(math.max(n,3),16))
obj.setoption("drawtarget","tempbuffer",obj.w,obj.h)
obj.draw()
for l=0,line-1 do
local th=(rot+l*angle/(line-1))*math.pi/180
local px,py={},{}
for i=1,#pos/2 do
end
px,py=msort(px,py)
local c=mspline(px,py)
obj.setoption("drawtarget","framebuffer")
obj.load("tempbuffer")
obj.effect("色調補正","色相",l*h/(line-1))
for i=0,point-1 do
local x=px1+(px#px-px1)*i/(point-1) local y=mcurve(x,px,py,c)
x,y=mrot(x,y,-th)
obj.draw(x,y)
end
end
pos=nil
by metaphysical bard