Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet
06 фев 2025 Чт
Виртуальная машина 1999 года создания
Очень много раз говорил о том, что когда в конце 1999 года я создал программу "Нортон Коммандер", как я его называл, и заложил туда самое главное: набор команд. С того времени я не написал ни одной программы под эту ВМ-ку, а хотя рассчитывал, что буду писать. Итак, почему бы не написать наконец-то, сейчас, через 25 лет?
Набор инструкции здесь небольшой.
Итак, я воссоздам этот Norton Commander исключительно только ради написания и запуска программ под эту ВМ-ку. И сделаю это лучше, чем тогда, потому что у меня сейчас есть не только листок с ручкой, а свой личный компьютер.
Делать эмулятор я буду вот на этой странице.
Набор инструкции здесь небольшой.
0 NOP 1 CLS 2 PRINT CHR([символ1]); CHR([символ2]); 3 GOTO [метка] 4 LOCATE Y,X 5 [переменная-a] = [переменная-b] + [переменная-c] 6 [переменная-a] = [переменная-b] - [переменная-c] 7 [переменная-a] = [переменная-b] * [переменная-c] 8 [переменная-a] = [переменная-b] / [переменная-c] 9 IF [переменная-a] = [переменная-b] THEN [метка] 10 IF [переменная-a] < [переменная-b] THEN [метка] 11 IF [переменная-a] > [переменная-b] THEN [метка] 12 GOTO [метка] -- да, дубликат, я это пропустил 13 LINE ([переменная-x1],[переменная-y1])-([переменная-x2],[переменная-y2]),[цвет] 14 BEEP 15 PRINT CHR([переменная-a]); CHR([переменная-b]); 16 PRINT [переменная]Вот такой вот несуразный набор инструкции, который я тогда закладывал. Смогу ли я хотя бы что-то сделать с его помощью? Интересный вопрос, очень интересный. И еще, программа ограничена 512 строками, если что. Каждая строка содержит по 4 столбца, так что приходилось выкручиваться, занимая у следующего столбца его аргументы.
Итак, я воссоздам этот Norton Commander исключительно только ради написания и запуска программ под эту ВМ-ку. И сделаю это лучше, чем тогда, потому что у меня сейчас есть не только листок с ручкой, а свой личный компьютер.
Делать эмулятор я буду вот на этой странице.
04 фев 2025 Вт
Жизнь — это сон
Сегодня мне немного больше хочется спать, чем вчера. Вчера не так сильно хотелось, как сегодня, и я могу сказать лишь то, что удивлён тому, что вообще еще в состоянии что-либо думать, и что-либо делать. На самом деле, я уже должен был лежать пластом, но я все еще сижу за компом и сквозь мутную пелену сознания произвожу какие-то странные коды.
Я никогда больше не высплюсь. Жизнь, это всего лишь вечный сон.
Я никогда больше не высплюсь. Жизнь, это всего лишь вечный сон.
03 фев 2025 Пн
Сонный Лис
Я всегда сплю, даже когда сижу за компом, даже когда работаю или иду по улице, потому что мне всегда и везде хочется спать. Мой мозг отказывается вообще воспринимать всё вокруг, потому что он спит. Я сплю даже во сне! Да, мне снится, что я сплю. Насколько надо устать в этой жизни, насколько надо не выспаться, чтобы мне снилось, что сплю.
Когда подымаюсь утром, мне хочется спать, когда иду в магазин, я засыпаю, когда сажусь за работу — единственное моё желание — это не спать... и такое длится не просто много лет, это длится уже десятилетия, начиная со школы, где мне спать хотелось настолько же неимоверно, как и сейчас. Но сейчас намного хуже. Раньше, когда приходил со школы, я просыпался, и засыпал ночью, и спал нормально. Сейчас... сейчас я вообще не просыпаюсь больше никогда.
Я сонный Лис.
Когда подымаюсь утром, мне хочется спать, когда иду в магазин, я засыпаю, когда сажусь за работу — единственное моё желание — это не спать... и такое длится не просто много лет, это длится уже десятилетия, начиная со школы, где мне спать хотелось настолько же неимоверно, как и сейчас. Но сейчас намного хуже. Раньше, когда приходил со школы, я просыпался, и засыпал ночью, и спал нормально. Сейчас... сейчас я вообще не просыпаюсь больше никогда.
Я сонный Лис.
02 фев 2025 Вс
Видеоразрешения разных мастей
Я вот что подумал. Есть например, 30К памяти, которую можно подогнать под различные видеоразрешения.
512 x 480 x 1 (30k) 512 x 240 x 2 (30k) 512 x 240 x 1, 2 экрана (15k x 2) 256 x 240 x 4 (30k) 256 x 240 x 2, 2 экрана (15k x 2) 640 x 350 x 1 (28k)Поддержка только графического видеорежима. И вот можно просто взять и сделать их всех в одном флаконе. А еще можно одно сделать:
32 x 30 3KТо есть это как бы, тайловый режим. Тайл размером 8 байт, 256 x 8 = 2k, 32x30 = 960 байт страница. Почти так сделано в NES.
26 янв 2025 Вс
Маленькая история из детства
Когда мне было 13 (или 14) лет в 2001 году, я увидел у одного человека, который вместе со мной ходил в компьютерный кружок, книгу по Visual Basic 6.0. Поскольку компа у меня в то время не было, то мне хотелось почитать книгу по Бейсику, тем более по Visual, ведь в то время максимум на что мог рассчитывать — это посидеть за чужим компом и программировать на Quick Basic 4.5, потому что DOS.
И вот однажды собрался я в Мск по поводу. Или без повода, но у меня появилось примерно 100 рублей на карманные расходы (огромные деньги для меня в 2001 году!) и я пошел покупать книгу. Придя на какой-то вшивый радиорынок, раскинутый посреди грязных улиц, я искал книгу по Бейсику. Визуал Бейсику. Торговали мужики там чем только не торговали — от каких-то мелочевок, до огромных наноболтов, и разное всякое старьё. Ясно дело, что денег зайти в официальный магазин у меня не было, и потому я ошивался по таким вот ярмаркам.
Наконец, я нашел книгу. Это был увесистый том, под названием "Visual Basic for applications", что меня слегка смутило, но не остановило. Я с большой радостью купил данную книгу и с еще большей радостью повез ее домой, даже не открывая. А зря. Придя домой, открыв книгу, я обнаружил там полный ахтунг — не та книга! Она для MS Office! Вот же облом... я так расстроился, что просто поставил эту книгу на полку и больше никогда в жизни не открывал.
А потом она потерялась на помойке через несколько лет.
И вот однажды собрался я в Мск по поводу. Или без повода, но у меня появилось примерно 100 рублей на карманные расходы (огромные деньги для меня в 2001 году!) и я пошел покупать книгу. Придя на какой-то вшивый радиорынок, раскинутый посреди грязных улиц, я искал книгу по Бейсику. Визуал Бейсику. Торговали мужики там чем только не торговали — от каких-то мелочевок, до огромных наноболтов, и разное всякое старьё. Ясно дело, что денег зайти в официальный магазин у меня не было, и потому я ошивался по таким вот ярмаркам.
Наконец, я нашел книгу. Это был увесистый том, под названием "Visual Basic for applications", что меня слегка смутило, но не остановило. Я с большой радостью купил данную книгу и с еще большей радостью повез ее домой, даже не открывая. А зря. Придя домой, открыв книгу, я обнаружил там полный ахтунг — не та книга! Она для MS Office! Вот же облом... я так расстроился, что просто поставил эту книгу на полку и больше никогда в жизни не открывал.
А потом она потерялась на помойке через несколько лет.
25 янв 2025 Сб
Надо сделать тормознутый эмулятор
Смысл такой. Есть небольшого размера ПЛИС, для нее создать элементарный процессор, который умеет почти ничего, и на этом процессоре сделать эмулятор другого процессора, например, 386, со всеми blackджаками и защищенными режимами. И запустить, чтобы неистово тормозил. А потом на основе этого процессора делать всякое. То есть — ничего не делать вообще. Да и вообще, зачем оно надо. Всё тлен.
16 янв 2025 Чт
Какой-то волшебный алгоритм, честное слово
Не могу понять того, почему для меня так сложно сделать вычисление отсечения невидимых поверхностей, что же так сложно то!

Это выдержка из книги про графику на спектруме. И я совершенно не понимаю, что это за формулы такие. С помощью этих чудо-формул создают вот такие вещи.

Да, те самые крутые мегакубы, у которых линии не видны за гранями. С ума сойти просто, как это работает у них. Да ещё и на Бейсике.

Это выдержка из книги про графику на спектруме. И я совершенно не понимаю, что это за формулы такие. С помощью этих чудо-формул создают вот такие вещи.

Да, те самые крутые мегакубы, у которых линии не видны за гранями. С ума сойти просто, как это работает у них. Да ещё и на Бейсике.
15 янв 2025 Ср
Пересечение прямых с плоскостью
Вот интересно, у меня есть формулы для пересечения прямых с плоскостью с поиском как расстояния до нее, так и точки пересечения
Как бы, и всё... Но, это лишь расстояние до плоскости, но часто требуется рассчитать именно
u,v
, но почему-то никогда не думал о том, как находить именно пересечение. На самом деле, это не так уж и сложно, если представить уравнение плоскости как Ax + By + Cz + D = 0
, то пересечение высчитывается элементарно:A(x0 + dx*t) + B(y0 + dy*t) + C(z0 + dz*t) + D = 0 A*x0 + A*dx*t + B*y0 + B*dy*t + C*z0 + C*dz*t + D = 0 A*x0 + B*y0 + C*z0 + t*(A*dx + B*dy + C*dz) = 0 -t*(A*dx + B*dy + C*dz) = A*x0 + B*y0 + C*z0 + DНо лучше записать так
Как бы, и всё... Но, это лишь расстояние до плоскости, но часто требуется рассчитать именно
u,v
, чтобы понять, попала ли прямая на треугольник на плоскости, или нет.
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
<< Ранние записи |
Поздние записи >>