複数の角度でスプライン補間するスクリプト
この記事はアドカレに参加しています。
サイズの小さい図形等にでも。
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
local w=ai/bi-1
bi=bi-ci-1*w
di=di-di-1*w
end
dn=dn/bn
local i=n-1
while i>=1 do
di=(di-di+1*ci)/bi
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
hi=xi+1-xi
end
b1,bmax_p=0,0
a1,amax_p=0,0
w1,wmax_p=1,1
c1,cmax_p=0,0
for i=2,max_p-1 do
bi=3*((di+1-di)/hi-(di-di-1)/hi-1)
ai=hi-1
wi=2*(hi-1+hi)
ci=hi
end
b=mtdma(a,w,c,b)
for i=1,max_p-1 do
ai=(bi+1-bi)/(3*hi)
ci=(di + 1-di)/hi-hi*(bi+1+2*bi)/3
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
if xi>xj then xi,xj,yi,yj=xj,xi,yj,yi end
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)
if d<=x1 then d=y1
elseif d>=x#x then d=y#x
else
local ix=1
while true do
if d<xix+1 then break
else ix=ix+1 end
end
local co={c1ix,c2ix,c3ix,c4ix}
d=mcubic(d-xix,co)
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
pxi,pyi=mrot(posi*2-1,posi*2,th)
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
bsky
#AviUtl