如何使surface.DrawTexturedRectRotated() 从左旋转?

Posted

技术标签:

【中文标题】如何使surface.DrawTexturedRectRotated() 从左旋转?【英文标题】:How do i make surface.DrawTexturedRectRotated() to rotate from left? 【发布时间】:2019-11-03 10:05:45 【问题描述】:

我使用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

如何让它从左旋转?

【问题讨论】:

【参考方案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 并没有发现任何更好的方法来实现这一点。

【讨论】:

以上是关于如何使surface.DrawTexturedRectRotated() 从左旋转?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 RelativeLayout 半透明但不使活动

如何用word使图片上下居中

如何使图像自动调整大小,使宽度为 100% 并相应调整高度?

如何使 UISegmentedcontrol 透明?

如何使 textarea 填充 div 块?

如何使 UITableViewCell 显示为禁用?