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

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

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

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

Mathematica

Mathematicaは、ウルフラム・リサーチによって開発されている数式処理システムです。

Java

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Processing

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

Q&A

解決済

2回答

2602閲覧

プログラムでの数式の記述について

santaro

総合スコア18

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

Mathematica

Mathematicaは、ウルフラム・リサーチによって開発されている数式処理システムです。

Java

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Processing

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

0グッド

0クリップ

投稿2017/01/16 06:58

###前提・実現したいこと
(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ページで確認できます。

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

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

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

guest

回答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

e-cube

総合スコア284

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

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

KSwordOfHaste

2017/01/18 09:24

非常に興味深く拝見しました。汎用的な方程式を扱う際にいろいろ工夫が必要そうですがそれはそれでまた興味がわきます。情報感謝します。
e-cube

2017/01/19 02:19

ありがとうございます 補足としてOpenframeworks 用の マーチングキューブ、マーチングテトラヘドラの ライブラリを見つけたので紹介しておきます ↓GitHub https://github.com/kylemcdonald/ofxMetaballs ※メタボール実現のために使用されているようですが /srcを見ると MarchingCubes , MarchingTetrahedrons というファイルがあります ProcessingではJavaで書かれたものを 探す方が良いかもしれません 範囲については式内のx,y,zを ±2^x,±2^y,±2^z などのべき乗に置き換えて +-のくみあわせで8通りの式を試すと 少ないステップ数で だいたいの範囲が見えてくると思います ただ、オーバーフロー回避のための処理が必要ですし いずれかの値が発散する場合等は評価が難しいと思います
KSwordOfHaste

2017/01/19 02:53

GitHub拝見しました。きれいなコードなので慣れたJavaに移植するのも面白そうですね!情報ありがとうございました。
guest

0

世の中には方程式を代数式のまま与えてそれをグラフ化してくれるようなシステム(Mathematicaのようなもの)もあると思いますが少なくともprocessing/openframeworksの基本機能のみでそうした機能はないようで、自前で方程式を解いて具体的なx,y,zの値を与えてやらないとグラフ化はできないように思います。

可能性としては方程式を解く別のソフトウェアとの連携で実現するような方法になるのではないでしょうか。

詳しく調べたことがあるわけではないので誤りなどありましたらご容赦ください。

投稿2017/01/16 07:18

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問