Перейти к содержимому

4x4x8

Пользователи
  • Публикации

    17
  • Зарегистрирован

  • Посещение

  • Победитель дней

    4

Сообщения, опубликованные пользователем 4x4x8


  1. И так, начнем с того, что я публиковал прошлую версию, это "ремейк" так еще и более легкая версия для интеграции в другие API.
    Скриншоты:
    Фрактал Мандельброта
    image.thumb.png.e507dfbfd6bdf84080f3bcb9706b80c7.png
     

    Производительность:
    Ну.. тут и так все ясно
    Слева ФПС, снизу кол-во символов188730268_PhotoAdKing_Chart(1)(1).thumb.png.f4f6dcce3b5e61118216d65d02153f9e.png
     

    Т.е. 52К символов она сможет отрисовать 35 фпс... В теории это максимум для этой библиотеки.

    Ну и финальное - репозиторий гитхаб:
    https://github.com/4x4x8/pxl

    • Нравится 2

  2. 58 минут назад, ProgramCrafter сказал:

    ComputerCraft использует для получения ID компьютера os.getComputerID изнутри песочницы?

    И данные компьютера действительно сохраняются в другую папку?

    Т.е., если сделать ID ../../../etc/ (не учитывая то, что ID числовые, конечно), то можно будет считать файл passwd из системы?

    Честно, я не знаю. Под фактическим айди я имел ввиду тот айди к которому rednet/modem, а они обращаются к _G.os.getComputerID


  3. 22 минуты назад, eu_tomat сказал:

    А что изображено на скриншоте? Эмулятор что ли? Тогда вопрос: работает ли этот трюк в игре, или только в эмуляторе?

    Насчет игры не знаю, но в теории да. Т.к. опять же - мы подменяем функцию _G.os.getComputerID которая используется для получения ID, т.е. фактический ID тоже меняется, а это значит что в игре это должно работать.


  4. 1 минуту назад, eu_tomat сказал:

    А как подмена ID помогает перехвату сообщений? Ведь фактический ID компьютера остаётся прежним.

    неа, на скриншоте видно что все отправляется на подмененный айди, фактический айди заменяется т.к. редактируется функция os.getComputerID()


  5. 6 минут назад, eu_tomat сказал:

    А для каких целей это может потребоваться? Что даёт смена ID?

     

    И почему эта программа находится в разделе сетевых технологий? При чём тут сети?

     

    Прокомментирую код:

    • Я бы предпочёл не плодить лишние сущности, и объединил бы обе функции в одну. Если параметр id не пустой, то подменяем функцию, а в противном случае восстанавливаем её.
    • И для чего использована задержка в 1 секунду? Какую задачу она решает?

     

    В разделе сетевых т.к. в основном айди применяются в реднете и прочих штуках.
    Задержку я забыл убрать.

    Смена айди может дать как "гибкость" сети так и перехватывать сообщения :/


  6. Я нашел метод подмены ID. Пишу одну либу, под свои нужды так сказать. Я просто задумался о самом простом и минимально затратном способе подмены ID и родил это:
     

    _G.backup = {}
    _G.backup.os = {}
    _G.backup.os.getComputerID = _G.os.getComputerID
    
    -- spoof computer id --
    self.spoof_computer_id = function(id)
    if id then
    _G.os.getComputerID = function() return id end
    end
    sleep(1)
    end
    
    self.restore_computer_id = function()
    _G.os.getComputerID = _G.backup.os.getComputerID
    end

    unknown.png

    • Нравится 3

  7. 14 часа назад, 4x4x8 сказал:

    Потратив более 8 часов беспрерывного кода. Я написал дизеринг для своей либы.
    К сожалению этот метод ОЧЕНЬ долгий. Я напишу другой метод, в итоге будет два метода, в теории второй метод должен быть быстрее.
    До:
    unknown.png

     

    После(используется несколько значений факторов)
    unknown.png

     

    unknown.png

    Вот и второй алгоритм:
    Куда быстрее предыдущего, но имеет только черно-белые цвета

    -- ordered bayer dither --
    local threshold_map = {
        {0, 8, 2, 10},
        {12, 4, 14, 6},
        {3, 11, 1, 9},
        {15, 7, 13, 5}
    }
    
    function Dither.ordered_bayer_dither(matrix, bool_matrix, width, height)
        for y=1, height-1 do
            for x=2, width-1 do
                local grey = Dither.greyscale_pixel(colors.toRGB(matrix[y][x]))
                grey = grey / Dither.MAX_COLOR -- Dither.MAX_COLOR is 255
                if grey < threshold_map[(y%4)+1][(x%4)+1] * (1/16) then
                    matrix[y][x] = colors.black
                    bool_matrix[CEIL(y/3)][CEIL(x/2)] = true
                else
                    matrix[y][x] = colors.white
                    bool_matrix[CEIL(y/3)][CEIL(x/2)] = true
                end
            end
        end
    
        return matrix, bool_matrix
    end

    unknown.png

     

    unknown.png

    • Нравится 4
    • Спасибо 1

  8. 1 час назад, eu_tomat сказал:

    А как читателю этой темы можно ознакомиться с кодом? Где ссылка на библиотеку?

    Код:
     

    -- floyd steinberg dither --
    
    function Dither.floyd_steinberg_dither(matrix, bool_matrix, width, height)
        for y=1, height-1 do
            for x=2, width-1 do
                local old_r,old_g,old_b = colors.toRGB(matrix[y][x])
                --old_r,old_g,old_b = Dither.greyscale_pixel(old_r,old_g,old_b)
                
                local factor = 3
                local new_r = CEIL(factor * old_r / 255) * (255 / factor)
                local new_g = CEIL(factor * old_g / 255) * (255 / factor)
                local new_b = CEIL(factor * old_b / 255) * (255 / factor)
                new_r,new_g,new_b = math.floor(new_r), math.floor(new_g), math.floor(new_b)
    
                matrix[y][x] = colors.fromRGB(new_r,new_g,new_b)
                bool_matrix[CEIL(y/3)][CEIL(x/2)] = true
    
                local err_r = old_r - new_r
                local err_g = old_g - new_g
                local err_b = old_b - new_b
    
                local index_x, index_y = x+1, y
                local c_r, c_g, c_b = colors.toRGB(matrix[index_y][index_x])
                c_r = c_r + err_r * 7/16.0
                c_g = c_g + err_g * 7/16.0
                c_b = c_b + err_b * 7/16.0
                matrix[index_y][index_x] = colors.fromRGB(c_r, c_g, c_b)
                bool_matrix[CEIL(index_y/3)][CEIL(index_x/2)] = true
    
                index_x, index_y = x-1, y+1
                c_r, c_g, c_b = colors.toRGB(matrix[index_y][index_x])
                c_r = c_r + err_r * 3/16.0
                c_g = c_g + err_g * 3/16.0
                c_b = c_b + err_b * 3/16.0
                matrix[index_y][index_x] = colors.fromRGB(c_r, c_g, c_b)
                bool_matrix[CEIL(index_y/3)][CEIL(index_x/2)] = true
    
                index_x, index_y = x, y+1
                c_r, c_g, c_b = colors.toRGB(matrix[index_y][index_x])
                c_r = c_r + err_r * 5/16.0
                c_g = c_g + err_g * 5/16.0
                c_b = c_b + err_b * 5/16.0
                matrix[index_y][index_x] = colors.fromRGB(c_r, c_g, c_b)
                bool_matrix[CEIL(index_y/3)][CEIL(index_x/2)] = true
    
                index_x, index_y = x+1, y+1
                c_r, c_g, c_b = colors.toRGB(matrix[index_y][index_x])
                c_r = c_r + err_r * 1/16.0
                c_g = c_g + err_g * 1/16.0
                c_b = c_b + err_b * 1/16.0
                matrix[index_y][index_x] = colors.fromRGB(c_r, c_g, c_b)
                bool_matrix[CEIL(index_y/3)][CEIL(index_x/2)] = true
    
    
                --[[
                    [y+1][x  ]
                    [y+1][x+1]
                ]]
            end
        end
    
        return matrix, bool_matrix
    end

    colors взял отсюда:
    https://www.computercraft.info/forums2/index.php?/topic/23048-rgb-api-convert-rgb-colors-to-computercraft-colors-and-back/

    • Нравится 3
    • Спасибо 1

  9. Потратив более 8 часов беспрерывного кода. Я написал дизеринг для своей либы.
    К сожалению этот метод ОЧЕНЬ долгий. Я напишу другой метод, в итоге будет два метода, в теории второй метод должен быть быстрее.
    До:
    unknown.png

     

    После(используется несколько значений факторов)
    unknown.png

     

    unknown.png

    • Нравится 1

  10. 11 час назад, eu_tomat сказал:

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

     

    Это уже второй вопрос. Без кода эта тема была бы ещё менее интересной и менее полезной. Конечно, программы для ComputerCraft сейчас не пользуются большой популярностью, т.к. этому моду тяжело конкурировать с OpenComputers, но иногда люди ищут программы именно для ComputerCraft. Например, в этой теме просили переписать старую программу. Кстати, в ней почти весь код задействован для отрисовки графики. Может быть, твоя библиотека кого-нибудь вдохновит переписать эту штуку.

     

    Благодарю. Так уже веселее.

    Я обновил и выложил либу
    Из изменений:
    функция для очистки экрана
    круги

    https://github.com/4x4x8/my_stuff_for_computercraft/blob/main/Drawify/Drawify.lua

    • Нравится 2

  11. 3 часа назад, eu_tomat сказал:

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

     

    Это уже второй вопрос. Без кода эта тема была бы ещё менее интересной и менее полезной. Конечно, программы для ComputerCraft сейчас не пользуются большой популярностью, т.к. этому моду тяжело конкурировать с OpenComputers, но иногда люди ищут программы именно для ComputerCraft. Например, в этой теме просили переписать старую программу. Кстати, в ней почти весь код задействован для отрисовки графики. Может быть, твоя библиотека кого-нибудь вдохновит переписать эту штуку.

     

    Благодарю. Так уже веселее.

    Я в скором времени залью обнову для кругов.
    И да либа заточена под отрисовку пикселей, я даже впихнул поддержку текстур, мало ли кому-то надо будет :/


  12. В 24.08.2022 в 18:32, eu_tomat сказал:

    Скрипты — это хорошо. Но как получить код самой библиотеки?

     

    Этот раздел предназначен для публикации программ. А отчёт по их разработке может быть лишь дополнением. Поэтому я предлагаю добавить ссылку на код библиотеки или перенести тему в более подходящий раздел.

     

    Идеи использования шрифтов Брайля или двойной буферизации уже давно не являются новыми, и поэтому сейчас вряд ли кому-то интересно их теоретическое обсуждение. Но сама реализация может заинтересовать форумчан, даже не смотря на значительно большую популярность OpenComputers в сравнении с ComputerCraft.

    Я вроде как уже выложил код либы на гитхаб(круги не работают, переписываю их активно)
    Я не думаю что она будет кому-либо интересна и полезна в использовании т.к. я ее полностью под себя писал

    Вот репо с либой, текстуркой и объектом текстурки, в папке Python есть скрипты для преобразования картинки в текстурку(надо запустить palettePaster, дабы преобразовать палитру цветов для CC, а потом imageTabler)
    https://github.com/4x4x8/my_stuff_for_computercraft/tree/main/Drawify

    • Нравится 1
    • Спасибо 1

  13. Цитата
      10 часов назад, 4x4x8 сказал:

    Это также увеличивает разрешение по X в 2 раза, и 3 раза в Y

    А какое разрешение получается в итоге?

     

      10 часов назад, 4x4x8 сказал:

    формат текстурки виден по ссылке

    Правильно понимаю, что там просто построчно запись RGB для каждого пикселя?

     

    Кстати, планируется поддержка OpenComputers или не планируется?

    Итоговое разрешение - 318x168
    Да, скрипт на питоне преобразует цвета изображения в цвета CC и преоброзовывает в строку с информацией о картинке.

    Скрипты я загрузил на гитхаб:
    https://github.com/4x4x8/my_stuff_for_computercraft/tree/main/Drawify

    Либа будет скорее всего только на CC, ибо она больше персональная, а пользуюсь я CC


  14. UPD3: Я обновил отрисовку пикселей, добавил два буффера, и теперь рендер картинки занимает 109 мс.

     

    unknown.png

     

     

    Что насчет того, что бы несколько раз попробовать отрисовать одни и те же пиксели без изменений? 123 мс.
    image.png.97bd964bbfcc2e099e67eea5d3f4b25b.png

     

    local Monitor = peripheral.wrap("left")
    local Canvas = DrawLib.new(Monitor, colors.black, true)
     
    Monitor.setBackgroundColor(Canvas.background_color)
    Monitor.clear()
    print(Canvas.pixel_width, Canvas.pixel_height)
     
    local first = os.epoch("utc")
    Canvas:drawImage(texture, 1, 1)
    Canvas:updatePixels()
    Canvas:updatePixels()
    local second = os.epoch("utc")
    local time = second - first
     
    print("Texture drawed for " .. tostring(time))

     

    Очень доволен результатом.

    • Нравится 2

  15. UPD: Измерил время на отрисовку. 1 Секунда, разрешение текстурки равно разрешению экрана.

    image.png.fd265f363b26314060544d8a29506e2b.png

     

    local first = os.epoch("utc")
    Canvas:drawImage(texture, 1, 1)
    Canvas:updatePixels()
    local second = os.epoch("utc")
    local time = second - first
     
    print("Texture drawed for " .. tostring(time))
     
     
    UPD2: Ну во впервых, если не считать создание текстурки рендер идет 189 милисекунд, на таком же разрешении.
    Щас я перепишу обновление пикселей, код ускорится еще в 1.5-2 раза!
    А еще я в душе не знаю как менять цвет фона. Ладно.
    unknown.png
     
    local first = os.epoch("utc")
    Canvas:drawImage(texture, 1, 1)
    Canvas:updatePixels()
    local second = os.epoch("utc")
    local time = second - first
     
    print("Texture drawed for " .. tostring(time))

  16. Я  течении 5-6 дней писал библиотеку для отрисовки пикселей. И щас я тут.
    Моя библиотека использует символы, так что каждый пиксель размером (1,1), а не (2,3) если писать пробелы с цветным фоном.
    Это также увеличивает разрешение по X в 2 раза, и 3 раза в Y

    Текстурки я могу загружать через ссылки:

    local texture = drw.fromURL("https://raw.githubusercontent.com/4x4x8/my_stuff_for_computercraft/main/Drawify/drw_texture_test.lua")
    Canvas:drawImage(texture, 1, 1)
    Canvas:updatePixels()


    Очень просто и легко загружается в код, формат текстурки виден по ссылке :/
    Всем спасибо, всем пока.

     

     

    unknown.png

    unknown.png

    • Нравится 3
×
×
  • Создать...