Как мне сделать surface.DrawTexturedRectRotated () повернуть слева? - PullRequest
1 голос
/ 03 ноября 2019

Я использовал surface.DrawTexturedRectRotated (), чтобы сделать закрашенный круг, но он вращается из центра, и я хочу, чтобы он вращался слева.

Я пытался повернуть его, но он делает полный круг, когда его180 градусов

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 Ответ

1 голос
/ 03 ноября 2019

Если вам нужна функция, позволяющая создать круговой круг, заполненный круговой диаграммой, указав параметр 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

Я поставил 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

Что касается текстурирования, это будет сильно отличаться от прямоугольника, если ваша текстураничего кроме сплошного цвета, но быстрый взгляд на библиотеку не выявил лучшего способа достичь этого.

...