Zer0Galaxy 2 187 Опубликовано: 12 февраля, 2016 (изменено) Небольшая библиотечка, позволяющая рисовать простые геометрические фигуры. pastebin get 1WmfjNfU lib/graffiti.lua Особенностью библиотеки является то, что в качестве "пикселя" используется не знакоместо, а половина знакоместа. Таким образом, максимальное разрешение, которое можно получить на мониторе 3-его уровня составляет 160х100. Отсчет ведется с верхнего левого угла экрана и начинается с единицы. Функции, предоставляемые библиотекой: setColor(color) - устанавливает цвет чернил, которым в дальнейшем будет осуществляться рисование getColor(x,y) - возвращает цвет, в который окрашен "пиксель" x, y. Возвращается реальный цвет "пикселя", а не тот в который он ранее окрашивался. В виду того, что ОС-мониторы далеко не true-color, эти цвета могут отличаться. dot(x,y) - окрашивает в текущий цвет "пиксель" с координатами x, y. move(x,y) - чертит линию от последней установленной точки до точки с координатами x, y. Позволяет создавать ломанные линии. line(x0,y0,x1,y1) - чертит линию от точки x0, y0 до x1, y1. circle(x,y,r[,fill]) - чертит окружность с центром x, y и радиусом r. Если указан параметр fill, он используется в качестве цвета заливки окружности. Если fill равняется true, окружность заливается текущим цветом. fill(x,y) - заливает текущим цветом область, которой принадлежит точка x, y polygon(x1,y1,x2,y2, ... , xn,yn[,fill]) - рисует многоугольник по заданным вершинам. Если количество параметров нечетно, последний параметр используется как цвет заливки многоугольника. load(path) - загружает картинку из файла по указанному пути (поддерживаются png-файлы) и возвращает структуру, содержащую эту картинку. За основу взята библиотека работы с PNG-файлами libPNGimage, автор TehSomeLuigi draw(pic, x, y [,SizeX [,SizeY ] ] ) - рисует картинку pic на экран так, что левый верхний угол картинки размещается по координатам x, y. Параметр pic должен быть структурой, которую возвращает функция load или строкой с именем файла. В случае, когда pic - строка, картинка будет загружена из указанного файла, однако, в этом случае повторная прорисовка той же картинки вызовет ее повторную загрузку, что увеличит время прорисовки. Поддерживается альфа-канал. Если указаны параметры SizeX и SizeY, изображение растягивается/сжимается до указанных размеров. Если указан только параметр SizeX, высота картинки изменяется пропорционально изменению ширины. Пример использования библиотеки: g=require("graffiti") --Подключаем библиотеку require("term").clear()--Очищаем экран g.setColor(0xff0000) --Устанавливаем красный цвет чернил for i=1,50,10 do --Рисуем линии g.line(1,1,50,i) end g.setColor(0x00ff00) --Устанавливаем зеленый цвет чернил g.circle(65,25,20) --Рисуем окружность g.setColor(0x0000ff) --Устанавливаем синий цвет чернил g.dot(10,15) --Рисуем треугольник g.move(40,35) g.move(30,45) g.move(10,15) И вот результат на мониторе второго уровня: Планы на будущее: 1. Реализовать заливку (реализовано) 2. Осуществить возможность прорисовки изображений из png-файла (реализовано) Изменено 29 марта, 2016 пользователем Zer0Galaxy 18 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Hello 125 Опубликовано: 13 февраля, 2016 А разбрызгивание можете сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 13 февраля, 2016 Разбрызгивание это функция скорее графического редактора. Оно легко реализуется при помощи graffiti.dot() и генератора случайных чисел. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 15 февраля, 2016 Добавлены функции getColor и fill 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 17 февраля, 2016 Добавлена функция polygon. Теперь можно рисовать вот такие пентаграммы g.setColor(0xff0000) g.circle(80,50,44) g.polygon(80,93, 54,16, 120,64, 40,64, 106,16, 0xffff00) 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 22 февраля, 2016 (изменено) Добавлены функции load и draw. Пример наложения изображения на пентаграмму: g.setColor(0xff0000) g.circle(80,50,44) g.polygon(80,93, 54,16, 120,64, 40,64, 106,16, 0xffff00) g.draw("pic.png",1,1) онлайн PNG-редактор Изменено 22 февраля, 2016 пользователем Zer0Galaxy 6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 2 марта, 2016 Добавлена возможность масштабирования при выводе png-файла (см. функцию draw): java=g.load("Java_RE.png") for i=1,10 do g.draw(java,math.random(-50,110),math.random(-50,50),math.random(40,80),math.random(40,80)) end 6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TC1061 14 Опубликовано: 13 апреля, 2017 как ты сделал пиксели в ползнака? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TC1061 14 Опубликовано: 13 апреля, 2017 ой стоп я понял. Ты используешь знак который помещается на половинку пикселя OC и выбираешь background и foreground и делаешь чето там 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 13 апреля, 2017 Угу. А еще есть Шрифт Брайля. С ним пиксель еще меньше получается, вот только с цветом проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ALeXeR 67 Опубликовано: 14 апреля, 2017 вот чего я не видал в подобных библиотеках - так это логическое совмещение полусимвола (Шрифт Брайля) и обычного текста, в одних можно выводить брайлем, в других текстом но саморучно туда символы Брайля пихать, а вот бы какое-то логическое апи) моя либа как бы вроде должна была иметь такую реализацию, но загнулась в конец, ибо меня грузят в вузе) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 14 апреля, 2017 Надо взять все крутые идеи и сплавить в одну Ultimate Graphical Library (сокращённо UGLY). 7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TC1061 14 Опубликовано: 18 августа, 2017 Надо взять все крутые идеи и сплавить в одну Ultimate Graphical Library (сокращённо UGLY). Это сэкономит всем время. Классная идея. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
utevaugu36 6 Опубликовано: 12 марта, 2018 Крутая либа! Буду использовать в своих проектах *Оч мало софта, который мне прям нравится, эта либа - одна из этого софта. ---------------------------------------------- Есть предложение. Я, помню, писал для своей apiAPI функцию построения графиков. Чутка подкорректируй, и все будет ок ;D function api.grafik(temperatures) if temperatures == nil then temperatures = {} for i = 1, 12 do temperatures[i] = math.random(-10, 10) end end max = -math.huge for i = 1, #temperatures-1 do if max < temperatures[i+1] then max = temperatures[i] end end width, height = component.gpu.getResolution() buffer.semiPixelLine(4, height/2, 4, height/2-max-5, 0xFFFFFF) buffer.semiPixelLine(4, height/2, 4, height/2+max+5, 0xFFFFFF) buffer.semiPixelLine(4, height/2, #temperatures*4, height/2, 0xFFFFFF) old, new, x, lx = 1, 2, 7, 8 for i = 1, #temperatures-1 do buffer.semiPixelLine(x, (height/2)-(temperatures[old]), lx, (height/2)-(temperatures[new]), 0xFF0000) old, new, x, lx = old + 1, new + 1, x + 2, lx + 2 end buffer.draw(true) end --Написано под doubleBuffer, используется функция рисования линии(x1, y1, x2, y2, color) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 12 марта, 2018 ... А почему нельзя было залить картинку на imgur? Теперь она рипнулась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgramCrafter 544 Опубликовано: 25 августа, 2022 Библиотека не может нормально считывать большие картинки (конкретно эта картинка 800x1100): https://i.waifu.pics/oRYkwh4.png Выкидывает ошибку cannot perform arithmetic on a nil value: local 'dist_extrabits' (ну, или примерно так). Я знаю, что для нормального считывания не хватит памяти, но библиотека работает всё равно некорректно. Проблема в том, что большое изображение разбивается на куски IDAT, а либа (deflate на пару с libPNGimage) пытается каждый из кусков разархивировать по отдельности. В то время как в спецификации PNG (https://www.w3.org/TR/PNG/#11IDAT) сказано: Цитата The compressed datastream is then the concatenation of the contents of the data fields of all the IDAT chunks. Скрытый текст Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgramCrafter 544 Опубликовано: 25 августа, 2022 OutStringStream, используемый в библиотеке, на добавление каждого символа пересобирает строку. Так как строки в Lua неизменяемы, это приводит к копированию строки O(n) раз, давая суммарную сложность O(n^2). Альтернативная реализация, меньше страдающая от этого недостатка: local outssmt = {} ----143 function outssmt:__call(write) self.buf[#self.buf + 1] = string.char(write) end function outssmt:__index(k) if k == 'str' then self._str = self._str .. table.concat(self.buf, '') self.buf = {} return self._str end return nil end function outssmt.OutStringStream() local outss = {_str="", buf={}} setmetatable(outss, outssmt) return outss end 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах