Поиск по сайту
Результаты поиска по тегам 'графика'.
Найдено 10 результатов
-
Я хочу узнать как написать липовую графическую загрузку с текстом "Сканирование" И вывести её на мониторы высотой 2-мя блоками, длинной 3-мя блоками Ps. Версия 1.19.2, мод CC Tweaced
-
- графика
- cc tweaced
-
(и ещё 1 )
Теги:
-
Программа умеет получать картинки по ссылке и отрисовывать их в OpenComputers. Поддерживается примитивный даунскейлинг. wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/images-drawer/draw-random-img.lua Работа всё ещё в процессе. На данный момент: 1. Проверяю на работу только GIF. 2. Некоторые GIF некорректно парсятся по вине библиотеки. 3. К библиотеке GIF нужен патч, чтобы хоть какие-то гифки показывались. wget -fq https://gist.githubusercontent.com/ProgramCrafter/d1b279aec9e473794df115d1301dcb27/raw/8166f23ee3daba8ca8ec305589b3d9a258f6674f/gif.lua /usr/lib/gif.lua 4. Даунскейлинг примитивный: если картинку надо уменьшить, то из каждого квадрата 2x2 пикселя выбирается левый верхний. 5. Требования: тир3 GPU и монитор, интернет-карта, 6 планок тир3,5 памяти. Используемые библиотеки: Зато результат неплохой:
- 11 ответов
-
- 2
-
- work in progress
- png
-
(и ещё 3 )
Теги:
-
Хочу поделиться с вами конвертером изображений, позволяющим использовать ограниченное пространство мониторов наиболее эффективным образом, а также библиотеками для быстрой отрисовки результата. Поддержка шрифта Брайля позволяет получать изображения размером до 320х200 визуальных точек при физическом ограничении мониторов в 160х50 символов, а алгоритм дизеринга помогает избавиться от визуальных ограничений 256-цветной палитры. Ссылка для загрузки конвертера: https://github.com/IgorTimofeev/OCIFImageConverter/raw/master/out/artifacts/ImageConverter_jar/ImageConverter.jar Команда для установки ПО для отрисовки: pastebin run ng73uZqT Практический пример: Чтобы отобразить картинку на экране, для начала ее необходимо сконвертировать и скопировать любым удобным образом на диск комьютера (напрямую в папку мира, через файловый хостинг и т.п.). В моем случае картинка называется Triss.pic: Затем напишем следующий код или запустим установившуюся программу draw.lua с аргументом "Triss.pic": local args = {...} local image = require("image") local buffer = require("doubleBuffering") -- Очищаем экранный буфер черным цветом buffer.clear(0x0) -- Загружаем и рисуем изображение в буфер buffer.image(1, 1, image.load(args[1])) -- Отрисовываем содержимое буфера в принудительном режиме buffer.draw(true)Результат не заставит себя ждать: Также привожу в качестве демонстрации несколько отрисованных изображений:
- 17 ответов
-
- 21
-
Всем известно, что видеокарты в OpenComputers, мягко говоря, не торт. Чем больше вы обращаетесь к ее методам, будь то установка цвета или символа, тем больше ваш компьютер будет тормозить при отрисовке. Поэтому ко мне пришла идея реализовать так называемую двойную буферизацию, а также несколько алгоритмов ускорения местных GPU. Подробная иллюстрированная документация, описание структуры, способы установки и несколько практических примеров доступны по ссылке: https://github.com/IgorTimofeev/DoubleBuffering
- 36 ответов
-
- 20
-
- Интерфейс
- Буферизация
- (и ещё 4 )
-
Добрый день, надеюсь не забыли обо мне! А я пришёл вам новую программу показать Давайте разбираться... Пример работы: симуляция магнитного поля между двумя полюсами Описание: Программа написана на языке программирования lua и работает на движке love2d Визуализация использует GLSL шейдеры версии 3 Для хранения работ используются отдельные файлы с шейдерами, чтобы не трогать весь код программы Кнопки внизу экрана скрываются до наведения на них мышкой Кнопки хранятся как объект со своими функциями и свойствами внутри. И вкладываются в массив инструментария Пример работы: волны искажений Возможности: Навигация и/или зуммирование на колесо мыши Несколько типов анимации. (на кнопку включается анимация движения волн, остальные типы пишутся в шейдерах) Сохранение кадра Сохранение анимации Настройка "шага волны" и скорости течения времени кнопками (обязательно необходимо для построения кадра) Видеообзор: Готовые gif анимации: Рисунок электромагнитных полей: Волновые искажения: Цветные иллюзии: Иллюзия в том, что кружков (кроме двойного) нет. На этих участках случайно совпадают цвета Прочее: Обычные рисунки: Эксперименты над волнами: История версий: Кто-то тут может сказать: "а где ссылка на программу?" А её и не будет пока не реализую нормальную систему сохранений. Почему тогда я выкладываю недоработку? Потому что мне нужно рассказать о проекте для резюме. Это моя лучшая программа и я её люблю. Оттягивать нет смысла, первая версия разрабатывалась ещё полтора года назад. А значит до релиза четвёртой ждать ещё неизвестно сколько. Так что спасибо за внимание! Если вдруг кому-то тема визуализации так же интересна как и мне - пишите в ЛС. Было бы интересно обсудить.
- 8 ответов
-
- 3
-
- математика
- графика
-
(и ещё 3 )
Теги:
-
По этой теме уже существует отлаженный софт, успешно используемый многими игроками. Однако на днях я заметил забавную особенность местных видеокарт, позволяющую выставлять разрешение большее, нежели получаемое через gpu.maxResolution(). К примеру, если maxResolution для видеокарты третьего уровня вернет числа 160 и 50, то никто не мешает установить разрешение, скажем, в 20x158 пикселей. При этом при проверке валидности устанавливаемого разрешения соблюдается два правила: Результирующее разрешение по числу пикселей не должно превышать результат умножения чисел, возвращаемых maxResolution. То есть для T3 GPU не более 160 * 50 = 8000. Каждый параметр разрешения, будь то ширина или высота, не должен численно превышать значение возвращаемой ширины. То есть для T3 GPU не более 160. Не знаю, баг это или фича, однако подобное грех не использовать в своих целях. К примеру, старая версия программы при вертикально-удлиненном расположении мониторов позволяла выставить разрешение лишь в 30х50 (1500 пикселей в итоге), заполняя тем самым "черные полосы". В то же время обновленная софтина, учитывающая описанные выше особенности, выдает 69x114 (7866 пикселей), максимально приближаясь к предельной отметке в 8000: Согласитесь, лишние пиксели на дороге не валяются, и, думаю, кому-то будет интересно узнать про реализацию подобного софта. Прежде всего нам требуется определить точную пропорцию мультиблочного монитора: то, как относится его ширина к высоте. Взглянем на текстуру блока: она явно состоит из мелких "квадратиков" в количестве 16 штук, причем лицевая часть монитора имеет рамку толщиной в 2 "квадратика" с каждой стороны: Эти "квадратики" мы и будем использовать для расчета пропорции, так как они позволяют идеально точно получить размеры отображающей части монитора в игровом мире. А размеры "в квадратиках" можно посчитать по формуле: число_блоков_монитора * 16 - 4 Следовательно, пропорция монитора будет считается следующим образом: local gpu = component.gpu local screen = component.proxy(gpu.getScreen()) local blockCountByWidth, blockCountByHeight = component.screen.getAspectRatio() local proportion = (blockCountByWidth * 16 - 4) / (blockCountByHeight * 16 - 4) Также не забываем, что высота каждого псевдографического пикселя при отображении в 2 раза больше его ширины, поэтому формула пропорции слегка меняется. Заодно произведем некоторые сокращения, чтобы избавиться от лишних математических операций. Все три варианта эквивалентны: local proportion = 2 * (blockCountByWidth * 16 - 4) / (blockCountByHeight * 16 - 4) local proportion = (blockCountByWidth * 16 - 4) / (blockCountByHeight * 8 - 2) local proportion = (blockCountByWidth * 2 - 0.5) / (blockCountByHeight - 0.25) После вычисления пропорции монитора можно приступить к написанию программной логики. Для начала получим максимальное разрешение видеокарты: local maxWidth, maxHeight = gpu.maxResolution() Обладая этими данными, а также взглянув на условия, описанные в начале поста, мы можем составить систему неравенств для получения итогового идеального разрешения: Помним также, что ширину мы вполне можем выразить через высоту и пропорцию монитора: width = proportion * height Подставим этот вариант в систему: Оставим высоту в левой части неравенств: Подставляем имеющиеся переменные в каждое неравенство, рисуем числовую прямую и выбираем высоту, удовлетворяющую условиям неравенства для конкретного случая. Разумеется, в программировании никаких числовых прямых нет, зато есть любимые math.min() и math.max(): local height = math.min( maxWidth / proportion, maxWidth, math.sqrt(maxWidth * maxHeight / proportion) ) -- Выражаем ширину через пропорцию local width = height * proportion Все. Разумеется, полученные значения ширины и высоты нужно округлить в меньшую сторону, дабы не кормить видеокарту дробями. Заодно добавим поддержку масштабирования, чтобы выставлять половинное или, скажем, четвертичное от идеального разрешение. Сократив код, избавившись от лишних переменных, мы получаем следующее: local component = require("component") -- Получаем масштаб в качестве первого аргумента скрипта и корректируем его значение local scale = tonumber(select(1, ...) or 1) if not scale or scale > 1 then scale = 1 elseif scale < 0.1 then scale = 0.1 end local gpu = component.gpu local blockCountByWidth, blockCountByHeight = component.proxy(gpu.getScreen()).getAspectRatio() local maxWidth, maxHeight = gpu.maxResolution() local proportion = (blockCountByWidth * 2 - 0.5) / (blockCountByHeight - 0.25) local height = scale * math.min( maxWidth / proportion, maxWidth, math.sqrt(maxWidth * maxHeight / proportion) ) -- Выставляем полученное разрешение gpu.setResolution(math.floor(height * proportion), math.floor(height)) Надеюсь, это микро-знание кому-то было полезно. Лично я очень доволен, что могу наконец запилить графонистый интерфейс для контроля реакторов на вертикальных мониках без осваивания профессии "глиномес", да и соответствующая либа для автопобора разрешения в оське пригодится.
-
Небольшая библиотека, которая иллюстрирует один из вариантов рисования графики. Плюсы: * Каждое знакоместо содержит 8 пикселей - 2х4. * Удобно рисовать инфографику даже на монохромном дисплее Минусы: * Не очень подходит для многоцветного изображения * Горизонтальные полосы через каждые четыре ряда пикселей pastebin get 5FzEuqs8 braille.lua Как вы уже наверное догадались, я использовал символы шрифта Брайля. Библиотека (скорее набросок библиотеки - расширение, всяческое допиливание и улучшение приветствуется!) поддерживает следующие операции: braille.matrix(width: number, height: number): table - создаем матрицу braille.set(matrix: table, x: number, y: number, value: number) - рисуем пиксель на матрице (1 - заполнен, 0 - пуст) braille.get(matrix: table, x: number, y: number): number - получаем пиксель braille.line(matrix: table, x1: number, y1: number, x2: number, y2: number, value: number): table - рисуем линию на матрице braille.clear(matrix: table) - чистим матрицу braille.render(matrix: table, x: number, y: number) - рисуем матрицу на экране Пример: local gpu = require('component').gpu local br = require('braille') function frame(x, y, width, height) gpu.set(x, y, '╒'..string.rep('═', width-2)..'╕') for dy = y + 1, y + height-1 do gpu.set(x, dy, '│'..string.rep(' ', width-2)..'│') end gpu.set(x, y+height, '╘'..string.rep('═', width-2)..'╛') end local matrix = br.matrix(96, 12) for x = 1, matrix.width do br.line(matrix, x, math.random(1, matrix.height), x, matrix.height) end frame(1, 1, 50, 4) gpu.setForeground(0x000000) gpu.setBackground(0xFFFFFF) br.render(matrix, 2, 2) gpu.setForeground(0xFFFFFF) gpu.setBackground(0x000000) frame(1, 6, 50, 4) br.clear(matrix) for x = 1, matrix.width do br.line(matrix, x, math.random(1, matrix.height), x, matrix.height) end br.render(matrix, 2, 7) function romb(x, y, size) br.line(matrix, x, y, x+size, y+size) br.line(matrix, x+size, y+size, x, y+size*2) br.line(matrix, x, y+size*2, x-size, y+size) br.line(matrix, x-size, y+size, x, y) end frame(1, 11, 50, 4) br.clear(matrix) romb(21,1,5); romb(36,1,5); romb(51,1,5); romb(66,1,5) br.render(matrix, 2, 12)
-
Добрый день, игроки. Игра Cube, практически портирована с OpenOS на полноценный движок love2d. Осталось лишь генерацию комнат прикрутить и будет готова. Далее можно будет заниматься созданием предметов и прочего дополнительного материала. Вот вам для сравнения скрины игры на OpenOS и на love2d: Нововведения: Игра с плавным управлением (уже нет той пошаговости и пиксельности Возможность бега зажатием шифта Двери которые открываются на кнопку E (они со всех 4 сторон есть, но отрисовку для теста сделал только у верхней - фиолетового цвета) Гибкие настройки, такие как: ширина стен комнат, ширина прохода, размер комнат, скорость игрока, ускорение при беге и прочие переменные. То есть в случае чего можно легко настроить под себя игру. Скажу по секрету. Возможно даже будет в будущем когда нибудь добавлена прицельная стрельба мышкой и вражеские ИИ. Движок позволяет многое. И не смотрите на то что все соседние комнаты отображаются одновременно. Так происходит пока я не внедрил генерацию мира. Есть идеи по улучшению игры - пишите в комментарии. А с вами был qwertyMAN, удачи в программировании.
-
- 2
-
- программирование
- lua
- (и ещё 5 )
-
Хочу представить вам большую библиотеку, предназначенную для работы с изображениями, созданными в нашем Фотошопе. С ее помощью можно манипулировать графикой воистину волшебным образом: изображения можно обрезать, расширять, поворачивать, отражать, инвертировать, изменять их яркость, цветовой тон, насыщенность и добавлять фотофильтры. Разрабатывали мы ее примерно год, содержит она более 1000 строк кода и удовлетворяет практически всем наши требованиям к хорошей графике в OpenComputers, если, конечно, местную графику вообще можно назвать хорошей. Начало работы Прежде всего вам потребуются два файла. Первый обеспечивает основные операции над цветом, позволяет конвертировать цвета из одной схемы в другую, а также сжимать цвета без потери качества. Второй же является самой библиотекой image и дает нам полную свободу творчества. wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/colorlib.lua lib/colorlib.lua -f wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/image.lua lib/image.lua -f После загрузки библиотек вы можете подключить image и начинать с ней работать. Далее мы рассмотрим различные методы, с помощью которых мы сможем манипулировать изображениями. Под описанием каждого метода будет картинка и код, демонстрирующие суть работы метода, так что проблем с пониманием возникнуть не должно. local image = require("image") Структура изображений (для общего развития) Методы работы с файлами изображений (загрузка, отрисовка, сохранение) Методы трансформирования изображений (вращение, отражение, обрезание и т.п.) Методы работы с цветом (яркость, насыщенность, тон и т.п.)
-
Итак граждане. Последний стабильный билд геокопалки меня радует, находится сейчас на тестировании, багов пока не обнаружено. Пришло время для нового этапа(с которого по уму следовало бы начинать!) - создание сетевых функций, для вайфы и наверно параллельно для линки тоже. Задача минимум - стабильная передача статов робота по запросу: координаты, основные состояния(топливо, инструмент, процент выполнения текущей задачи). Программа максимум: Автоматизированный сетевой обмен робота со станцией, передача вышеперечисленных величин, возможность "нажать красную кнопку"(остановить робота и вернуть на базу), графическое приложение для планшета(в том числе 2д макет выполняемой задачи, например отрисовка слоя(этажа) руд, в которых оперирует робот, его положение на этой "схемокарте", указание последовательности пути(для анализа)), графическое приложение для рабочей станции(комп с голографическим проектором), функции схожи с планшетной версией, но в 3д, возможность дистанционного управления(указать новое место и запустить нужную программу). На данный момент в сетевых технологиях ОС я довольно таки нуб. Но что успел понять, если робот что то делает(именно робот, аки robot.forward()), то прервать(безопасно) его действие с помощью эвента получения сообщений и не сбить при этом весь алгоритм/функцию(а они у меня многоэтажные) не получится. Нужно действовать апосредованно, не трогая функции использующие пространство имен "robot", тоесть поменять какую то глобальную переменную, проверив которую робот задействует новые алгоритмы. Так ли это? или же существует возможность вмешаться безопасным образом?