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


Фотография

Графическая библиотека "Граффити"


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 14

#1 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 12 Февраль 2016 - 17:58

*
Популярное сообщение!

Небольшая библиотечка, позволяющая рисовать простые геометрические фигуры.

 

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, высота картинки изменяется пропорционально изменению ширины.

 

Пример использования библиотеки:

Спойлер

И вот результат на мониторе второго уровня:

Прикрепленный файл  graffiti.png   4,2К   58 Количество загрузок:

 

Планы на будущее:

1. Реализовать заливку (реализовано)

2. Осуществить возможность прорисовки изображений из png-файла (реализовано)


Сообщение отредактировал Zer0Galaxy: 29 Март 2016 - 10:20


#2 Оффлайн   Hello

Hello
  • Пользователи
  • Сообщений: 18
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 13 Февраль 2016 - 14:03

А разбрызгивание можете сделать?



#3 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 13 Февраль 2016 - 15:18

Разбрызгивание это функция скорее графического редактора. Оно легко реализуется при помощи graffiti.dot() и генератора случайных чисел.
  • TC1061 это нравится

#4 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 15 Февраль 2016 - 13:22

Добавлены функции getColor и fill


  • Alex это нравится

#5 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 17 Февраль 2016 - 18:34

Добавлена функция polygon.

Теперь можно рисовать вот такие пентаграммы

g.setColor(0xff0000)
g.circle(80,50,44)
g.polygon(80,93, 54,16, 120,64, 40,64, 106,16, 0xffff00)

Прикрепленный файл  penta.png   4,19К   3 Количество загрузок:



#6 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 22 Февраль 2016 - 18:57

Добавлены функции 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)

Прикрепленный файл  alpha.png   11,96К   2 Количество загрузок:

 

онлайн PNG-редактор


Сообщение отредактировал Zer0Galaxy: 22 Февраль 2016 - 19:12


#7 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 02 Март 2016 - 19:14

Добавлена возможность масштабирования при выводе 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

Прикрепленный файл  2016-03-02_12.06.05.png   13,08К   2 Количество загрузок:



#8 Оффлайн   TC1061

TC1061
  • Пользователи
  • Сообщений: 39
  • Уровень сигнала: 7,3%
  • В игре: 59 час. 28 мин.

Отправлено 13 Апрель 2017 - 12:42

как ты сделал пиксели в ползнака?



#9 Оффлайн   TC1061

TC1061
  • Пользователи
  • Сообщений: 39
  • Уровень сигнала: 7,3%
  • В игре: 59 час. 28 мин.

Отправлено 13 Апрель 2017 - 12:49

ой стоп я понял. Ты используешь знак который помещается на половинку пикселя OC и выбираешь background и foreground и делаешь чето там


  • Totoro это нравится

#10 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 13 Апрель 2017 - 13:22

Угу. А еще есть Шрифт Брайля. С ним пиксель еще меньше получается, вот только с цветом проблемы.



#11 Оффлайн   ALeXeR

ALeXeR
  • Пользователи
  • Сообщений: 204
  • Уровень сигнала: 31,41%
  • В игре: 255 час. 59 мин.
  • ГородОдесса

Отправлено 14 Апрель 2017 - 09:33

вот чего я не видал в подобных библиотеках - так это логическое совмещение полусимвола (Шрифт Брайля) и обычного текста, в одних можно выводить брайлем, в других текстом но саморучно туда символы Брайля пихать, а вот бы какое-то логическое апи) моя либа как бы вроде должна была иметь такую реализацию, но загнулась в конец, ибо меня грузят в вузе)



#12 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 740
  • Уровень сигнала: 0,27%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 14 Апрель 2017 - 11:58

Надо взять все крутые идеи и сплавить в одну Ultimate Graphical Library (сокращённо UGLY).



#13 Оффлайн   TC1061

TC1061
  • Пользователи
  • Сообщений: 39
  • Уровень сигнала: 7,3%
  • В игре: 59 час. 28 мин.

Отправлено 18 Август 2017 - 19:13

Надо взять все крутые идеи и сплавить в одну Ultimate Graphical Library (сокращённо UGLY).

Это сэкономит всем время. Классная идея.



#14 Оффлайн   utevaugu36

utevaugu36
  • Пользователи
  • Сообщений: 12
  • Уровень сигнала: 1,43%
  • В игре: 11 час. 39 мин.

Награды

        

Отправлено 12 Март 2018 - 22:51

Крутая либа! Буду использовать в своих проектах :) *Оч мало софта, который мне прям нравится, эта либа - одна из этого софта.

----------------------------------------------

Есть предложение. Я, помню, писал для своей 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)


#15 Оффлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 760
  • Уровень сигнала: 4,47%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 12 Март 2018 - 23:42

...

А почему нельзя было залить картинку на imgur? 

Теперь она рипнулась.






Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных