4x4x8
-
Публикации
17 -
Зарегистрирован
-
Посещение
-
Победитель дней
4
Сообщения, опубликованные пользователем 4x4x8
-
-
И так, начнем с того, что я публиковал прошлую версию, это "ремейк" так еще и более легкая версия для интеграции в другие API.
Скриншоты:
Фрактал Мандельброта

Производительность:
Ну.. тут и так все ясно
Слева ФПС, снизу кол-во символов(1).thumb.png.f4f6dcce3b5e61118216d65d02153f9e.png)
Т.е. 52К символов она сможет отрисовать 35 фпс... В теории это максимум для этой библиотеки.
Ну и финальное - репозиторий гитхаб:
https://github.com/4x4x8/pxl-
2
-
-
58 минут назад, ProgramCrafter сказал:ComputerCraft использует для получения ID компьютера os.getComputerID изнутри песочницы?
И данные компьютера действительно сохраняются в другую папку?
Т.е., если сделать ID ../../../etc/ (не учитывая то, что ID числовые, конечно), то можно будет считать файл passwd из системы?
Честно, я не знаю. Под фактическим айди я имел ввиду тот айди к которому rednet/modem, а они обращаются к _G.os.getComputerID
-
22 минуты назад, eu_tomat сказал:А что изображено на скриншоте? Эмулятор что ли? Тогда вопрос: работает ли этот трюк в игре, или только в эмуляторе?
Насчет игры не знаю, но в теории да. Т.к. опять же - мы подменяем функцию _G.os.getComputerID которая используется для получения ID, т.е. фактический ID тоже меняется, а это значит что в игре это должно работать.
-
1 минуту назад, eu_tomat сказал:А как подмена ID помогает перехвату сообщений? Ведь фактический ID компьютера остаётся прежним.
неа, на скриншоте видно что все отправляется на подмененный айди, фактический айди заменяется т.к. редактируется функция os.getComputerID()
-
6 минут назад, eu_tomat сказал:А для каких целей это может потребоваться? Что даёт смена ID?
И почему эта программа находится в разделе сетевых технологий? При чём тут сети?
Прокомментирую код:
- Я бы предпочёл не плодить лишние сущности, и объединил бы обе функции в одну. Если параметр id не пустой, то подменяем функцию, а в противном случае восстанавливаем её.
- И для чего использована задержка в 1 секунду? Какую задачу она решает?
В разделе сетевых т.к. в основном айди применяются в реднете и прочих штуках.
Задержку я забыл убрать.
Смена айди может дать как "гибкость" сети так и перехватывать сообщения :/ -
Я нашел метод подмены 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
-
3
-
-
14 часа назад, 4x4x8 сказал:Потратив более 8 часов беспрерывного кода. Я написал дизеринг для своей либы.
К сожалению этот метод ОЧЕНЬ долгий. Я напишу другой метод, в итоге будет два метода, в теории второй метод должен быть быстрее.
До:
После(используется несколько значений факторов)
Вот и второй алгоритм:
Куда быстрее предыдущего, но имеет только черно-белые цвета-- 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
-
4
-
1
-
-
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
-
-
Потратив более 8 часов беспрерывного кода. Я написал дизеринг для своей либы.
К сожалению этот метод ОЧЕНЬ долгий. Я напишу другой метод, в итоге будет два метода, в теории второй метод должен быть быстрее.
До:
После(используется несколько значений факторов)
-
1
-
-
11 час назад, eu_tomat сказал:В тот момент, когда я писал сообщение, то именно библиотеку я не смог найти в репозитории. Теперь вижу.
Это уже второй вопрос. Без кода эта тема была бы ещё менее интересной и менее полезной. Конечно, программы для ComputerCraft сейчас не пользуются большой популярностью, т.к. этому моду тяжело конкурировать с OpenComputers, но иногда люди ищут программы именно для ComputerCraft. Например, в этой теме просили переписать старую программу. Кстати, в ней почти весь код задействован для отрисовки графики. Может быть, твоя библиотека кого-нибудь вдохновит переписать эту штуку.
Благодарю. Так уже веселее.
Я обновил и выложил либу
Из изменений:
функция для очистки экрана
круги
https://github.com/4x4x8/my_stuff_for_computercraft/blob/main/Drawify/Drawify.lua-
2
-
-
3 часа назад, eu_tomat сказал:В тот момент, когда я писал сообщение, то именно библиотеку я не смог найти в репозитории. Теперь вижу.
Это уже второй вопрос. Без кода эта тема была бы ещё менее интересной и менее полезной. Конечно, программы для ComputerCraft сейчас не пользуются большой популярностью, т.к. этому моду тяжело конкурировать с OpenComputers, но иногда люди ищут программы именно для ComputerCraft. Например, в этой теме просили переписать старую программу. Кстати, в ней почти весь код задействован для отрисовки графики. Может быть, твоя библиотека кого-нибудь вдохновит переписать эту штуку.
Благодарю. Так уже веселее.
Я в скором времени залью обнову для кругов.
И да либа заточена под отрисовку пикселей, я даже впихнул поддержку текстур, мало ли кому-то надо будет :/ -
В 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
-
-
ЦитатаЭто также увеличивает разрешение по X в 2 раза, и 3 раза в Y
А какое разрешение получается в итоге?
формат текстурки виден по ссылке
Правильно понимаю, что там просто построчно запись RGB для каждого пикселя?
Кстати, планируется поддержка OpenComputers или не планируется?
Итоговое разрешение - 318x168
Да, скрипт на питоне преобразует цвета изображения в цвета CC и преоброзовывает в строку с информацией о картинке.
Скрипты я загрузил на гитхаб:
https://github.com/4x4x8/my_stuff_for_computercraft/tree/main/Drawify
Либа будет скорее всего только на CC, ибо она больше персональная, а пользуюсь я CC -
UPD3: Я обновил отрисовку пикселей, добавил два буффера, и теперь рендер картинки занимает 109 мс.
Что насчет того, что бы несколько раз попробовать отрисовать одни и те же пиксели без изменений? 123 мс.
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 texture = drw.fromURL("https://raw.githubusercontent.com/4x4x8/my_stuff_for_computercraft/main/Drawify/drw_texture_test.lua")local first = os.epoch("utc")Canvas:drawImage(texture, 1, 1)Canvas:updatePixels()Canvas:updatePixels()local second = os.epoch("utc")local time = second - firstprint("Texture drawed for " .. tostring(time))Очень доволен результатом.
-
2
-
-
UPD: Измерил время на отрисовку. 1 Секунда, разрешение текстурки равно разрешению экрана.
local first = os.epoch("utc")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()local second = os.epoch("utc")local time = second - firstprint("Texture drawed for " .. tostring(time))UPD2: Ну во впервых, если не считать создание текстурки рендер идет 189 милисекунд, на таком же разрешении.Щас я перепишу обновление пикселей, код ускорится еще в 1.5-2 раза!
А еще я в душе не знаю как менять цвет фона. Ладно.
local texture = drw.fromURL("https://raw.githubusercontent.com/4x4x8/my_stuff_for_computercraft/main/Drawify/drw_texture_test.lua")local first = os.epoch("utc")Canvas:drawImage(texture, 1, 1)Canvas:updatePixels()local second = os.epoch("utc")local time = second - firstprint("Texture drawed for " .. tostring(time)) -
Я течении 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()
Очень просто и легко загружается в код, формат текстурки виден по ссылке :/
Всем спасибо, всем пока.
-
3
-

PXL - очень отличная библиотека для отрисовки пикселей
в Графика
Опубликовано:
Добавил отрисовку текста:
если что, посмотрите документацию в репозитории гитхаба, обновлено.