実現したいこと
マウスのX,Y座標の変化によって線が集中する場所を動的に変化させたい。
発生している問題・分からないこと
問題のコードはp5.jsで動くコードをprocessingで動くように関数やデータ型を修正したものです。
おそらく該当の部分は float para = min(height,mouseY) / height-0.5;と
line(0, (para + 0.5) * tileHeight, tileWidth, i * tileHeight / count);
line(0, i * tileHeight / count, tileWidth, tileHeight - (para + 0.5) * tileHeight);の部分です。
また、switch()関数のcase1,2,3全てで問題が発生しており、case1はX座標に対して線が増えてますが、2,3ではマウスの動きに対して全く図形が変化しません。
エラーメッセージは出ていません。Processingは最新のバージョンです。
Processingを使ったGenerative Artの魅力的な作例がまとまった本が少なくGenerative Design with p5.jsという本を使って独学していますが、p5.jsをprocessingに変換するとエラーメッセージは出ないが微妙に動かない誤差が頻発してしまうのも悩みです。
該当のソースコード
int count = 0; int tileCountX = 6; int tileCountY = 6; int drawMode = 1; void setup() { size(800,800); rectMode(CENTER); noFill(); } void draw() { background(255); count = mouseX / 20 + 5;//mouseXが0でもcount=5を保証 float para = min(height,mouseY) / height-0.5;//displayの高さかmouseYとで最小値を高さ-0.5で割る。この値はマウスのY座標が画面の高さに対してどの位置にあるかを-0.5~0.5で表す float tileWidth = width / tileCountX; float tileHeight = height / tileCountY; for (int gridY = 0; gridY <= tileCountY; gridY++) { for (int gridX = 0; gridX <= tileCountX; gridX++) { float posX = tileWidth * gridX + tileWidth / 2; float posY = tileHeight * gridY + tileHeight / 2; push(); //グリッドの中心に座標系を設定 translate(posX, posY); // 押したキーで描画される図形を変更 switch (drawMode) { case 1: translate(-tileWidth / 2, -tileHeight / 2); for (var i = 0; i <count; i++) {//mouseXの値が大きいほど、線の数は増える。図形の描かれ方はグリッドの中心に縦に並んだ点から左上、右上の頂点に向かって線を引いている。 //図形がmouseYに応じて傾くということは線の到達頂点がmouseYが小さいほどY座標がずれるということ line(0, (para + 0.5) * tileHeight, tileWidth, i * tileHeight / count); line(0, i * tileHeight / count, tileWidth, tileHeight - (para + 0.5) * tileHeight); } break; case 2: for (var i = 0; i <= count; i++) { line(para * tileWidth, para * tileHeight, tileWidth / 2, (i / count - 0.5) * tileHeight); line(para * tileWidth, para * tileHeight, -tileWidth / 2, (i / count - 0.5) * tileHeight); line(para * tileWidth, para * tileHeight, (i / count - 0.5) * tileWidth, tileHeight / 2); line(para * tileWidth, para * tileHeight, (i / count - 0.5) * tileWidth, -tileHeight / 2); } break; case 3: for (var i = 0; i <= count; i++) { line(0, para * tileHeight, tileWidth / 2, (i / count - 0.5) * tileHeight); line(0, para * tileHeight, -tileWidth / 2, (i / count - 0.5) * tileHeight); line(0, para * tileHeight, (i / count - 0.5) * tileWidth, tileHeight / 2); line(0, para * tileHeight, (i / count - 0.5) * tileWidth, -tileHeight / 2); } break; } pop(); } } } void keyReleased() { if (key == '1') drawMode = 1; if (key == '2') drawMode = 2; if (key == '3') drawMode = 3; if (keyCode == DOWN) tileCountY = max(tileCountY - 1, 1); if (keyCode == UP) tileCountY += 1; if (keyCode == LEFT) tileCountX = max(tileCountX - 1, 1); if (keyCode == RIGHT) tileCountX += 1; }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
processing変換前の書籍に載っていた元コードです
データ型や関数をprocessingで動くように修正したほか、自分で式を変えてみたりもしましたがうまくいきませんでした
補足
特になし
回答1件
あなたの回答
tips
プレビュー