Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet
13 янв 2025 Пн
Насколько много необходимо вычислений для рендера простой сцены...
Сейчас вот писал статью по определению расстояния от точки до плоскости (на самом деле это очень простая формула, но выводить ее муторно) и думал, насколько сложно сделать так, чтобы нарисовать хотя бы раз, пусть даже это займет много времени, но простую сцену?
Конечно, если рассчитывать все "в лоб", то займет это прилично времени, для любого процессора с любыми вычислительными возможностями. Но а если не пытаться рисовать так, а как-то может, оптимизировать? К примеру, рисовать только те треугольники, которые видать на сцене, это первое. Второе, рисовать последовательно, а не вычисляя сцену по тысячу раз.
Для статического кадра, хотя, для любого кадра, можно сначала рассчитать параметры треугольников, которые будут позже использоваться для рендера и записать их куда-нибудь в память. Если к примеру, рисуем 1000 треугольников, то для того чтобы нарисовать сцену из 640 на 400, надо будет 256 млн вычислений. На деле, это не настолько уж много для современных процессоров и такое дело можно рассчитать на 32 ядрах с использованием SIMD за доли секунды. Но, однако, скорость все равно недостаточная, потому что 1000 треугольников это реально ни о чем же. Речь может идти о миллионах треугольников на сцене! Какие там 1000... И тогда считать будет намного дольше. Нужна определенная оптимизация.
Как это сделать? Наверняка, нет необходимости обсчитывать абсолютно все треугольники подряд, можно определить с какого момента начинается треугольник и только тогда его начинать рисовать.
С другой стороны, я бы хотел для начала, вообще просто через wireframe графику, просто проверить, а насколько много мне потребуется треугольников, вообще? Я ведь даже не пытался что-либо рисовать даже через wireframe, а почему бы не попробовать хоть раз это сделать.
Конечно, если рассчитывать все "в лоб", то займет это прилично времени, для любого процессора с любыми вычислительными возможностями. Но а если не пытаться рисовать так, а как-то может, оптимизировать? К примеру, рисовать только те треугольники, которые видать на сцене, это первое. Второе, рисовать последовательно, а не вычисляя сцену по тысячу раз.
Для статического кадра, хотя, для любого кадра, можно сначала рассчитать параметры треугольников, которые будут позже использоваться для рендера и записать их куда-нибудь в память. Если к примеру, рисуем 1000 треугольников, то для того чтобы нарисовать сцену из 640 на 400, надо будет 256 млн вычислений. На деле, это не настолько уж много для современных процессоров и такое дело можно рассчитать на 32 ядрах с использованием SIMD за доли секунды. Но, однако, скорость все равно недостаточная, потому что 1000 треугольников это реально ни о чем же. Речь может идти о миллионах треугольников на сцене! Какие там 1000... И тогда считать будет намного дольше. Нужна определенная оптимизация.
Как это сделать? Наверняка, нет необходимости обсчитывать абсолютно все треугольники подряд, можно определить с какого момента начинается треугольник и только тогда его начинать рисовать.
С другой стороны, я бы хотел для начала, вообще просто через wireframe графику, просто проверить, а насколько много мне потребуется треугольников, вообще? Я ведь даже не пытался что-либо рисовать даже через wireframe, а почему бы не попробовать хоть раз это сделать.
12 янв 2025 Вс
Точка пересечения прямых
Я заметил, что пользуюсь некоторыми формулами графики, и причем очень часто. Эти формулы такого рода.
Я уже далеко не раз выводил эту формулу, но повторить не помешает. Есть две линии, отрезка, прямые, вектора, тут уж как угодно можно их называть, я уже в терминологии запутался. У каждого отрезка есть точка начала и точка конца. Итого, отрезок с началом в
Параметрическое уравнение прямой для каждого отрезка будет представлять собой вот такие вот формулы.
Итого, система линейных уравнений:
Чтобы найти точку пересечения, надо вычислить:
- Пересечение двух прямых
- Пересечение прямых с плоскостью
- Определение стороны, где лежит точка по отношению к прямой или плоскости
INTERSECT_STRAIGHT_2D
или INTERSECT_STRAIGHT_PLANE
. Только они как-то длинно звучат. Можно придумать покороче например ISTR2D
или ISTR3D
. Еще можно искать пересечения двух плоскостей, только это уже как-то посложнее и что-то я ни разу не делал этого, не потребовалось.Я уже далеко не раз выводил эту формулу, но повторить не помешает. Есть две линии, отрезка, прямые, вектора, тут уж как угодно можно их называть, я уже в терминологии запутался. У каждого отрезка есть точка начала и точка конца. Итого, отрезок с началом в
a
и концом в точке b
будет отрезком ab
. Это один отрезок. А есть второй, который назовём отрезком cd
.Параметрическое уравнение прямой для каждого отрезка будет представлять собой вот такие вот формулы.
# Уравнение прямой ab x = a.x + u*(b.x - a.x) y = a.y + u*(b.y - a.y) # Уравнение прямой cd x = c.x + v*(d.x - c.x) y = c.y + v*(d.y - c.y)Чтобы найти точку пересечения, надо приравнять эти две формулы между собой, и найти один из корней уравнения (
u
или v
). Какой из них — не имеет значения, они все равно будут пересекаться в одной точке. Либо не пересекаться, это тоже не стоит забывать. Если прямые нигде не пересекаются, то это значит, что они параллельны.Итого, система линейных уравнений:
u*(b.x-a.x) - v*(d.x-c.x) = c.x-a.x u*(b.y-a.y) - v*(d.y-c.y) = c.y-a.yСначала, отыскиваем детерминант:
D = (d.x-c.x)*(b.y-a.y) - (b.x-a.x)*(d.y-c.y)И если он равен 0, это указывает на то, что прямые параллельны и дальше считать ничего не надо. Они не пересекаются, и это факт. Если же D не равен нулю, то тогда найдем пересечения.
u = (d.x-c.x)*(c.y-a.y) - (c.x-a.x)*(d.y-c.y) ' Прямая АB v = (b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y) ' Прямая CDКак я и говорил, чтобы понять, где именно пересекаются прямые, достаточно лишь одной компоненты. Однако, если мы говорим об отрезках, то важно, чтобы
u
, v
были не меньше чем 0 и не больше чем D
. Если они не попадают в данный диапазон, то сами по себе отрезки не пересекаются между собой.Чтобы найти точку пересечения, надо вычислить:
x = a.x + u*(b.x - a.x) y = a.y + u*(b.y - a.y)Или
x = c.x + v*(d.x - c.x) y = c.y + v*(d.y - c.y)Это был разговор про точки пересечения. Теперь бы создать какую-нибудь функцию на Quick Basic 4.5, чтобы ее постоянно переиспользовать в дальнейшем.
screen 13 ' Объявление точек type p2: x as single: y as single: end type dim a as p2, b as p2, c as p2, d as p2 a.x = 50: a.y = 30: b.x = 100: b.y = 120 c.x = 30: c.y = 80: d.x = 120: d.y = 20 ' Нарисовать линии line (a.x, a.y)-(b.x, b.y),2 line (c.x, c.y)-(d.x, d.y),10 ' Найти точку пересечения и поставить ее u = istr2d(a,b,c,d) x = a.x + u*(b.x-a.x) y = a.y + u*(b.y-a.y) pset (x,y),12 ' Функция вычисления точки пересечения function istr2d(a as p2, b as p2, c as p2, d as p2) ax = b.x-a.x: ay = b.y-a.y: acx = c.x-a.x cx = d.x-c.x: cy = d.y-c.y: acy = c.y-a.y dt = cx*ay - ax*cy u = cx*acy - acx*cy v = ax*acy - acx*ay if dt <> 0 then istr2d = u / dt else istr2d = 0 end function
10 янв 2025 Пт
Что-нибудь, помимо куба
Мне кажется, я с кубами совсем застрял в этом пространстве жизни. Почему бы мне не сделать что-то другое, кроме куба? Сколько не делаю, все время делаю только куб и ничего больше. А что я еще могу сделать и как? У меня нет идей по этому поводу. Передо мной много объектов, которые можно было бы сделать, но ничего не делаю. Надо бы с чего-то начать, а может даже, с редактора трехмерных объектов, чтобы можно было реально, сделать уже что-то.
Надо бы написать программу, которая бы рендерила бы трехмерные изображения, отсекая невидимые линии от граней. Думаю, надо сделать эту программму сначала именно в JS, а потом уже написать статьи на сайте об этом.
Надо бы написать программу, которая бы рендерила бы трехмерные изображения, отсекая невидимые линии от граней. Думаю, надо сделать эту программму сначала именно в JS, а потом уже написать статьи на сайте об этом.
07 янв 2025 Вт
Парсер выражений не очень то хорош
Да, на первый раз, он допустим, но при усложнении программы, такой парсер выражений совершенно никуда не годится, а это является основой основ для любого языка программирования, в том числе, Бейсика. Сейчас сделано очень примитивно, обычная интерпретация выражений, но надо придумать как сделать правильно. Это значит, что перед тем как строку перевести в интерпретируемый вид, необходимо построить правила ее вычисления. К примеру
Вычисляем сначала B*C, потом складываем A + полученный результат вычислений. Потом вычисляем D*E, складываем с предыдущим результатом. Вообще, получается стековая машина.
Сначала рассчитывается B*C, потом D*E, после расчета, полученные узлы складываются (всего их 3). Но можно реализовать эту логику по-разному. То есть сначала рассчитать B*C, сложить A и полученный результат. Потом вычислить D*E, и сложить с предыдущим результатом.
Займусь лучше доработкой по ZX Spectrum Бейсику.

X = A + B*C + D*E
Вычисляем сначала B*C, потом складываем A + полученный результат вычислений. Потом вычисляем D*E, складываем с предыдущим результатом. Вообще, получается стековая машина.
Сначала рассчитывается B*C, потом D*E, после расчета, полученные узлы складываются (всего их 3). Но можно реализовать эту логику по-разному. То есть сначала рассчитать B*C, сложить A и полученный результат. Потом вычислить D*E, и сложить с предыдущим результатом.
Займусь лучше доработкой по ZX Spectrum Бейсику.

06 янв 2025 Пн
Микробейсик

Как-то не приходилось мне ранее делать такие программы, как интерпретаторы, причем никогда в жизни я этого не делал, и вот наконец, я смог. Да, смог сделать программу-интерпретатор, пусть даже не такую мощную, даже пусть простую, но я смог. За два дня интенсивной работы над программой на JS, сделал простой бейсик, который умеет немного, но он уже можно полноценно вычислять выражения со скобками, присваивать значения переменным, выполнять базовые операции, такие как вывод на экран, изменение цвета, рисования линии, точек и цикл FOR/NEXT. Пока что возможности моего бейсика скромны, но вместе с тем, они есть и даже немного работают.
Я вообще хотел его сделать для того чтобы создавать иллюстрации на сайт, то есть, особо больших даже, так сказать, возможностей и не предусматриваю, но работу с массивами, конечно, доделать надо. Я уже наметил что буду делать, чтобы минимально что-то заработало.
В основном конечно, этот инструмент мне нужен для работы с иллюстрациями на сайте. Но не только. Вообще я планирую сделать собственный бейсик для того чтобы он запускался на собственной операционной системе, которая будет работать на моих плисах.
04 янв 2025 Сб
Добавил "Избранное"
Вероятно, это один из разделов, которые были бы наиболее интересными для авторизованного статуса пользователя на сайте. Помимо этого, еще доработал загрузку аватара на сайт. Да, дела идут не так быстро, как могли бы, но вот сегодня я с утра еще сел и сделал еще рисовалку SVG, чтобы можно было размещать собственные рисунки и схемы, на сайте.
Сайт постепенно обновляется, и это очень хорошо. Мне нравится, что он начал как-то двигаться.
Сайт постепенно обновляется, и это очень хорошо. Мне нравится, что он начал как-то двигаться.
31 дек 2024 Вт
Скрытие невидимых линии
Однажды у меня была книга про трехмерную графику на Basic, и всё бы ничего, если бы не одна интересная глава в книге. В ней рассказывалось о том, как сделать так, чтобы линии, которые рисовались, могли скрываться за другими выпуклыми фигурами. Это оставило впечатление на меня, и я до сих пор не могу понять, как это сделать.
Если разобраться, то процесс сокрытия линий в целом простой. Допустим, нам надо провести трехмерную линию и проверить, где и в какой точке она будет отрезаться лежащим перед ней объектом. Для этого надо проверить все пересечения линии всех объектов.
То есть, если взять линию, то надо просмотреть все грани фигур на трехмерной сцене и сравнить. Могут быть следующие случаи.
Выше приведен пример такой линии, которая не рисуется за гранью.
Если разобраться, то процесс сокрытия линий в целом простой. Допустим, нам надо провести трехмерную линию и проверить, где и в какой точке она будет отрезаться лежащим перед ней объектом. Для этого надо проверить все пересечения линии всех объектов.
То есть, если взять линию, то надо просмотреть все грани фигур на трехмерной сцене и сравнить. Могут быть следующие случаи.
- Один конец линии начинается за гранью и заканчивается тоже за гранью. Такую линию вообще не выводить
- Первая точка линии начинается перед гранью, а вторая за гранью. Необходимо отрезать линию в том месте, где она пересекает грань. И закончить на этом.
- Первая точка линии начинается перед гранью, вторая тоже, и причем обе точки пересекли эту грань. Надо найти точки пересечения грани, после чего найти срединную точку и проверить, где она находится. Если она находится перед гранью, то тогда линия выводится без обрезки. Если за гранью, то вырезается кусок линии в точке пересечения.
Выше приведен пример такой линии, которая не рисуется за гранью.
30 дек 2024 Пн
В трудах над сайтом
Целый день я провел, работая над внутренним обновлением механизмов редактирования статей на сайте и остался очень доволен результатом своей работы. Эти обновления, на самом деле, надо было делать очень давно, но мне было жутко лень и я ничего не делал. И вот, наконец-то, когда немного разгрузился с работой, принялся за свой сайт.
У меня много идей, которые стоят того, чтобы их реализовать, и в частности, из-за неудобства работы с контентом, их было реализовать не так легко. Надеюсь что сейчас работа над сайтом пойдет более активно.
У меня много идей, которые стоят того, чтобы их реализовать, и в частности, из-за неудобства работы с контентом, их было реализовать не так легко. Надеюсь что сейчас работа над сайтом пойдет более активно.
28 дек 2024 Сб
Нового года больше нет
В течении десятка лет мое отношение к любым праздникам портилось и вот наконец, добралось и до нового года. Я окончательно перестал радоваться абсолютно всему. Больше в моей жизни нет ничего, кроме беспросветной тоски, страха и тревоги. Я больше не буду отмечать новый год хоть как-нибудь, разве что только негативно. Больше его не существует. Ничего больше нет, все растворилось и растаяло, словно дым.
ВСЁ ПЛОХО
Вот потому я ничего и не буду делать. Да, я делаю сайт постепенно. Появилась регистрация на сайте, теперь задача в том чтобы сделать личный кабинет, добавить "избранное" на статьи, чтобы можно было отмечать те, которые можно потом посмотреть в личном кабинете.
Также можно придумать систему оповещений внутри сайта, например, личные сообщения между участниками или еще сделать напоминалки, чтобы приходили сообщения.
ВСЁ ПЛОХО
Вот потому я ничего и не буду делать. Да, я делаю сайт постепенно. Появилась регистрация на сайте, теперь задача в том чтобы сделать личный кабинет, добавить "избранное" на статьи, чтобы можно было отмечать те, которые можно потом посмотреть в личном кабинете.
Также можно придумать систему оповещений внутри сайта, например, личные сообщения между участниками или еще сделать напоминалки, чтобы приходили сообщения.
23 дек 2024 Пн
Как бы хотелось сделать FPGA BASIC
Никто не знает, но я начинал свою жизнь программиста именно с Бейсика. Сначала это был GW-BASIC, потом QBasic 4.5. Всего диалектов бейсика было лишь два в моей жизни, но этот период оставил неизгладимый след, ведь на Бейсике я писал до 19 лет, исключая ассемблер, конечно. На нем я научился писать тоже не так уж поздно, а достаточно рано.
Сейчас мне интересно заниматься разработкой различных процессоров на плисе, но Бейсик так и не уходит из моих мыслей. Часто думаю над темой, вот бы сделать бейсик, который бы выполнялся на ПЛИС, пусть даже с помощью компиляции. В своей жизни я еще ни разу не делал интерпретатор "Бейсик" и это довольно большое упущение, особенно с тем, что мне этот язык программирования нравится, как ностальгическая память и не очень. На нем удобно иногда подсчитать несложные формулы.
На самом деле, даже сейчас я иногда пишу на бейсике.
Сейчас мне интересно заниматься разработкой различных процессоров на плисе, но Бейсик так и не уходит из моих мыслей. Часто думаю над темой, вот бы сделать бейсик, который бы выполнялся на ПЛИС, пусть даже с помощью компиляции. В своей жизни я еще ни разу не делал интерпретатор "Бейсик" и это довольно большое упущение, особенно с тем, что мне этот язык программирования нравится, как ностальгическая память и не очень. На нем удобно иногда подсчитать несложные формулы.
На самом деле, даже сейчас я иногда пишу на бейсике.
<< Ранние записи |
Поздние записи >>