PDA

Просмотр полной версии : Вопрос на засыпку: что делает эта подпрограмма?



jerri
12.03.2018, 17:48
входные данные 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

svofski
12.03.2018, 18:02
Просто догадка, приближение квадратного корня?

http://6502org.wikidot.com/software-math-sqrt

На 6502 совсем мой глаз не заточен, но вроде похоже.

jerri
12.03.2018, 18:49
svofski, да это определенно извлечение корня.
но зачем?

у нас есть сумма катетов. зачем нам гипотенуза?

svofski
12.03.2018, 19:02
Длина отрезка, вектора, расстояние между двумя точками, Евклидова норма, L2-норма. В графике постоянно пригождается. Можно определить принадлежность точки к кругу, или шару. В большинстве случаев можно сэкономить извлечение корня и сравнивать так же с квадратом расстояния. Но если это не просто сравнение, то не всегда получается так упростить. Это же Элита?

Shiny
12.03.2018, 20:05
Может, решение квадратного уравнения втиснулось?

jerri
12.03.2018, 20:07
Длина отрезка, вектора, расстояние между двумя точками, Евклидова норма, L2-норма. В графике постоянно пригождается. Можно определить принадлежность точки к кругу, или шару. В большинстве случаев можно сэкономить извлечение корня и сравнивать так же с квадратом расстояния. Но если это не просто сравнение, то не всегда получается так упростить. Это же Элита?

ага
заставка с Акорна
там где рисуется подсвеченная планета

svofski
12.03.2018, 20:33
Тогда это может быть модель освещения. яркость = dotproduct(нормаль к сфере, вектор на лампочку) * коэффициент. Чтобы это работало, векторы нужно нормировать, для этого надо их компоненты умножить на величину обратную длине. Это удобно ложится на стандартные наборы алгоритмов, в которых как правило есть уже разработанное оптимизированное приближение 1/sqrt(x) (square root reciprocal). Для сферы по идее можно и упростить, принять все размеры за 1.

jerri
12.03.2018, 21:04
нет

svofski,

берется рандомное число
возводится в квадрат
берется еще одно рандомное число

сохраняем

возводится в квадрат
складываем с первым квадратом
если больше то точку игнорируем

из 4000 вычитаем сумму
если меньше то точку игнорируем

потом извлекаем корень
и берем сохраненное число
рисуем точку по координатам

svofski
12.03.2018, 21:48
Освещение методом монте карло? Сфера и освещение 1 бит на пиксель с дизерингом.

jerri
12.03.2018, 22:30
svofski, по факту вот такая картинка
https://www.mups.co.uk/images/project/acorn-electron-elite-load.jpg

svofski
13.03.2018, 01:04
Угу. Я посмотрел уже сам еще несколько сообщений назад, потому и предложил вариант, что это такая хитрая комбинация освещения и дизеринга.

Я к сожалению прям так ничего другого придумать не могу. Вот моя попытка набросать алгоритм, который рисует похожий шарик:
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 вообще не нужно получается (можно раскомментировать код для любых векторов). Но это как-то не очень красиво. Надо придумать как точки сгущать ближе к краю проекции сферы.

Destr
13.03.2018, 02:16
А потом, после этого хотите чтоб вам что-то на спеке программили, да сдохну раньше чем разберусь что там за злые асм-команды закоменнченые :)

krt17
13.03.2018, 03:29
5 минут на православном перед сном, еретический 6502 не смотрел. Для такого простого алгоритма тупо лениво, а как говорится если разницы нет ...
https://i.imgur.com/uKKrsye.png

svofski
13.03.2018, 04:10
Гыыы https://jsfiddle.net/d96bbot4/44/

jerri
13.03.2018, 14:00
svofski, krt17,

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

svofski
13.03.2018, 14:11
jerri, было бы очень интересно в конце концов узнать, как они это делают.

Кстати, может быть пригодится: в теме "Демо эффекты для Вектора" обсуждается проявление картинки по пикселям, с ссылками на конкретные примеры. ivagor использовал свойство LFSR, благодаря которому он обходит все свои возможные значения (кроме 0) за период равный 2^разрядность - 1. То есть, если LFSR 16-битный, то это такой счетчик от 1 до 65535, но не подряд.

jerri
13.03.2018, 15:34
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

svofski
13.03.2018, 16:12
jerri, я не про как складывают числа, а как же в конце концов у них получается дизеринг.

Shiny
13.03.2018, 17:38
Темные люди, которые не слышали про Брезенхема.
Или тот способ быстрее?

krt17
13.03.2018, 17:55
но дополнительный рандом они не берут
Да он там не нужен, эт я криворуко боролся с визуальной цикличностью рнд. Можно просто плот оставить.
А зачем тебе такая картинка?

jerri
13.03.2018, 19:46
svofski, просто ставят точки по тому генератору

- - - Добавлено - - -


Темные люди, которые не слышали про Брезенхема.
Или тот способ быстрее?

это НЕ рисование круга

- - - Добавлено - - -


Да он там не нужен, эт я криворуко боролся с визуальной цикличностью рнд. Можно просто плот оставить.
А зачем тебе такая картинка?

я разбираю Элиту с Acorn Electron.
начинаю с самого начала.

svofski
13.03.2018, 19:51
jerri, если просто ставить точки, получится равномерно заполненный круг. А там точки явно сгущаются в направлении солнца. Или там генератор с каким-то интересным перекосом?

krt17
13.03.2018, 19:52
я разбираю Элиту с Acorn Electron.
Занятие прикольное, я бы с удовольстием поглядел на код Брабена но мне и торусовской до конца жизни хватит. Удачи.

jerri
13.03.2018, 19:57
svofski, берется только правая часть и там <1024 точек

krt17
13.03.2018, 20:23
А там точки явно сгущаются в направлении солнца.
Вообщето в моих 5 строчках на бейсике все "сгущается". Равномерный поток проецируется на сферу а затем на плоскость, все же просто.

- - - Добавлено - - -

https://i.imgur.com/kWjNMm8.png
Немного визуально подрихтовал

svofski
13.03.2018, 20:54
krt17, понял про проекцию. Я по другому думал.

Vladson
14.03.2018, 08:00
Блин начитался, похожее на*****кодил, потом сижу думаю "надо бы оптимизировать, есть отличная идея как, завтра освобожусь и сделаю".
(Только вот завтра это сейчас, и я хоть убейте не могу вспомнить что я вчера придумал...)

jerri
16.03.2018, 22:36
ну да точки просто расставляются по рандому
с ограничением по выходу за сферу радиусом 128

64643

самое интересное что точки расставляются относительно центра экрана (256х256)

jerri
25.03.2018, 17:48
окончательный результат

планета
звезды
кольцо

64770

Alex Rider
26.03.2018, 12:25
Шыкарно!