質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

6060閲覧

Processingでの波紋の描き方について

smilenannan

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2016/10/23 05:38

Processingでマウスの動きに合わせて画面に波紋ができるようなプログラムを作りたいと思っております。
その際、以下のサイトを見つけて参考にさせていただきました。
http://www.neilwallis.com/projects/java/water/index.php

読み込んでみたのですが、いまいち何をやっているのか分りません。
サイトには簡単な説明があるのですが、コード内のどれに対応しているのかが掴みづらいです。
もしよろしければ以下のコードの変数が何に対応していて、行っている操作が何を表しているか、などのことをコメントとして記していただけるとありがたいです。

何卒よろしくお願いします。

public void newframe() { 2 //Toggle maps each frame 3 i=oldind; 4 oldind=newind; 5 newind=i; 6 7 i=0; 8 mapind=oldind; 9 for (int y=0;y<height;y++) { 10 for (int x=0;x<width;x++) { 11 short data = (short)((ripplemap[mapind-width]+ripplemap[mapind+width]+ 12 ripplemap[mapind-1]+ripplemap[mapind+1])>>1); 13 data -= ripplemap[newind+i]; 14 data -= data >> 5; 15 ripplemap[newind+i]=data; 16 17 //where data=0 then still, where data>0 then wave 18 data = (short)(1024-data); 19 20 //offsets 21 a=((x-hwidth)*data/1024)+hwidth; 22 b=((y-hheight)*data/1024)+hheight; 23 24 //bounds check 25 if (a>=width) a=width-1; 26 if (a<0) a=0; 27 if (b>=height) b=height-1; 28 if (b<0) b=0; 29 30 ripple[i]=texture[a+(b*width)]; 31 mapind++; 32 i++; 33 } 34 } 35 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. texture, ripple

width*heightの大きさの2次元の画素値を1次元として表現したものですtextureはいわゆる元画像でrippleは波紋による屈折効果で元画像がどのように見えるかの結果画像であると思います。計算中の座標はループの制御変数x,yが表しており、その位置に元の画像のどの位置が対応するかを表す座標がa,bですね。a=x,b=yになっていると元画像から全くずれのない画像が結果となりa,bがx,yから離れれば離れるほど画像がゆがむという感じです。

  1. 二重forループの先頭の処理

1.で述べたx,y位置における波紋による画像のずれの程度をa,bへ計算するための物理モデルの形式化したものと思いますが、なにやら怪しげ(w;)な計算してますがその意味を解読するところまではできてません。
解読にあたってはある程度何をしているかを想像しながらのほうがいいかも知れません。例えば中心点から正弦波が時間により位相を変化させつつ中心から離れるほど振幅が減衰するという波紋の特徴にあうような計算をしているはずというように。なお計算は高速化のため浮動小数ではなく整数(多分1024近辺を最大振幅と想定した?)表現したもののようで意味を解釈するにはそういう想定を頭に入れておくことも必要です

  1. 余談

data >> 5
単に32で割り算しているだけです。整数除算よりもシフトのほうが高速に演算できるというプロセッサの特徴を意識した最適化です。現代のプロセッサは非常に高速ではありますがそれでも画像は一辺の二乗の計算量があるので少しでも早く計算できるように若干わかりずらい高速化テクニックを使ったりすることがあるようです。

質問者さんがすでに百も承知のことを言っているかもしれませんが、どこまで解読できたか書かれていませんので適当に推測して書いてみました。

投稿2016/10/23 12:06

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

smilenannan

2016/11/03 14:48

ご返事が遅くなっていまい申し訳ありません。実際のところこのコードの意味がほとんどわかっていませんでした。ご丁寧な説明ありがとうございます。このコードの内容の概要を理解するのにとても役に立ちました。お陰様でパラメーター調整もできました。 ですが、具体的なアルゴリズムの解読には至っておらず、物理的な現象を勉強しようと思います。 大変感謝しておりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問