基于sqrt的填充椭圆像素绘制函数

sqrt-based filled ellipse pixel drawing function

我正在尝试在基于 Lua 或 VB 的代码中创建一个函数来绘制/绘制一个 filled 椭圆。 我对这个数学知识不多,我可以使用一些帮助。

我 Googled Google 关于用代码绘制椭圆的所有内容,但我在 VB 或 Lua 中找不到一个很好的简单工作示例一个填充的。

在此站点上一个 post 上,我确实得到了有关如何绘制普通椭圆的答案,但没有找到填充椭圆的答案,这就是为什么我为一个填充的。

这是我访问过的几个网站,但我找不到不重绘已绘制像素的情况下制作填充椭圆的方法...

https://sites.google.com/site/ruslancray/lab/projects/bresenhamscircleellipsedrawingalgorithm/bresenham-s-circle-ellipse-drawing-algorithm

http://groups.csail.mit.edu/graphics/classes/6.837/F98/Lecture6/circle.html

http://www.blitzbasic.com/codearcs/codearcs.php?code=2817

http://hackipedia.org/Algorithms/Graphics/pdf/A%20Fast%20Bresenham%20Type%20Algorithm%20For%20Drawing%20Ellipses%20by%20John%20Kennedy.pdf

https://scratch.mit.edu/projects/49873666/

http://www.sourcecodesworld.com/source/show.asp?ScriptID=112

这是我的普通椭圆代码(感谢 "Johnny Strings" 的 VB 版本):

function DrawEllipse(xc,yc,w,h)
    local w2  = w * w
    local h2  = h * h
    local fw2 = 4 * w2
    local fh2 = 4 * h2

    xc = xc + w
    yc = yc + h

    local x  = 0
    local y  = h
    local s  = 2 * h2 + w2 * (1 - h)
    while h2 * x <= w2 * y do
        dot(xc + x, yc + y)
        dot(xc - x, yc + y)
        dot(xc + x, yc - y)
        dot(xc - x, yc - y)
        redraw()inkey()
        color(int(rnd()*255),int(rnd()*255),int(rnd()*255))
        if s >= 0 then
            s = s + fw2 * (1 - y)
            y = y - 1
        end
        s = s + h2 * ((4 * x) + 6)
        x = x + 1
    end
    x = w
    y = 0
    s = 2 * w2 + h2 * (1 - w)
    while w2 * y <= h2 * x do
        dot(xc + x, yc + y)
        dot(xc - x, yc + y)
        dot(xc + x, yc - y)
        dot(xc - x, yc - y)
        redraw()inkey()
        color(int(rnd()*255),int(rnd()*255),int(rnd()*255))
        if s >= 0 then
            s = s + fh2 * (1 - x)
            x = x - 1
        end
        s = s + w2 * ((4 * y) + 6)
        y = y + 1
    end
end

这是我过去为 CPU 渲染器设计的。它非常高效,也非常简单。

它依赖于椭圆的数学定义,因此椭圆是以 x,y 为中心绘制的,其宽度和高度是从中心定义的,而不是从另一边定义的。

绘图点函数在指定的 x x y 点处绘制一个像素。

local function drawaxisalignedellipse(x,y,w,h)
    --n Defines the bounds of the horizontal lines which fill the ellipse.
    local n=w
    local w2=w*w
    local h2=h*h

    --draws the center horizontal line.
    for i=x-w,x+w do
        drawpoint(i,y)
    end

    for j=1,h do
        --The current top and bottom rows.
        local ra,rb=y+j,y-j

        --This loop removes 1 from n until it is within the shape
        while w2*(h2-j*j)<h2*n*n and n~=0 do n=n-1 end

        --Draws horizontal line from -n to n across the ellipse
        for i=x-n,x+n do
            drawpoint(i,ra)
            drawpoint(i,rb)
        end
    end
end