[ 前へ | 目次 | 次へ ]
Japanese English
Now Loading...
ダウンロード
PC (※スマートフォンでは動きません) でダウンロードし、ZIPファイルを右クリックメニューから展開して、できたフォルダ内の「 VCSSL.bat(バッチファイル) 」をダブルクリックすると起動します。 Linux等では「 VCSSL.jar 」をコマンド実行してください。
» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら

z = f(x,y) の形の数式を3Dグラフとして描画するツール

このVCSSLプログラムは、 入力欄に z = f(x,y) の形の数式を入力すると、 それを3次元のグラフに描いてくれる簡易ツールです。

使用方法

ダウンロードと展開(解凍)

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされます。

Windows をご使用の方は、ここでまずZIPファイルを右クリックし、「プロパティ」を選んで開かれる画面で、 下の方にあるセキュリティ項目の「許可する」にチェックを入れて「OK」で閉じてください。 これを行わないと、ZIP展開やソフト起動時に、警告メッセージが出て展開完了/起動できない場合があります。

その後、ZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合や、ファイル名が文字化けしてしまう場合は…

プログラムの起動

Windows をご使用の場合

上記でZIPファイルを展開したフォルダ内にある、以下のバッチファイルをダブルクリック実行してください:

VCSSL__ダブルクリックでプログラム実行.bat

もしプログラムを書き変えながら使いたい場合は、代わりに「 VCSSL_Editor__プログラム編集はこちら.bat 」を実行してください。

正常に起動できると、初回のみ、Java実行環境を入手するか等を尋ねられるので、適時答えて済ませると、プログラムが起動します。 2回目以降はすぐに起動します。

» うまく起動できずにエラーになってしまう場合は…

Linux 等をご使用の場合

ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:

java -jar VCSSL.jar
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)

» javaコマンドが使用できない等のエラーが表示される場合は…

起動後

画面の様子

起動すると、2つのウィンドウが立ち上がります。 左が数式などの入力画面、右がグラフ画面です。

入力画面(左)とグラフ画面(右)
※ 画面のデザインや項目名などは、バージョンにより多少異なる場合があります。

数式を入力してグラフを描画する

まず、グラフに描きたい数式を、入力画面の「 z(x,y) = 」の入力欄に入力してください。z = f(x,y) における f(x,y) の式です。 式の書き方のポイントは以下の通りです:

- 数式の書き方のポイント -
  • 式は半角(123などの、幅の細い文字)で書いてください。キーボード左上の「半角/全角」キーで切り替えられます。
  • 「 x 」や「 y 」は大文字ではなく小文字を用いてください。
  • 四則演算が普通に使用できます。ただし、かけ算は「 * 」、割り算は「 / 」の記号を用いてください。足し算や引き算は普通に「 + 」と「 - 」を用います。
  • かけ算や割り算は、足し算や引き算よりも先に計算されます(手計算と同じです)。
  • sin や cos といった数学関数が使用できます。また、円周率の値は「 PI 」と書けばOKです。 使用可能な数学関数・定数の一覧は、Mathライブラリの仕様書ページをご覧ください。
  • 累乗は「 ** 」の記号を用いてください。例えば x の2乗なら「 x**2 」です。

式を入力したら、入力画面の「 プロット 」ボタンを押すと、その式がグラフ画面上に描かれます。 グラフは、入力画面の「 x-N 」と「 y-N 」に指定した数を、 それぞれメッシュのX方向およびY方向の刻み数とする、曲面グラフとして描画されます。 x-N, y-N の値が大きいほど曲面が滑らかになります。

別の数式を重ね描きする / 内容をクリアしてゼロから描き直す

式を書き換えて再び「 プロット 」ボタンを押すと、その内容がグラフ画面上に重ね描きされます。 重ね描きされた複数のグラフは、標準では共にZ値に応じたグラデーション彩色がされるので、見分けづらい場合もあるかもしれません。 その場合は、グラフ画面のメニューバーから「 オプション 」 > 「 グラデーション(Z値) 」の選択を外して無効にしてください。 そうすると、以下のように複数のグラフが色分けされます:

グラデーションオプションが有効の場合(左)と無効の場合(右)の図

重ね描きではなく、ゼロからグラフを描き直したい場合は、入力画面の「 クリア 」ボタンを押してください。そうすると一旦グラフ内容が全消去されますので、描き直してください。

その他の機能や細かい設定など

背景色を黒ではなく白にしたい場合は、グラフ画面の「 オプション 」 > 「 ブラックスクリーン 」の選択を外してください。 なお、白背景は印刷には適していますが、PC画面上ではZ値のグラデーションが見づらくなってしまうため、用途に応じて使い分けてください。

他にも、グラフ画面の「 ファイル 」メニューから、設定内容の保存や、グラフ内容の画像ファイルへの保存などができます。 同様に「 編集 」メニューから、軸ラベルや目盛り、描画範囲やカメラ、光や色の細かい設定などを行えます。

画像ではなく座標値データをファイルに保存したい場合は、 入力画面の「 データ出力 」ボタンを押すと、現在のグラフの内容を3カラム書式の座標値ファイルとして保存できます。 保存したファイルは、グラフ画面の「 ファイル 」 > 「 ファイルを開く 」メニューから読み込む事ができますし、他のグラフソフトでの読み込みも(書式が対応しているものなら)可能です。

なお、このプログラムで起動されるグラフ画面は、 「 リニアングラフ3D( RINEARN Graph 3D ) 」というデータ解析用のグラフソフトで、 単体でも入手・利用できます。操作感などが気に入った方は、ぜひご利用ください。

コード解説

コード全体

このプログラムのコードはVCSSLで記述されています。 VCSSLはC言語系のシンプルな文法を持っているので、C系の言語に触れられた事のある方なら、 コメントを参考にしながらコード内容を比較的簡単に追う or 改造する事ができると思います。

今回のコードは、基本的なグラフ操作の処理に、GUIの画面を組み合わせて、ツールとして仕上げたものです。 グラフの描画処理の基本や、ユーザーの入力した式からグラフを描く流れについては、以下の回で解説していますので、そちらをご参照ください:

- 前提となる処理の記事 -

また、VCSSLでのGUI画面の構築については、「 VCSSL GUI開発ガイド 」をご参照ください。

今回のコードは、サンプルコードというよりは実際に使うためのツールなので、 細部を細かくピックアップしながらの解説は割愛し、コード全体の掲載に留めておきます。 今回のコードの全体は、以下の通りです:


coding UTF-8;

import Math;
import Text;
import GUI;
import File;
import tool.Graph3D;


/** グラフに描画する数式 z(x,y) のデフォルト入力値です。 */
const string DEFAULT_Z_EXPRESSION = "sin(2*x) + cos(2*y)";

/** グラフのX範囲の最大値のデフォルト入力値です。 */
const string DEFAULT_X_MAX = "1.0";

/** グラフのX範囲の最小値のデフォルト入力値です。 */
const string DEFAULT_X_MIN = "-1.0";

/** グラフのメッシュにおけるX方向の点数のデフォルト入力値です。 */
const string DEFAULT_X_N = "80";

/** グラフのY範囲の最大値のデフォルト入力値です。 */
const string DEFAULT_Y_MAX = "1.0";

/** グラフのY範囲の最小値のデフォルト入力値です。 */
const string DEFAULT_Y_MIN = "-1.0";

/** グラフのメッシュにおけるY方向の点数のデフォルト入力値です。 */
const string DEFAULT_Y_N = "80";


// 以下、グラフやGUIコンポーネントIDを格納する変数

/** グラフのIDを格納します。 **/
int graph = NULL;

/** 入力画面のウィンドウのIDを格納します。 */
int window = NULL;

/** z(x,y) の数式を入力するテキストフィールドのIDを格納します。 */
int expressionField = NULL;

/** X軸の最大値を入力するテキストフィールドのIDを格納します。 */
int xMaxField = NULL;

/** X軸の最小値を入力するテキストフィールドのIDを格納します。 */
int xMinField = NULL;

/** グラフのメッシュにおけるX方向の点数を入力するテキストフィールドのIDを格納します。 */
int xNField = NULL;

/** Y軸の最大値を入力するテキストフィールドのIDを格納します。 */
int yMaxField = NULL;

/** Y軸の最小値を入力するテキストフィールドのIDを格納します。 */
int yMinField = NULL;

/** グラフのメッシュにおけるY方向の点数を入力するテキストフィールドのIDを格納します。 */
int yNField = NULL;

/** PLOTボタンのIDを格納します。 */
int plotButton = NULL;

/** CLEARボタンのIDを格納します。 */
int clearButton = NULL;

/** EXPORTボタンのIDを格納します。 */
int exportButton = NULL;

/** EXITボタンのIDを格納します。 */
int exitButton = NULL;



/**
 * プログラムの開始時に自動で実行されます。
 */
void main(){

	// GUIを備えたツールではコンソール画面は邪魔なので非表示化
	hide();

	// システム側で標準接続されている3DグラフソフトがあればIDを取得(無ければnewGraph3D関数同様、新規に立ち上がる)
	graph = getGraph3D();

	// ※ 普通に newGraph3D 関数で新規生成しないのは、このプログラムがリニアングラフ3Dにも同梱されるツールであり、
	//	リニアングラフ3D上でメニューからこのプログラムを実行した際に、そのグラフ自身を制御対象とするためです。

	// グラフ画面の位置とサイズを設定
	setGraph3DLocation(graph, 350, 0);
	setGraph3DSize(graph, 720, 600);

	// プロットオプションを設定
	setGraph3DOption( graph, "WITH_POINTS", false );
	setGraph3DOption( graph, "WITH_LINES", false );
	setGraph3DOption( graph, "WITH_MEMBRANES", true );
	setGraph3DOption( graph, "WITH_MESHES", false );

	// 設定画面を起動
	createInputWindow();

	// ※ ユーザーがボタンを押すとグラフが描かれる処理などは、
	//	後方の onButtonClick 関数を起点として実行されます。
}


/**
 * 引数に指定された数式をグラフにプロットします。
 * 
 * @param zExpression プロットするzの数式(xとyの関数)
 * @param xMin x軸の最小値
 * @param xMax x軸の最大値
 * @param xN グラフのメッシュにおけるX方向の点数
 * @param yMin y軸の最小値
 * @param yMax y軸の最大値
 * @param yN グラフのメッシュにおけるY方向の点数
 */
void plotGraph( string zExpression, double xMin, double xMax, int xN, double yMin, double yMax, int yN ){

	// グラフに転送するデータ配列
	double xArray[yN][xN];
	double yArray[yN][xN];
	double zArray[yN][xN];

	// グラフを構成する点の X, Y, Z 座標を格納する変数
	//(入力された z の数式の中でも変数 x, y は参照するので、スコープの都合上ここで宣言)
	double x;
	double y;
	double z;

	//  z の数式が文法的に正しいか検査
	if( !evaluable(zExpression, 0.0) ){
		alert("z(x,y)の式に誤りがあります。");
		return;
	}

	// xとyの範囲をそれぞれxN,yN分割したメッシュの格子点において、数式からzの値を求め、配列に格納
	float dx = (xMax-xMin)/(xN-1);
	float dy = (yMax-yMin)/(yN-1);
	for( int xi=0; xi<xN; xi++ ){
		for( int yi=0; yi<yN; yi++ ){
			x = xMin + xi * dx;
			y = yMin + yi * dy;

			// 文字列の式を解釈してfloatの値を得る(第2引数は式内の整数を浮動小数点数と見なすオプション)
			z = feval( zExpression, 0.0 );

			xArray[ yi ][ xi ] = x;
			yArray[ yi ][ xi ] = y;
			zArray[ yi ][ xi ] = z;
		}
	}

	// データ配列をグラフソフトウェアに転送し、追加プロット
	addGraph3DData( graph, xArray, yArray, zArray );
}


/**
 * 数式などを入力する、入力画面のGUIを構築して起動します。
 */
void createInputWindow(){

	int leftWidth = 100;
	int rightX = leftWidth + 10;
	int rightWidth = 190;
	int buttonWidth = 290;
	int fontSize = 20;

	window = newWindow( 0, 0, 340, 450, "入力画面" );

	int expressionLabel = newTextLabel( 10, 10, leftWidth, 25, "z(x,y) =" );
	setComponentFontSize(expressionLabel, fontSize);
	mountComponent( expressionLabel, window );

	expressionField = newTextField( rightX, 10, rightWidth, 25, DEFAULT_Z_EXPRESSION );
	setComponentFontSize(expressionField, fontSize);
	mountComponent( expressionField, window );


	int lowX = 10;
	int columnWidth = 70;

	int xMaxLabel = newTextLabel( lowX, 60, columnWidth, 25, "x-max" );
	setComponentFontSize(xMaxLabel, fontSize);
	mountComponent( xMaxLabel, window );

	xMaxField = newTextField( lowX+columnWidth, 60, columnWidth, 25, DEFAULT_X_MAX );
	setComponentFontSize(xMaxField, fontSize);
	mountComponent( xMaxField, window );

	int xMinLabel = newTextLabel( lowX, 90, columnWidth, 25, "x-min" );
	setComponentFontSize(xMinLabel, fontSize);
	mountComponent( xMinLabel, window );

	xMinField = newTextField( lowX+columnWidth, 90, columnWidth, 25, DEFAULT_X_MIN );
	setComponentFontSize(xMinField, fontSize);
	mountComponent( xMinField, window );

	int xNLabel = newTextLabel( lowX, 120, columnWidth, 25, "x-N" );
	setComponentFontSize(xNLabel, fontSize);
	mountComponent( xNLabel, window );

	xNField = newTextField( lowX+columnWidth, 120, columnWidth, 25, DEFAULT_X_N );
	setComponentFontSize(xNField, fontSize);
	mountComponent( xNField, window );


	lowX = 160;
	columnWidth = 70;

	int yMaxLabel = newTextLabel( lowX, 60, columnWidth, 25, "y-max" );
	setComponentFontSize(yMaxLabel, fontSize);
	mountComponent( yMaxLabel, window );

	yMaxField = newTextField( lowX+columnWidth, 60, columnWidth, 25, DEFAULT_Y_MAX );
	setComponentFontSize(yMaxField, fontSize);
	mountComponent( yMaxField, window );

	int yMinLabel = newTextLabel( lowX, 90, columnWidth, 25, "y-min" );
	setComponentFontSize(yMinLabel, fontSize);
	mountComponent( yMinLabel, window );

	yMinField = newTextField( lowX+columnWidth, 90, columnWidth, 25, DEFAULT_Y_MIN );
	setComponentFontSize(yMinField, fontSize);
	mountComponent( yMinField, window );

	int yNLabel = newTextLabel( lowX, 120, columnWidth, 25, "y-N" );
	setComponentFontSize(yNLabel, fontSize);
	mountComponent( yNLabel, window );

	yNField = newTextField( lowX+columnWidth, 120, columnWidth, 25, DEFAULT_Y_N );
	setComponentFontSize(yNField, fontSize);
	mountComponent( yNField, window );


	plotButton = newButton( 10, 160, buttonWidth, 50, "プロット" );
	setComponentFontSize(plotButton, fontSize);
	mountComponent( plotButton, window );


	clearButton = newButton( 10, 220, buttonWidth, 50, "クリア" );
	setComponentFontSize(clearButton, fontSize);
	mountComponent( clearButton, window );

	exportButton = newButton( 10, 280, buttonWidth, 50, "データ出力" );
	setComponentFontSize(exportButton, fontSize);
	mountComponent( exportButton, window );

	exitButton = newButton( 10, 340, buttonWidth, 50, "終了" );
	setComponentFontSize(exitButton, fontSize);
	mountComponent( exitButton, window );
}


/**
 * 現在のデータをファイルに出力します。
 */
void exportFile(){

	// ファイルパスの選択
	string exportFilePath[] = choose();
	if (length(exportFilePath) == 0) {
		return; // 何も選択されなかった場合
	}

	// 拡張子が無ければ付ける
	string name = getFileName( exportFilePath[0] );
	 if( indexOf(name,".") < 0 ){
		 exportFilePath += ".dat3d";
	 }

	// ファイル出力
	exportGraph3DData(graph, exportFilePath[0], "COLUMN_TSV");

	pop( "SAVED: " + exportFilePath[0] );
}


/**
 * 入力画面上の入力項目において、式として評価するのに適さない文字を、適切な文字で置き換えます。
 */
void correctCharactersOnInputWindow() {
	
	setComponentText(
		expressionField, 
		correctCharactersInExpression(
			getComponentText(expressionField)
		)
	);
	
	setComponentText(
		xMaxField, 
		correctCharactersInExpression(
			getComponentText(xMaxField)
		)
	);
	
	setComponentText(
		xMinField, 
		correctCharactersInExpression(
			getComponentText(xMinField)
		)
	);
	
	setComponentText(
		xNField, 
		correctCharactersInExpression(
			getComponentText(xNField)
		)
	);
	
	setComponentText(
		yMaxField, 
		correctCharactersInExpression(
			getComponentText(yMaxField)
		)
	);
	
	setComponentText(
		yMinField, 
		correctCharactersInExpression(
			getComponentText(yMinField)
		)
	);
	
	setComponentText(
		yNField, 
		correctCharactersInExpression(
			getComponentText(yNField)
		)
	);
}


/**
 * 文字列内で、式として評価するのに適さない文字を、適切な文字で置き換えます。
 * 
 * @param 式の内容を格納する文字列
 * @return 適切に文字を置き換えた文字列
 */
string correctCharactersInExpression(string expression) {
	string result = expression;
	
	result = replaceText(result, "×", "*", Text.ALL);
	result = replaceText(result, "÷", "/", Text.ALL);
	result = replaceText(result, "^", "**", Text.ALL);
	result = replaceText(result, "^",  "**", Text.ALL);
	
	result = replaceText(result, "+", "+", Text.ALL);
	result = replaceText(result, "*", "*", Text.ALL);
	result = replaceText(result, "/", "/", Text.ALL);
	result = replaceText(result, "ー", "-", Text.ALL);
	result = replaceText(result, "−", "-", Text.ALL);
	result = replaceText(result, "―", "-", Text.ALL);
	result = replaceText(result, "‐", "-", Text.ALL);
	result = replaceText(result, "ー", "-", Text.ALL);
	result = replaceText(result, "%", "%", Text.ALL);
	result = replaceText(result, "(", "(", Text.ALL);
	result = replaceText(result, ")", ")", Text.ALL);
	
	result = replaceText(result, "A", "A", Text.ALL);
	result = replaceText(result, "B", "B", Text.ALL);
	result = replaceText(result, "C", "C", Text.ALL);
	result = replaceText(result, "D", "D", Text.ALL);
	result = replaceText(result, "E", "E", Text.ALL);
	result = replaceText(result, "F", "F", Text.ALL);
	result = replaceText(result, "G", "G", Text.ALL);
	result = replaceText(result, "H", "H", Text.ALL);
	result = replaceText(result, "I", "I", Text.ALL);
	result = replaceText(result, "J", "J", Text.ALL);
	result = replaceText(result, "K", "K", Text.ALL);
	result = replaceText(result, "L", "L", Text.ALL);
	result = replaceText(result, "M", "M", Text.ALL);
	result = replaceText(result, "N", "N", Text.ALL);
	result = replaceText(result, "O", "O", Text.ALL);
	result = replaceText(result, "P", "P", Text.ALL);
	result = replaceText(result, "Q", "Q", Text.ALL);
	result = replaceText(result, "R", "R", Text.ALL);
	result = replaceText(result, "S", "S", Text.ALL);
	result = replaceText(result, "T", "T", Text.ALL);
	result = replaceText(result, "U", "U", Text.ALL);
	result = replaceText(result, "V", "V", Text.ALL);
	result = replaceText(result, "W", "W", Text.ALL);
	result = replaceText(result, "X", "X", Text.ALL);
	result = replaceText(result, "Y", "Y", Text.ALL);
	result = replaceText(result, "Z", "Z", Text.ALL);
	
	result = replaceText(result, "a", "a", Text.ALL);
	result = replaceText(result, "b", "b", Text.ALL);
	result = replaceText(result, "c", "c", Text.ALL);
	result = replaceText(result, "d", "d", Text.ALL);
	result = replaceText(result, "e", "e", Text.ALL);
	result = replaceText(result, "f", "f", Text.ALL);
	result = replaceText(result, "g", "g", Text.ALL);
	result = replaceText(result, "h", "h", Text.ALL);
	result = replaceText(result, "i", "i", Text.ALL);
	result = replaceText(result, "j", "j", Text.ALL);
	result = replaceText(result, "k", "k", Text.ALL);
	result = replaceText(result, "l", "l", Text.ALL);
	result = replaceText(result, "m", "m", Text.ALL);
	result = replaceText(result, "n", "n", Text.ALL);
	result = replaceText(result, "o", "o", Text.ALL);
	result = replaceText(result, "p", "p", Text.ALL);
	result = replaceText(result, "q", "q", Text.ALL);
	result = replaceText(result, "r", "r", Text.ALL);
	result = replaceText(result, "s", "s", Text.ALL);
	result = replaceText(result, "t", "t", Text.ALL);
	result = replaceText(result, "u", "u", Text.ALL);
	result = replaceText(result, "v", "v", Text.ALL);
	result = replaceText(result, "w", "w", Text.ALL);
	result = replaceText(result, "x", "x", Text.ALL);
	result = replaceText(result, "y", "y", Text.ALL);
	result = replaceText(result, "z", "z", Text.ALL);
	
	result = replaceText(result, "1", "1", Text.ALL);
	result = replaceText(result, "2", "2", Text.ALL);
	result = replaceText(result, "3", "3", Text.ALL);
	result = replaceText(result, "4", "4", Text.ALL);
	result = replaceText(result, "5", "5", Text.ALL);
	result = replaceText(result, "6", "6", Text.ALL);
	result = replaceText(result, "7", "7", Text.ALL);
	result = replaceText(result, "8", "8", Text.ALL);
	result = replaceText(result, "9", "9", Text.ALL);
	result = replaceText(result, "0", "0", Text.ALL);
	result = replaceText(result, ".", ".", Text.ALL);
	
	return result;
}


/**
 * ボタンが押された際にコールされます(イベントハンドラ)。
 * 
 * @param id 押されたボタンのID
 */
void onButtonClick( int id ){

	// 「PLOT」ボタンが押された場合
	if( id == plotButton ){

		// 画面上に入力されている文字列内で、式として評価するのに適さない文字を、適切な文字で置き換え
		correctCharactersOnInputWindow();

		// 以下、画面から入力内容を取得

		// 入力された z の数式を取得
		string zExpression = getComponentText( expressionField );

		// X/Y範囲の最大・最小値やプロット点数の入力内容が、文法的に正しいか検査
		if( !evaluable( getComponentText( xMaxField ), 0.0 ) ){
			alert("x-maxの式に誤りがあります。");
			return;
		}
		if( !evaluable( getComponentText( xMinField ), 0.0 ) ){
			alert("x-minの式に誤りがあります。");
			return;
		}
		if( !evaluable( getComponentText( xNField ), 0.0 ) ){
			alert("x-Nの式に誤りがあります。");
			return;
		}
		if( !evaluable( getComponentText( yMaxField ), 0.0 ) ){
			alert("y-maxの式に誤りがあります。");
			return;
		}
		if( !evaluable( getComponentText( yMinField ), 0.0 ) ){
			alert("y-minの式に誤りがあります。");
			return;
		}
		if( !evaluable( getComponentText( yNField ), 0.0 ) ){
			alert("y-Nの式に誤りがあります。");
			return;
		}

		// X範囲の最大・最小値やプロット点数の入力内容を解釈し、値を求める
		double xMax = feval( getComponentText( xMaxField ), 0.0 );
		double xMin = feval( getComponentText( xMinField ), 0.0 );
		int xN = feval( getComponentText( xNField ), 0.0 );

		// Y範囲の最大・最小値やプロット点数の入力内容を解釈し、値を求める
		double yMax = feval( getComponentText( yMaxField ), 0.0 );
		double yMin = feval( getComponentText( yMinField ), 0.0 );
		int yN = feval( getComponentText( yNField ), 0.0 );

		// z の数式をグラフにプロットする(plotGraph関数はこのファイル内の上の方で定義)
		plotGraph( zExpression, xMin, xMax, xN, yMin, yMax, yN );
		return;
	}

	// 「CLEAR」ボタンが押された場合
	if( id == clearButton ){
		clearGraph3D(graph);
		return;
	}

	// 「EXPORT」ボタンが押された場合
	if( id == exportButton ){
		exportFile();
		return;
	}

	// 「EXIT」ボタンが押された場合
	if( id == exitButton ){
		exit();
		return;
	}
}


/**
 * ウィンドウが閉じられた際にコールされます(イベントハンドラ)。
 * 
 * @param id 閉じられたウィンドウのID
 */
void onWindowClose( int id ){
	if( id == window ){
		exit();
		return;
	}
}


/**
 * グラフが閉じられた際にコールされます(イベントハンドラ)。
 * 
 * @param id 閉じられたグラフのID
 */
void onGraph3DClose( int id ){
	if( id == graph ){
		exit();
		return;
	}
}
download/ZxyGraph3D.vcssl

ライセンス

このVCSSL/Vnanoコード( 拡張子が「.vcssl」や「.vnano」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 記事中にC言語/C++/Java言語などでのサンプルコードが掲載されいてる場合は、それらについても同様です。 そのままでのご利用はもちろん、改造や流用などもご自由に行ってください。

※ ただし、このコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。

※ Vnano の実行環境については、別途スクリプトエンジンのソースコードも一般公開しており、 何らかのソフトウェア内に組み込んでご利用いただく事も可能です。詳細はこちらをご参照ください。

この記事中の商標などについて

  • OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
  • Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
  • Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
  • その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。

Japanese English
[ 前へ | 目次 | 次へ ]
Vnano版 | 積分値のグラフ描画用データを出力するプログラム

数値的に積分を行い、結果の関数をグラフに描くためのデータを出力するコードです。
3Dグラフを回転アニメーションさせるツール

3Dグラフを、Z軸まわりにゆっくりと回転アニメーションさせるツールです。全角度のグラフを、連番の画像ファイルに保存する事もできます。
連番ファイルから3Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、3Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。
連番ファイルから2Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、2Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。
z = f(x,y,t) の形の数式を3Dグラフとしてアニメーション描画するツール

入力欄に z = f(x,y,t) の形の数式を入力すると、それを3次元のグラフにアニメーション描画してくれる簡易ツールです。
y = f(x,t) の形の数式を2Dグラフとしてアニメーション描画するツール

入力欄に y = f(x,t) の形の数式を入力すると、それを2次元のグラフにアニメーション描画してくれる簡易ツールです。
t を媒介変数とする x(t), y(t), z(t) の数式を3Dグラフに描画し、アニメーションもできるツール

入力欄に x(t), y(t), z(t) の形の数式を入力すると、それを t を媒介変数として3次元のグラフに描画し、アニメーションもできる簡易ツールです。
t を媒介変数とする x(t), y(t) の数式を2Dグラフに描画し、アニメーションもできるツール

入力欄に x(t), y(t) の形の数式を入力すると、それを t を媒介変数として2次元のグラフに描画し、アニメーションもできる簡易ツールです。
z = f(x,y) の形の数式を3Dグラフとして描画するツール

入力欄に z = f(x,y) の形の数式を入力すると、それを3次元のグラフに描いてくれる簡易ツールです。
y = f(x) の形の数式を2Dグラフとして描画するツール

入力欄に y = f(x) の形の数式を入力すると、それを2次元のグラフに描いてくれる簡易ツールです。
配列を3Dグラフにアニメーションプロットする(曲面/メッシュグラフ)

座標値配列の内容を、3次元の曲面/メッシュグラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
配列を3Dグラフにアニメーションプロットする(点/線グラフ)

座標値配列の内容を、3次元の点/線グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
配列を2Dグラフにアニメーションプロットする

座標値配列の内容を、2次元グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
配列を3Dグラフにプロットする(曲面/メッシュグラフ)

座標値配列の内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。
ファイルを3Dグラフにプロットする(曲面/メッシュグラフ)

座標値ファイルの内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。
ユーザーが入力した数式を2Dグラフにプロットする

実行時にユーザーが入力した数式の値を、2次元グラフにプロットするサンプルプログラムです。
配列を3Dグラフにプロットする(点/線グラフ)

座標値配列の内容を、3次元の点/線グラフにプロットするサンプルプログラムです。
配列を2Dグラフにプロットする

座標値配列の内容を、2次元グラフにプロットするサンプルプログラムです。
ファイルを3Dグラフにプロットする(点/線グラフ)

座標値ファイルの内容を、3次元の点/線グラフにプロットするサンプルプログラムです。
ファイルを2Dグラフにプロットする

座標値ファイルの内容を、2次元グラフにプロットするサンプルプログラムです。
この階層の目次
[ 前へ | 目次 | 次へ ]
RINEARN からのお知らせ
※ VCSSL は RINEARN が開発しています。

VCSSLの最新版をリリース: 外部プログラムとの連携機能を少し強化、他
2025-05-25 - VCSSL 3.4.52をリリースしました。外部プログラム(C言語製の実行ファイル等)との連携機能を少し強化し、文字化け対策やOS判別などを可能にしました。他にも細かい機能追加があります。詳細をお知らせします。

VCSSLの最新版をリリース、Java 24上での非互換な挙動を対処
2025-04-22 - VCSSL 3.4.50をリリースしました。Java 24環境上でのネットワークドライブ関連のファイルパス解決で、従来環境とは異なる挙動が生じていたのを解消しました。詳細をお知らせします。

リニアングラフやVCSSLの最新版をリリース、目盛りの位置や内容を自由に指定可能に!
2024-11-24 - リニアングラフ3D/2Dを更新し、自由な位置に、自由な表記内容の目盛りを描けるようになりました! 併せて、Java言語やVCSSLでの、プログラム制御用APIも拡張しています。詳細をお知らせします。

Exevalator 2.2 をリリース、TypeScript 対応によりWebブラウザ上で動作可能に
2024-10-22 - オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の2.1をリリースしました。新たに TypeScript に対応し、Webブラウザ上での式計算にも使えるようになりました。詳細を解説します。

アシスタントAI作成の舞台裏(その2、作成編)
2024-10-12 - アシスタントAIの作成方法解説の後編です。実際にChatGPTの「GPTs」機能を用いて、アシスタントAIを作成する手順や、独自の知識をもたせたり、精度を出すためのノウハウなどを解説しています。

アシスタントAI作成の舞台裏(その1、基礎知識編)
2024-10-07 - アシスタントAI作成方法解説の前編です。今回はまず、アシスタントAIを作る前に抑えておきたい、基礎知識を延々と解説しています。そもそもLLM型AIとはどんな存在か? RAGとは何か? 等々です。

ソフトの利用をサポートしてくれるアシスタントAIを提供開始!
2024-09-20 - RINEARN製ソフトの使い方の質問応答や、一部作業のお手伝いをしてくれる、アシスタントAIを提供開始しました。ChatGPTアカウントさえあれば、誰でも無料で使用できます。使い方を解説します。

Exevalator 2.1 をリリース、新たに Visual Basic に対応
2024-07-28 - オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の2.1をリリースしました。今回から、新たに Visual Basic(VB.NET)でも使用できるようになりました。詳細を解説します。

関数電卓 RINPn(りんぷん)、Esc キーで計算式の一発クリアが可能に
2024-07-20 - 関数電 RINPn の Ver.1.0.2 をリリースしました。今回から、キーボードの「 Esc 」キーを押すと、入力中の計算式を一発でクリアできるようになりました。詳細を解説します。

Exevalator 2.0 をリリース、互換性に注意が必要なバグ修正が 1 件
2024-07-14 - オープンソースの式計算ライブラリ「Exevalator (エグゼバレータ)」の2.0をリリースしました。今回の更新では、互換性に注意を要する 1 件のバグ修正があります。詳細を解説します。