Appo 86 Опубликовано: 5 сентября, 2017 (изменено) Можно использовать как заставку Установка: pastebin run U0pK04RpКод: local size = 4 -- Больше 4 начинается мерцание некоторых линий local x0,y0 = 160,50 local component = require("component") local gpu = component.gpu local term = require('term') function line(x1,y1,x2,y2) x= x1 y= y1 for i = 1 , math.floor( ( (x2-x1 )^2+( y1-y2 )^2)^0.5) do gpu.set(math.floor(x),math.floor(y),'█') rad = math.atan2(y1-y2,x2-x1) x = x + math.cos(rad) y = y - math.sin(rad) end end local t = {} function rnd() if math.random(0,1) == 0 then return -1 else return 1 end end for i = 1, size do t[i] = {['x'] = math.random(1,120),['y'] = math.random(1,50),['dx'] = rnd(),['dy'] = rnd()} end term.clear() while true do for i = 1, size do t[i].x = t[i].x + t[i].dx t[i].y = t[i].y + t[i].dy if t[i].x > x0 then t[i].dx = -1 end if t[i].y > y0 then t[i].dy = -1 end if t[i].x < 1 then t[i].dx = 1 end if t[i].y < 1 then t[i].dy = 1 end end for i = 1, size-1 do line(t[i].x,t[i].y,t[i+1].x,t[i+1].y) end line(t[1].x,t[1].y,t[size].x,t[size].y) os.sleep(0.001) term.clear() end p.s. Посоветуйте пожалуйста, как избавится от мерцание при отрисовке линий, когда их более 4. Пробывал эти же пиксели замазывать, но так только хуже, term.clear() решает. А так же, как реализовать пиксели в пол символа? Если не трудно, скиньте пожалуйста код где это реализовано что бы можно было понять как это работает, заранее спасибо) Изменено 9 сентября, 2017 пользователем Appo 6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 5 сентября, 2017 (изменено) А какая причина мерцания? Я не заметил. Таблица. Полусимвол 0x2580, набор точек 4x2 0x2802 - 0x28FF Пример Изменено 5 сентября, 2017 пользователем Doob Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 5 сентября, 2017 А вот мой пример И делай, пожалуйста, выход из программы по нажатию какой либо клавиши. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Appo Автор темы 86 Опубликовано: 5 сентября, 2017 А какая причина мерцания? Я не заметил. Переменную size в первой строке программы измените на большее 4, тогда начнется мерцание некоторых линий.. И делай, пожалуйста, выход из программы по нажатию какой либо клавиши. Окей, сделаю на Esc ------- Спасибо за примеры Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 5 сентября, 2017 А ещё к таким программам очень хорошо бы прикладывать скрины. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 5 сентября, 2017 (изменено) Годная софтинка. Пожалуй, стырю в качестве скринсейвера, если не против. Есть, правда, парочка деликатных моментов: во-первых, отрисовка линий через atan/sin/cos хоть и проста, но крайне неэффективна. Рекомендую использовать следующий код, основанный на модифицированном алгоритме Питера Ширли и предназначенный специально для низкопроизводительных машин (значительно быстрее, чем классический алгоритм Брезенхема): local function line(x1, y1, x2, y2, color) local inLoopValueFrom, inLoopValueTo, outLoopValueFrom, outLoopValueTo, isReversed, inLoopValueDelta, outLoopValueDelta = x1, x2, y1, y2, false, math.abs(x2 - x1), math.abs(y2 - y1) if inLoopValueDelta < outLoopValueDelta then inLoopValueFrom, inLoopValueTo, outLoopValueFrom, outLoopValueTo, isReversed, inLoopValueDelta, outLoopValueDelta = y1, y2, x1, x2, true, outLoopValueDelta, inLoopValueDelta end if outLoopValueFrom > outLoopValueTo then outLoopValueFrom, outLoopValueTo = outLoopValueTo, outLoopValueFrom inLoopValueFrom, inLoopValueTo = inLoopValueTo, inLoopValueFrom end local outLoopValue, outLoopValueCounter, outLoopValueTriggerIncrement = outLoopValueFrom, 1, inLoopValueDelta / outLoopValueDelta local outLoopValueTrigger = outLoopValueTriggerIncrement for inLoopValue = inLoopValueFrom, inLoopValueTo, inLoopValueFrom < inLoopValueTo and 1 or -1 do if isReversed then -- setPixel(outLoopValue, inLoopValue, color) else -- setPixel(inLoopValue, outLoopValue, color) end outLoopValueCounter = outLoopValueCounter + 1 if outLoopValueCounter > outLoopValueTrigger then outLoopValue, outLoopValueTrigger = outLoopValue + 1, outLoopValueTrigger + outLoopValueTriggerIncrement end end end Во-вторых, я бы использовал либу буферизации графики, чтобы не было "промигиваний", и была возможность выставлять хоть 50 линий за раз. Также она уже имеет функции растеризации отрезков, в том числе полупиксельных: Изменено 5 сентября, 2017 пользователем ECS 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Appo Автор темы 86 Опубликовано: 5 сентября, 2017 Рекомендую использовать следующий код, основанный на модифицированном алгоритме Питера Ширли и предназначенный специально для низкопроизводительных машин (значительно быстрее, чем классический алгоритм Брезенхема): Не нашел в интернете алгоритм Питера Ширли, да и его в целом, выскакивает какой-то музыкант) Можно узнать где вы нашли его алгоритм? Хотя бы ссылку или книгу, может у него и другие эффективные алгоритмы есть. Спасибо за советы, приму к сведению и постараюсь применить их в новой версии кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 5 сентября, 2017 Не нашел в интернете алгоритм Питера Ширли, да и его в целом, выскакивает какой-то музыкант) Можно узнать где вы нашли его алгоритм? Хотя бы ссылку или книгу, может у него и другие эффективные алгоритмы есть. Спасибо за советы, приму к сведению и постараюсь применить их в новой версии кода Книга "Fundamentals of Computer Graphics", хоть она и не очень: есть пара интересных алгоритмов по быстрой растеризации примитивов, но именно что лишь пара. Да и те пришлось изрядно оптимизировать, чтобы GC не грузили. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах