【Aegisub】判断绘图的方向,函数分享
一般要判断绘图的方向有两种方法,
第一种是用格林公式,Green公式揭示了平面区域的二重积分和封闭曲线上的线积分的关系。
第二种是用顶点判断,只留下图形的凸点用来判断这些凸点的方向。
我自己写了个破函数,因为我很笨,代码也写得烂,不要嫌弃我就行了,以下是代码:

首先用向量叉乘来判断三个点的方向,然后再用它做辅助函数,判断绘图方向:


用取绘图凸点的方法来判断图形方向,肯定比用格林公式要麻烦
顺便把图中的代码复制出来:
function orientation(p_x,p_y,q_x,q_y,r_x,r_y)
val = (q_y-p_y)*(r_x-q_x)-(q_x-p_x)*(r_y-q_y)
if(val == 0) then
return 0
end
if(val > 0) then
return 1
else
return 2
end
end
-- 三点 (p, q, r)的方向
-- 0 --> 数字0代表p, q , r三点共线
-- 1 -->(由于aeg的坐标系反过来了,所以是逆时针)
-- 2 -->(由于aeg的坐标系反过来了,所以是顺时针)
function shape_orientation(ass_shape)
local ass_shape=ass_shape:match([[m[^m]+]])
local x1,y1,x2,y2=Yutils.shape.bounding(ass_shape)
local ds=""
for x,y in ass_shape:gmatch("([-.%d]+) ([-.%d]+)") do
local d=x .. " " .. y
d=d:gsub("%-","%%-")
if (tonumber(x)==x1 or tonumber(x)==x2 or tonumber(y)==y1 or tonumber(y)==y2) and ds:match(d)==nil then
ds=ds.. " " ..d:gsub("%%","")
end
end
if ds:match("[-.%d]+ [-.%d]+ [l b]*[-.%d]+ [-.%d]+ [l b]*[-.%d]+ [-.%d]+")==nil then
local ds_end=ds:match("[-.%d]+ [-.%d]+$")
local ass_s=ds_end:gsub("%-","%%-")
local ass_shape_end=ass_shape:match(ass_s.."[l b]*([-.%d]+ [-.%d]+)")
if ass_shape_end then
ass_shape=ass_shape:match("([-.%d]+ [-.%d]+) [l b]*"..ass_s).. " " ..ds_end.. " " ..ass_shape_end
else ass_shape=ds:match("[-.%d]+ [-.%d]+").. " " ..ass_shape:match("([-.%d]+ [-.%d]+) [l b]*"..ass_s).. " " ..ds_end
end
end
if ds:match("[-.%d]+ [-.%d]+ [l b]*[-.%d]+ [-.%d]+ [l b]*[-.%d]+ [-.%d]+")~=nil then
ass_shape=ds
end
local n=0
for _ in ass_shape:gmatch("[-.%d]+ [-.%d]+") do
if n~=0 then
break
end
_=_:gsub("%-","%%-")
local k=ass_shape:find(_)
if ass_shape:match("[-.%d]+ [-.%d]+ [l b]*[-.%d]+ [-.%d]+ [l b]*[-.%d]+ [-.%d]+",k) then
a,b,c,d,e,f=ass_shape:match("([-.%d]+) ([-.%d]+) [l b]*([-.%d]+) ([-.%d]+) [l b]*([-.%d]+) ([-.%d]+)",k)
n=orientation(tonumber(a),tonumber(b),tonumber(c),tonumber(d),tonumber(e),tonumber(f))
end
end
return n
end
--不考虑自交图形、然后方向以第一个的m的方向为准
-- 0 --> 数字0共线
-- 1 -->(由于aeg的坐标系反过来了,所以是逆时针)
-- 2 -->(由于aeg的坐标系反过来了,所以是顺时针)
最后,该函数会根据绘图的第一个m来判断方向,所以要注意如果绘图有多个m,那么其判断的方向会以第一个m为准,然后当然对于自交图形的方向判断肯定是不确定的。
我代码写得又长又烂自己都看不下去