質問: ### 前提・実現したいこと (z^4+a*(z^3))+a^2*(x^2+y^2)=0, 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による格子点の表示例 ``` int gridNum = 20; LatticePoint[][][] p; void setup() { size(640,640,P3D); noStroke(); float a = 5.0; //簡単にするため aの値を固定 //x,y,zそれぞれの最大値最小値の設定 float xMin = -2.0; float xMax = 2.0; float yMin = -2.0; float yMax = 2.0; float zMin = -5.0; float zMax = 0.0; p = new LatticePoint[gridNum+1][gridNum+1][gridNum+1]; for(int xi=0;xi<=gridNum;xi++){ float x = map(xi,0,gridNum,xMin,xMax); for(int yi=0;yi<=gridNum;yi++){ float y = map(yi,0,gridNum,yMin,yMax); for(int zi=0;zi<=gridNum;zi++){ float z = map(zi,0,gridNum,zMin,zMax); //数式の評価 Processing では べき乗は z^4 ではなく pow(z,4) と書く float value = (pow(z,4)+a*pow(z,3))+pow(a,2)*(pow(x,2)+pow(y,2)); if(value>=0){ p[xi][yi][zi] = new LatticePoint(x,y,z,"OUT"); }else{ p[xi][yi][zi] = new LatticePoint(x,y,z,"IN"); } } } } } void draw() { background(255); for(int xi=0;xi<=gridNum;xi++){ for(int yi=0;yi<=gridNum;yi++){ for(int zi=0;zi<=gridNum;zi++){ p[xi][yi][zi].display(); } } } } //格子点 座標と内か外かの情報を持つクラス class LatticePoint { float x,y,z; String inOutStat; LatticePoint(float x,float y,float z,String inOutStat) { this.x = 60.0*x; this.y = -60.0*z; this.z = 60.0*y; this.inOutStat = inOutStat; } //格子点を描画(inOutStat がINの時のみ) void display() { if(inOutStat.endsWith("IN")){ fill(255,0,0); pushMatrix(); translate(x+width/2.0,y+height/2.0,z); sphere(2); popMatrix(); } } } ```