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

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

ただいまの
回答率

90.52%

  • Java

    15528questions

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

  • C++

    4295questions

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

  • Processing

    317questions

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

  • openFrameworks

    89questions

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

  • Mathematica

    13questions

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,009

santaro

score 11

前提・実現したいこと

(z^4+a*(z^3))+a^2*(x^2+y^2)=0, 0<a<10
このような数式で表現される図形をprocessingやopenframeworksなどで書きたいんですけど、数式で「=0」と表される式のxとyとz座標はどうやって取得すればいいのでしょうか?
xとyとzに展開が難解すぎる場合です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

その図形が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();
    }
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/18 18:24

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

    キャンセル

  • 2017/01/19 11:19

    ありがとうございます

    補足としてOpenframeworks 用の
    マーチングキューブ、マーチングテトラヘドラの
    ライブラリを見つけたので紹介しておきます

    ↓GitHub
    https://github.com/kylemcdonald/ofxMetaballs
    ※メタボール実現のために使用されているようですが
    /srcを見ると
    MarchingCubes , MarchingTetrahedrons
    というファイルがあります

    ProcessingではJavaで書かれたものを
    探す方が良いかもしれません

    範囲については式内のx,y,zを
    ±2^x,±2^y,±2^z
    などのべき乗に置き換えて
    +-のくみあわせで8通りの式を試すと
    少ないステップ数で
    だいたいの範囲が見えてくると思います

    ただ、オーバーフロー回避のための処理が必要ですし
    いずれかの値が発散する場合等は評価が難しいと思います

    キャンセル

  • 2017/01/19 11:53

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    15528questions

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

  • C++

    4295questions

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

  • Processing

    317questions

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

  • openFrameworks

    89questions

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

  • Mathematica

    13questions

閲覧数の多いJavaの質問