Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Эффект линзы (http://zx-pk.ru/showthread.php?t=7857)

newart 8th June 2008 14:16

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

Что для этого нужно поменять?

R = 64 (радиус)
M = 30 (выпуклость)
S = SQR(R*R - M*M)

FOR Y = -R TO R Step 4
FOR X = -R TO R Step 4
IF (X*X + Y*Y) >= S*S THEN
A = X
B = Y

Else
Z = SQR(R*R - X*X - Y*Y)
A = INT(X * M / Z)
B = INT(Y * M / Z)
PLOT(A,B)

END If

NEXT X
NEXT Y

Крутые кодеры, вплоть до Sairoos советуют слудущее " где z рассчитывается плюсы на минусы поменяй, либо у самого знак, либо под корнем плюсы на минусы". Забавно, но результат от этих изменений не меняется. :(

SAM style 8th June 2008 14:42

попробуй
Z = M - SQR (R*R - X*X - Y*Y)

rasmer 8th June 2008 14:50

слава - кинь результат что получается...

Vitamin 8th June 2008 15:01

Везде, где есть вычисления вида A=SQR(B*B-C*C) (там где вычисляется Z, С*С=X*X+Y*Y), формулу надо поправить на: A=2(B-C)-SQR(B*B-C*C)

Правда подозреваю, что надо не везде, а только во втором вычислении.

Vladimir Kladov 8th June 2008 16:21

Если на фотографию Луны или на 3D-модель Луны посмотреть, то кратеры тоже часто кажутся не вогнутыми, а выпуклыми. Вогнутые они или выпуклые, решает мозг, на основе привычных представлений о мире. Линза и кратер таковыми не являются, видимо.

Добавлено через 1 минуту
Да, улыбнуться забыл: :)

newart 8th June 2008 23:13

Quote:

Originally Posted by Vitamin (Post 137157)
Везде, где есть вычисления вида A=SQR(B*B-C*C) (там где вычисляется Z, С*С=X*X+Y*Y), формулу надо поправить на: A=2(B-C)-SQR(B*B-C*C)

Правда подозреваю, что надо не везде, а только во втором вычислении.

Мысль интересная, только с ABC ты меня совсем запутал. :)

Z = SQR(R*R - X*X - Y*Y)

заменть на?

Z = 2*(X-Y) - SQR(X*X - Y*Y) ?

получается что то вроде 4-х угольной звезды, но не линза.

Raider 9th June 2008 00:08



:smile:

Vitamin 9th June 2008 11:19

Quote:

Originally Posted by newart (Post 137259)
Мысль интересная, только с ABC ты меня совсем запутал.

Блин, на самом деле там все гораздо проще должно быть. X & Y у тебя пробегают по какой картинке? Источник или приемник? Если источник, то это по идее неправильно, ибо на приемнике получаем множество перерисованных и пропущенных пикселов. Отсюда мораль, что алгоритм должен работать следующим образом:

// src, dst- графические контексты источника и приемника соотвецно
// координаты относительно центра "линзы"
// шаг 1 ибо идем по пикселам контекста назначения (хоть сдвигами биты заполнять, не суть важно)
FOR Y = -R TO R
FOR X = -R TO R
// если вышли за пределы "линзы" (она круглая, но сканируем квадратом), то просто копируем точку как есть
// т.е. координаты совпадают
IF (X*X + Y*Y) >= S*S THEN
A = X
B = Y
Else
// иначе вычисляем координаты точки на источнике, которая проецируется на текущую точку приемника
Z = SQR(R*R - X*X - Y*Y)
A = INT(X * M / Z)
B = INT(Y * M / Z)
END If
// просто проверка на установленный бит
If (Point(src, A, B))
PLOT(dst, X,Y)
endif
NEXT X
NEXT Y

newart 9th June 2008 15:52

Нее, все куда проще, мне нужно получить подобие линзы прямо на экране, из точек.

Вариант из IRIS работает не так, как раз потому что не рисует сразу на экран, а создает таблицу для приемника.

Vitamin 9th June 2008 16:13

Quote:

Originally Posted by newart (Post 137349)
Нее, все куда проще, мне нужно получить подобие линзы прямо на экране, из точек.

Я про это и говорю. Сканирование должно быть линейным на приемнике, а не на источнике. Иначе будет хреново. А рисовать результат сразу или заполнять таблицу- не суть важно.


All times are GMT +4. The time now is 20:56.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.