###前提・実現したいこと
(z^4+a*(z^3))+a^2*(x^2+y^2)=0, 0<a<10
このような数式で表現される図形をprocessingやopenframeworksなどで書きたいんですけど、数式で「=0」と表される式のxとyとz座標はどうやって取得すればいいのでしょうか?
xとyとzに展開が難解すぎる場合です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
その図形がx,y,zそれぞれについて
どの範囲内にあるのか分かっているなら
2種類の格子点を求める事で形を表現する事ができます
x,y,zやその他の変数を多重ループにして
それぞれ範囲内で動かし
その式が0以上か未満かを評価します
例にそって書くと
(z^4+a*(z^3))+a^2*(x^2+y^2)<=0 となるx,y,zの組合せと
(z^4+a*(z^3))+a^2*(x^2+y^2)>0 となるx,y,zの組合せに分けます
すると空間上に
その式の答えが0以上となる点と
0未満となる点が格子状に並ぶ事になります
この2種類の格子点の境界となる面を
「マーチングキューブ※」
「マーチングテトラヘドラ」などの手法を使って
ポリゴンに置き換えると
目的の図形に近いものを描画する事ができます
※マーチングキューブは
隣り合う2種類の点で構成される
15通りの直方体のパターンに応じて
ポリゴンを作成する方式です
検索すれば日本語でも情報があると思います
こういった単純な格子点を使ったやり方には次のような欠点があります
- 予めx,y,zの範囲が分からない場合は探索、設定をしないといけない
- 単純な図形であるほど無駄な格子点の計算を大量に繰り返す事になる
これらは再帰等を用いて範囲を絞り込む事で解決できると思います
まずは2種類の格子点のうち内側になるものを描画してみるなど
単純な所から始めてみると良いと思います
↓Processingによる格子点の表示例
Processing
1int gridNum = 20; 2LatticePoint[][][] p; 3 4 5void setup() 6{ 7 size(640,640,P3D); 8 noStroke(); 9 10 float a = 5.0; //簡単にするため aの値を固定 11 12 //x,y,zそれぞれの最大値最小値の設定 13 float xMin = -2.0; 14 float xMax = 2.0; 15 16 float yMin = -2.0; 17 float yMax = 2.0; 18 19 float zMin = -5.0; 20 float zMax = 0.0; 21 22 p = new LatticePoint[gridNum+1][gridNum+1][gridNum+1]; 23 24 for(int xi=0;xi<=gridNum;xi++){ 25 float x = map(xi,0,gridNum,xMin,xMax); 26 for(int yi=0;yi<=gridNum;yi++){ 27 float y = map(yi,0,gridNum,yMin,yMax); 28 for(int zi=0;zi<=gridNum;zi++){ 29 float z = map(zi,0,gridNum,zMin,zMax); 30 31 //数式の評価 Processing では べき乗は z^4 ではなく pow(z,4) と書く 32 float value = (pow(z,4)+a*pow(z,3))+pow(a,2)*(pow(x,2)+pow(y,2)); 33 if(value>=0){ 34 p[xi][yi][zi] = new LatticePoint(x,y,z,"OUT"); 35 }else{ 36 p[xi][yi][zi] = new LatticePoint(x,y,z,"IN"); 37 } 38 } 39 } 40 } 41} 42 43void draw() 44{ 45 background(255); 46 for(int xi=0;xi<=gridNum;xi++){ 47 for(int yi=0;yi<=gridNum;yi++){ 48 for(int zi=0;zi<=gridNum;zi++){ 49 p[xi][yi][zi].display(); 50 } 51 } 52 } 53} 54 55//格子点 座標と内か外かの情報を持つクラス 56class LatticePoint 57{ 58 float x,y,z; 59 String inOutStat; 60 LatticePoint(float x,float y,float z,String inOutStat) 61 { 62 this.x = 60.0*x; 63 this.y = -60.0*z; 64 this.z = 60.0*y; 65 this.inOutStat = inOutStat; 66 } 67 68 //格子点を描画(inOutStat がINの時のみ) 69 void display() 70 { 71 if(inOutStat.endsWith("IN")){ 72 fill(255,0,0); 73 pushMatrix(); 74 translate(x+width/2.0,y+height/2.0,z); 75 sphere(2); 76 popMatrix(); 77 } 78 } 79}
投稿2017/01/18 08:53
総合スコア284
0
世の中には方程式を代数式のまま与えてそれをグラフ化してくれるようなシステム(Mathematicaのようなもの)もあると思いますが少なくともprocessing/openframeworksの基本機能のみでそうした機能はないようで、自前で方程式を解いて具体的なx,y,zの値を与えてやらないとグラフ化はできないように思います。
可能性としては方程式を解く別のソフトウェアとの連携で実現するような方法になるのではないでしょうか。
詳しく調べたことがあるわけではないので誤りなどありましたらご容赦ください。
投稿2017/01/16 07:18
総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/18 09:24
2017/01/19 02:19
2017/01/19 02:53