基于sqrt的填充椭圆像素绘制函数
sqrt-based filled ellipse pixel drawing function
我正在尝试在基于 Lua 或 VB 的代码中创建一个函数来绘制/绘制一个 filled 椭圆。
我对这个数学知识不多,我可以使用一些帮助。
我 Googled Google 关于用代码绘制椭圆的所有内容,但我在 VB 或 Lua 中找不到一个很好的简单工作示例一个填充的。
在此站点上一个 post 上,我确实得到了有关如何绘制普通椭圆的答案,但没有找到填充椭圆的答案,这就是为什么我为一个填充的。
这是我访问过的几个网站,但我找不到不重绘已绘制像素的情况下制作填充椭圆的方法...
http://groups.csail.mit.edu/graphics/classes/6.837/F98/Lecture6/circle.html
http://www.blitzbasic.com/codearcs/codearcs.php?code=2817
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
我正在尝试在基于 Lua 或 VB 的代码中创建一个函数来绘制/绘制一个 filled 椭圆。 我对这个数学知识不多,我可以使用一些帮助。
我 Googled Google 关于用代码绘制椭圆的所有内容,但我在 VB 或 Lua 中找不到一个很好的简单工作示例一个填充的。
在此站点上一个 post 上,我确实得到了有关如何绘制普通椭圆的答案,但没有找到填充椭圆的答案,这就是为什么我为一个填充的。
这是我访问过的几个网站,但我找不到不重绘已绘制像素的情况下制作填充椭圆的方法...
http://groups.csail.mit.edu/graphics/classes/6.837/F98/Lecture6/circle.html
http://www.blitzbasic.com/codearcs/codearcs.php?code=2817
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