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


Фотография

Ломанная в движении. Иллюзия 3D


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

#1 Оффлайн   Appo

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

Награды

           

Отправлено 05 Сентябрь 2017 - 09:39

Можно использовать как заставку :)

Установка:
 pastebin run U0pK04Rp

Код:

Спойлер


p.s.
  Посоветуйте пожалуйста, как избавится от мерцание при отрисовке линий, когда их более 4. Пробывал эти же пиксели замазывать, но так только хуже, term.clear() решает.
  А так же, как реализовать пиксели в пол символа? Если не трудно, скиньте пожалуйста код где это реализовано что бы можно было понять как это работает, заранее спасибо)


Сообщение отредактировал Appo: 09 Сентябрь 2017 - 21:26


#2 Оффлайн   Doob

Doob
  • Пользователи
  • Сообщений: 814
  • Уровень сигнала: 17,94%
  • В игре: 146 час. 10 мин.

Награды

                                   

Отправлено 05 Сентябрь 2017 - 09:52

А какая причина мерцания? Я не заметил.

Таблица.

Полусимвол 0x2580, набор точек 4x2 0x2802 - 0x28FF

Пример


Сообщение отредактировал Doob: 05 Сентябрь 2017 - 09:53


#3 Оффлайн   Zer0Galaxy

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

Награды

   5                              

Отправлено 05 Сентябрь 2017 - 10:13

А вот мой пример

И делай, пожалуйста, выход из программы по нажатию какой либо клавиши. 



#4 Оффлайн   Appo

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

Награды

           

Отправлено 05 Сентябрь 2017 - 10:24

А какая причина мерцания? Я не заметил.


Переменную size в первой строке программы измените на большее 4, тогда начнется мерцание некоторых линий..

 

 

 

И делай, пожалуйста, выход из программы по нажатию какой либо клавиши. 

Окей, сделаю на Esc

-------

Спасибо за примеры :)



#5 Оффлайн   Totoro

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

Награды

                                      

Отправлено 05 Сентябрь 2017 - 10:51

А ещё к таким программам очень хорошо бы прикладывать скрины.  :)


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

#6 Оффлайн   ECS

ECS
  • Гуру
  • Сообщений: 204
  • Уровень сигнала: 0,51%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 05 Сентябрь 2017 - 15:08

Годная софтинка. Пожалуй, стырю в качестве скринсейвера, если не против. Есть, правда, парочка деликатных моментов: во-первых, отрисовка линий через 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 линий за раз. Также она уже имеет функции растеризации отрезков, в том числе полупиксельных:
 
FLMot0V.png?1


Сообщение отредактировал ECS: 05 Сентябрь 2017 - 15:21

  • Totoro, Sharplook, eu_tomat и 2 другим это нравится

#7 Оффлайн   Appo

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

Награды

           

Отправлено 05 Сентябрь 2017 - 17:24

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


Не нашел в интернете алгоритм Питера Ширли, да и его в целом, выскакивает какой-то музыкант) Можно узнать где вы нашли его алгоритм? Хотя бы ссылку или книгу, может у него и другие эффективные алгоритмы есть.

Спасибо за советы, приму к сведению и постараюсь применить их в новой версии кода :)

#8 Оффлайн   ECS

ECS
  • Гуру
  • Сообщений: 204
  • Уровень сигнала: 0,51%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 05 Сентябрь 2017 - 18:05

Не нашел в интернете алгоритм Питера Ширли, да и его в целом, выскакивает какой-то музыкант) Можно узнать где вы нашли его алгоритм? Хотя бы ссылку или книгу, может у него и другие эффективные алгоритмы есть.

Спасибо за советы, приму к сведению и постараюсь применить их в новой версии кода :)

 

Книга "Fundamentals of Computer Graphics", хоть она и не очень: есть пара интересных алгоритмов по быстрой растеризации примитивов, но именно что лишь пара. Да и те пришлось изрядно оптимизировать, чтобы GC не грузили.


  • eu_tomat и Appo это нравится




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

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