2015-05-25 2 views
0

Я пытаюсь сделать функцию в коде на основе Lua или VB для рисования/построения заполненного эллипса. У меня нет много знаний об этой математике, и я могу воспользоваться некоторой помощью.Функция рисования пикселов эллипса на основе sqrt

В Google вы найдете все, что нужно для рисования эллипсов с кодом, но я не могу найти хороший простой рабочий пример в VB или Lua для заполнения.

В предыдущем посте на этом сайте я получил ответ о том, как рисовать нормальный эллипс, но ничего не придумал для заполнения, вот почему я создаю новую тему для наполненной.

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

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

Вот код, у меня есть для нормального эллипса (благодаря «Джонни 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 
+2

возможно дубликат [Нарисуйте функции эллипсом SQRT на основе] (http://stackoverflow.com/questions/30384333/draw-an-ellipse-sqrt-based-function) –

+0

@The голубой собаки, извините для сходства в этой теме, но здесь я явно прошу код рисовать заполненный эллипс, на другом посту я получил ответы только на нормальный эллипс .. и, возможно, потому, что я попросил 2 вещи (заполненный и нормальный эллипс) создать новую тему для заполненного эллипса? – Tom

+1

Здесь есть несколько алгоритмов: http://stackoverflow.com/questions/10322341/simple-algorithm-for-drawing-filled-ellipse-in-cc –

ответ

1

Вот что я придумал для моего процессора рендерером в прошлом. Это очень эффективно и очень просто.

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

Функция точки рисования рисует пиксель в заданной точке 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 
+0

Привет, Дональд! спасибо за код, именно то, что я искал. есть две небольшие проблемы, и я не могу понять, как изменить код, чтобы он работал правильно. Первая проблема: если я хочу сделать круг 5 на 5 пикселей (10,10,5,5), то кружок равен 11 на 11 пикселей. Вторая проблема: если я хочу нарисовать эллипс, подобный этому «drawaxisalignellipipse (0,0,5,5)», тогда эллипс будет выведен за пределы холста, слева и сверху следует нарисовать начало от границы справа? – Tom

+0

Причина в том, что высота и ширина определяются из центра, а не с другой стороны. Позиция эллипса определяется в центре. Извините, я должен был так сказать. Я делаю это, потому что это самый естественный и полезный способ определения местоположения и размера объектов.Вы можете сказать, что x = x-w y = y-h w = floor (w/2) h = floor (h/2), если вы хотите сделать это стандартным способом программирования. –

+0

привет Дональд, спасибо за информацию. – Tom

Смежные вопросы