d3moduleを利用した波紋のエフェクトの3次元版。波の高さによって明るさが変わるようにもなっています。#include "d3m.hsp"
#define ctype round(%1) double(strf("%%0.0f", %1)) // 四捨五入(hspmathより抜粋)
#const CONST_A 0.1 // 定数その1。波長を決定付ける。
#const CONST_B 7 // 定数その2。屈折の程度を決定付ける。
buffer 1
onclick goto *start
*start
onclick 0
dialog "jpg;*.gif;*.bmp", 16
if stat == 0 : end
gsel 1 : picload refstr
sizeX = ginfo_winx
sizeY = ginfo_winy
centerX = ginfo_winx / 2
centerY = ginfo_winy / 2
screen 0, sizeX, sizeY, SCREEN_NORMAL
gmode GMODE_GDI, sizeX, sizeY
gcopy 1, 0, 0
d3setcam sizeX/2, -300, sizeY/4, sizeX/2, 0, sizeY/2
redraw 0
boxf
gmode GMODE_MEM, 1, 1
repeat sizeY : targetY = cnt
title "変換中…" + str(100 * cnt / sizeY) + "%"
repeat sizeX : targetX = cnt
// 中心から見た座標を算出。
d3getpos vx, vy, targetX, 0, targetY
dx = vx - centerX
dy = centerY -vy
// 中心から見た角度と距離を算出。
theta = atan(dy, dx)
dist = sqrt(dx * dx + dy * dy)
// ここがポイント。sinで屈折する距離を決めています。
// ラスタースクロールのスクリプトのほうが分かりやすいかもしれません。
copyX = centerX + round(cos(theta) * (dist + sin(dist * CONST_A) * CONST_B))
copyY = centerY + round(sin(theta) * (dist + sin(dist * CONST_A) * CONST_B))
pos targetX, targetY
gmode GMODE_ALPHA, 1, 1, absf(sin(dist * CONST_A)) * 64 + 192
gcopy 1, copyX, copyY
loop
await 10
loop
redraw 1
title "変換終了 - クリックで再開"
onclick 1
stop
2007年7月16日月曜日
波紋のエフェクト(3次元ver.)
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿