我使用surface.DrawTexturedRectRotated()制作了实心圆,但它从中心旋转,我想使其从左侧旋转。
I tried to rotate it but it makes full circle when its 180 degrees
function draw.FilledCircle( x, y, w, h, ang, color )
for i=1,ang do
draw.NoTexture()
surface.SetDrawColor( color or color_white )
surface.DrawTexturedRectRotated( x,y, w, h, i )
end
end
我如何使其从左旋转?
答案 0 :(得分:1)
如果您想要一个允许通过指定ang
参数来创建类似于饼图的实心圆的函数,那么最好的选择可能是surface.DrawPoly( table vertices )
。您应该可以像这样使用它:
function draw.FilledCircle(x, y, r, ang, color) --x, y being center of the circle, r being radius
local verts = {{x = x, y = y}} --add center point
for i = 0, ang do
local xx = x + math.cos(math.rad(i)) * r
local yy = y - math.sin(math.rad(i)) * r
table.insert(verts, {x = xx, y = yy})
end
--the resulting table is a list of counter-clockwise vertices
--surface.DrawPoly() needs clockwise list
verts = table.Reverse(verts) --should do the job
surface.SetDrawColor(color or color_white)
draw.NoTexture()
surface.DrawPoly(verts)
end
我按照this example的建议,将surface.SetDrawColor()
放在draw.NoTexture()
之前。
您可能想使用for i = 0, ang, angleStep do
来减少顶点数量,从而减少硬件负载,但是这仅适用于小圆圈(例如您的示例中的那个),因此角度步长应该是某个函数半径来考虑每种情况。此外,还需要进行其他计算,以使角度不被余数为零的角度步长所除。
--after the for loop
if ang % angleStep then
local xx = x + math.cos(math.rad(ang)) * r
local yy = y - math.sin(math.rad(ang)) * r
table.insert(verts, {x = xx, y = yy})
end
关于纹理,如果您的纹理不是纯色,则与矩形会有很大不同,但是快速浏览library并没有发现实现此目的的更好方法。