Рисование линии между двумя точками - PullRequest
0 голосов
/ 02 ноября 2010

Вот что я получил до сих пор. Я переписал код, чтобы немного упростить вещи. Предыдущий код на самом деле не был настоящим, базовым алгоритмом. Это был пух, который мне не нужен. Я ответил на вопрос о поле, и ниже вы увидите несколько изображений с результатами моего теста.

local function Line (buf, x1, y1, x2, y2, color, pitch)

    -- identify the first pixel
    local n = x1 + y1 * pitch

    -- // difference between starting and ending points
    local dx = x2 - x1;
    local dy = y2 - y1;

    local m = dy / dx
    local err = m - 1

    if (dx > dy) then   -- // dx is the major axis
        local j = y1
        local i = x1
        while i < x2 do
            buf.buffer[j * pitch + i] = color
            if (err >= 0) then
                i = i + 1
                err = err - 1
            end
            j = j + 1
            err = err + m
        end
    else        -- // dy is the major axis
        local j = x1
        local i = y1
        while i < y2 do
            buf.buffer[i * pitch + j] = color
            if (err >= 0) then
                i = i + 1
                err = err - 1
            end
            j = j + 1
            err = err + m
        end
    end
end


-- (visdata[2][1][576], int isBeat, int *framebuffer, int *fbout, int w, int h
function LibAVSSuperScope:Render(visdata, isBeat, framebuffer, fbout, w, h)
    local size = 5

    Line (self.buffer, 0, 0, 24, 24, 0xffff00, 24)
    do return end
end

Редактировать: О, я только что понял. 0,0 находится в нижнем левом углу. Так что функция вроде работает, но она перекрывается и наклонена.

Редактировать2:

Да, все это сломано. Я вставляю числа в Line () и получаю всевозможные результаты. Позвольте мне показать вам немного.

Вот Line (self.buffer, 0, 0, 23, 23, 0x00ffff, 24 * 2)

alt text

А вот и Line (self.buffer, 0, 1, 23, 23, 0x00ffff, 24 * 2)

alt text

Редактировать: Вау, выполнение Line (self.buffer, 0, 24, 24, 24, 0x00ffff, 24 * 2) использует слишком много процессорного времени.

Редактировать: Вот еще одно изображение с использованием этого алгоритма. Желтые точки являются отправной точкой.

Line (self.buffer, 0, 0, 24, 24, 0xff0000, 24)
Line (self.buffer, 0, 12, 23, 23, 0x00ff00, 24)
Line (self.buffer, 12, 0, 23, 23, 0x0000ff, 24)

alt text

Редактировать: И да, эта синяя линия обтекает.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2010

Это то, на чем я остановился.Мне просто нужно было найти достоверную информацию об этом алгоритме Брезенхема.Спасибо cs-unc за информацию о различных линейных алгоритмах, от простых до сложных .

function LibBuffer:Line4(x0, y0, x1, y1, color, pitch)
    local dx = x1 - x0;
    local dy = y1 - y0;
    local stepx, stepy

    if dy < 0 then
        dy = -dy
        stepy = -1
    else
        stepy = 1
    end

    if dx < 0 then
        dx = -dx
        stepx = -1
    else
        stepx = 1
    end

    self.buffer[x0 + y0 * pitch] = color
    if dx > dy then
        local fraction = dy - bit.rshift(dx, 1)
        while x0 ~= x1 do
            if fraction >= 0 then
                y0 = y0 + stepy
                fraction = fraction - dx
            end
            x0 = x0 + stepx
            fraction = fraction + dy
            self.buffer[floor(y0) * pitch + floor(x0)] = color
        end
    else
        local fraction = dx - bit.rshift(dy, 1)
        while y0 ~= y1 do
            if fraction >= 0 then
                x0 = x0 + stepx
                fraction = fraction - dy
            end
            y0 = y0 + stepy
            fraction = fraction + dx
            self.buffer[floor(y0) * pitch + floor(x0)] = color
        end
    end
end

Вот как это выглядит.

alt text

0 голосов
/ 02 ноября 2010

Это работает.

alt text

Line (self.buffer, 0, 0, 23, 23, 0xff0000, 24 * 2)
Line (self.buffer, 0, 5, 23, 23, 0x00ff00, 24)
Line (self.buffer, 12, 0, 23, 23, 0x0000ff, 24)

-

local function Line (buf, x0, y0, x1, y1, color, pitch)
    local dx = x1 - x0;
    local dy = y1 - y0;

    buf.buffer[x0 + y0 * pitch] = color
    if (dx ~= 0) then
        local m = dy / dx;
        local b = y0 - m*x0;
        if x1 > x0 then
            dx = 1
        else
            dx = -1
        end
        while x0 ~= x1 do
            x0 = x0 + dx
            y0 = math.floor(m*x0 + b + 0.5);
            buf.buffer[x0 + y0 * pitch] = color
        end

    end
end

Вот спираль.

alt text

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

alt text

...