Просмотр полной версии : Вопрос на засыпку: что делает эта подпрограмма?
входные данные result_lh
сумма двух квадратов
выходные данные L - result_l
count_round
; LDY rezult_h ; y=(rezult_h)
; LDA rezult_l ; a=(rezult_l)
; STA factor_2 ; (factor2)=(rezult_l)
ld de,(rezult_1)
; d(y=result_h)
; e=factor2
; LDX #0 ; x=0
; STX rezult_l ; rezult_l=0
; LDA #8
; STA factor_1 ; ctr=8 repeat 16 times
ld bc,#0800
; b=factor_1
; c=x
ld l,0
; l=rezult_l
count_loop
; CPX rezult_l ; x=(result_l)?
ld a,c
cp l
; BCC skip_decr ; jr nc
jr nc,skip_decr
; BNE no_chek_round ; jr nz
jr nz,no_chek_round
; CPY #$40 ; '@' ; y(rezult_h)=#40?
ld a,d
cp #40
; BCC skip_decr ; jr nc
jr nc,skip_decr
no_chek_round
; TYA
; SBC #$40 ; '@' ; y(result_h)-#40
; TAY
ld a,d
sbc a,#40
ld d,a
; TXA
; SBC rezult_l ; x-result_l
; TAX
ld a,c
sbc a,l
ld c,a
skip_decr
; ROL rezult_l ; rezult_l*2
rl l
; ASL factor_2 ; <(factor2)(result_l)
; TYA
; ROL A ; <y
; TAY
; TXA
; ROL A ; <x
; TAX
sla e
rl d
rl c
; ASL factor_2 ; <(factor2)(result_l)
; TYA
; ROL A ; <y
; TAY
; TXA
; ROL A ; ;<x
; TAX
sla e
rl d
rl c
; DEC factor_1
; BNE count_loop
djnz count_loop
; RTS
ret
Просто догадка, приближение квадратного корня?
http://6502org.wikidot.com/software-math-sqrt
На 6502 совсем мой глаз не заточен, но вроде похоже.
svofski, да это определенно извлечение корня.
но зачем?
у нас есть сумма катетов. зачем нам гипотенуза?
Длина отрезка, вектора, расстояние между двумя точками, Евклидова норма, L2-норма. В графике постоянно пригождается. Можно определить принадлежность точки к кругу, или шару. В большинстве случаев можно сэкономить извлечение корня и сравнивать так же с квадратом расстояния. Но если это не просто сравнение, то не всегда получается так упростить. Это же Элита?
Может, решение квадратного уравнения втиснулось?
Длина отрезка, вектора, расстояние между двумя точками, Евклидова норма, L2-норма. В графике постоянно пригождается. Можно определить принадлежность точки к кругу, или шару. В большинстве случаев можно сэкономить извлечение корня и сравнивать так же с квадратом расстояния. Но если это не просто сравнение, то не всегда получается так упростить. Это же Элита?
ага
заставка с Акорна
там где рисуется подсвеченная планета
Тогда это может быть модель освещения. яркость = dotproduct(нормаль к сфере, вектор на лампочку) * коэффициент. Чтобы это работало, векторы нужно нормировать, для этого надо их компоненты умножить на величину обратную длине. Это удобно ложится на стандартные наборы алгоритмов, в которых как правило есть уже разработанное оптимизированное приближение 1/sqrt(x) (square root reciprocal). Для сферы по идее можно и упростить, принять все размеры за 1.
нет
svofski,
берется рандомное число
возводится в квадрат
берется еще одно рандомное число
сохраняем
возводится в квадрат
складываем с первым квадратом
если больше то точку игнорируем
из 4000 вычитаем сумму
если меньше то точку игнорируем
потом извлекаем корень
и берем сохраненное число
рисуем точку по координатам
Освещение методом монте карло? Сфера и освещение 1 бит на пиксель с дизерингом.
svofski, по факту вот такая картинка
https://www.mups.co.uk/images/project/acorn-electron-elite-load.jpg
Угу. Я посмотрел уже сам еще несколько сообщений назад, потому и предложил вариант, что это такая хитрая комбинация освещения и дизеринга.
Я к сожалению прям так ничего другого придумать не могу. Вот моя попытка набросать алгоритм, который рисует похожий шарик:
https://jsfiddle.net/d96bbot4/6/
Беру точку x, y.
Если x*x + y*y < 1, значит это годная точка внутри окружности.
У меня сфера x*x + y*y + z*z = 1, значит z*z = 1 - x*x - y*y
Вектор на лампочку у меня [1 0 0]
Все векторы нормированы, поэтому яркость = cos(фи) = a•b = x * const
Дизеринг: беру еще одно случайное число и если яркость больше, точку ставлю, иначе нет.
Пока лампочка в [1 0 0], z вообще не нужно получается (можно раскомментировать код для любых векторов). Но это как-то не очень красиво. Надо придумать как точки сгущать ближе к краю проекции сферы.
А потом, после этого хотите чтоб вам что-то на спеке программили, да сдохну раньше чем разберусь что там за злые асм-команды закоменнченые :)
5 минут на православном перед сном, еретический 6502 не смотрел. Для такого простого алгоритма тупо лениво, а как говорится если разницы нет ...
https://i.imgur.com/uKKrsye.png
Гыыы https://jsfiddle.net/d96bbot4/44/
svofski, krt17,
круто красиво но дополнительный рандом они не берут :)
и уних рандом не рандомный
jerri, было бы очень интересно в конце концов узнать, как они это делают.
Кстати, может быть пригодится: в теме "Демо эффекты для Вектора" обсуждается проявление картинки по пикселям, с ссылками на конкретные примеры. ivagor использовал свойство LFSR, благодаря которому он обходит все свои возможные значения (кроме 0) за период равный 2^разрядность - 1. То есть, если LFSR 16-битный, то это такой счетчик от 1 до 65535, но не подряд.
svofski, а это без проблем
add2words
ld de,(word0)
ld hl,(word1)
ld a,d
adc a,h
ld h,a
ld a,e
adc a,l
ld l,a
ld (word1),de
ld (word0),hl
ret
word0 dw #5349
word1 dw #6c78
jerri, я не про как складывают числа, а как же в конце концов у них получается дизеринг.
Темные люди, которые не слышали про Брезенхема.
Или тот способ быстрее?
но дополнительный рандом они не берут
Да он там не нужен, эт я криворуко боролся с визуальной цикличностью рнд. Можно просто плот оставить.
А зачем тебе такая картинка?
svofski, просто ставят точки по тому генератору
- - - Добавлено - - -
Темные люди, которые не слышали про Брезенхема.
Или тот способ быстрее?
это НЕ рисование круга
- - - Добавлено - - -
Да он там не нужен, эт я криворуко боролся с визуальной цикличностью рнд. Можно просто плот оставить.
А зачем тебе такая картинка?
я разбираю Элиту с Acorn Electron.
начинаю с самого начала.
jerri, если просто ставить точки, получится равномерно заполненный круг. А там точки явно сгущаются в направлении солнца. Или там генератор с каким-то интересным перекосом?
я разбираю Элиту с Acorn Electron.
Занятие прикольное, я бы с удовольстием поглядел на код Брабена но мне и торусовской до конца жизни хватит. Удачи.
svofski, берется только правая часть и там <1024 точек
А там точки явно сгущаются в направлении солнца.
Вообщето в моих 5 строчках на бейсике все "сгущается". Равномерный поток проецируется на сферу а затем на плоскость, все же просто.
- - - Добавлено - - -
https://i.imgur.com/kWjNMm8.png
Немного визуально подрихтовал
krt17, понял про проекцию. Я по другому думал.
Блин начитался, похожее на*****кодил, потом сижу думаю "надо бы оптимизировать, есть отличная идея как, завтра освобожусь и сделаю".
(Только вот завтра это сейчас, и я хоть убейте не могу вспомнить что я вчера придумал...)
ну да точки просто расставляются по рандому
с ограничением по выходу за сферу радиусом 128
64643
самое интересное что точки расставляются относительно центра экрана (256х256)
окончательный результат
планета
звезды
кольцо
64770
Alex Rider
26.03.2018, 12:25
Шыкарно!
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot