0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

三次元グラフ表示アプリOptGraphの外部データの読み込み機能およびDLL関数機能について

0
Last updated at Posted at 2026-02-25

OptGraphのその他の機能については下記のページをご覧ください。

1. 外部デー入力機能の概要

OptGraphは外部で作成したデータを読み込んで、グラフに重ねて表示することが可能です。
外部データはgraph_data.txtに記述して、OptGraph.exeと同じフォルダに置きます。
「Load Data」ボタンを押すことによってデータを読み込み、「Start」ボタンを押すことによって、データをグラフに重ねて表示します。
データを一個づつ表示したい場合は、「Step」ボタンを使用します。

2. 外部データの読み込み関係の操作および表示

赤枠内が外部データの読み込み、および表示に関する部分です。
外部データの読み込み関係の操作および表示4.png

  • Start$\quad:$データ表示の開始
  • Stop$\quad:$データ表示の終了
  • Reset$\quad:$データ表示のリセット(Counterも0になる)
  • Step$\quad:$データ表示のステップ実行
  • Back$\quad:$データ表示を一つ前のデータに戻す
  • Load Data$\quad:$外部データの読み込み
  • Start (Save Imeges)$\quad:$データ表示の開始および画像の保存
  • Interval(msec)$\quad:$外部データを表示するときの更新間隔
  • Counter$\quad:$何番目の外部データを表示しているかを表すカウンター
  • Marker Size$\quad:$外部データを表示するときのマーカーの大きさ
  • Marker Color$\quad:$外部データを表示するときのマーカーの色
    $\quad$0:Red 1:Green 2:Blue 3:DarkRed 4:Olive 5:DarkBlue 6:Orange 7:Lime
    $\quad$8:Cyan 9:Yellow 10:Gold 11:White 12:Black 13:Complementary(補色)
    $\quad$14:Gradation 15:GradationComplementary(グラデーションの補色)
  • Disp Text Data$\quad:$コンソール画面へのテキストデータの表示/非表示
    「Load Data」、「Start」および「Step」ボタンを押したときにコンソール画面に表示されるテキストデータの表示/非表示をコントロールします。

3. 外部入力ファイル【graph_data.txt】の仕様

  • x**2 + y**2$\quad:$一行目には表示する陽関数の数式を記述
    $\quad$
  • ITERATION$\quad$10$\quad:$試行回数
    $\quad$
  • SWARM_SIZE$\quad$10$\quad:$群の大きさ
    $\quad$
  • X_MAX$\quad$10$\quad:$X軸の表示範囲の上限
  • X_MIN$\quad$-10$\quad:$X軸の表示範囲の下限
    $\quad$
  • Y_MAX$\quad$10$\quad:$Y軸の表示範囲の上限
  • Y_MIN$\quad$-10$\quad:$Y軸の表示範囲の下限
    $\quad$
  • Z_MAX$\quad$200$\quad:$Z軸の表示範囲の上限
  • Z_MIN$\quad$0$\quad:$Z軸の表示範囲の下限
    $\quad$
  • DISP_GRAPH1$\quad$1$\quad:$グラフ1の表示(1:表示する、0:表示しない)
  • DISP_GRAPH2$\quad$1$\quad:$グラフ2の表示(1:表示する、0:表示しない)
  • DISP_GRAPH3$\quad$1$\quad:$グラフ3の表示(1:表示する、0:表示しない)
  • DISP_GRAPH4$\quad$1$\quad:$グラフ4の表示(1:表示する、0:表示しない)
    $\quad$
  • DISP_X_AXIS1$\quad$1$\quad:$グラフ1のX軸の表示(1:表示する、0:表示しない)
  • DISP_X_AXIS2$\quad$1$\quad:$グラフ2のX軸の表示(1:表示する、0:表示しない)
  • DISP_X_AXIS3$\quad$1$\quad:$グラフ3のX軸の表示(1:表示する、0:表示しない)
  • DISP_X_AXIS4$\quad$1$\quad:$グラフ4のX軸の表示(1:表示する、0:表示しない)
    $\quad$
  • DISP_Y_AXIS1$\quad$1$\quad:$グラフ1のY軸の表示(1:表示する、0:表示しない)
  • DISP_Y_AXIS2$\quad$0$\quad:$グラフ2のY軸の表示(1:表示する、0:表示しない)
  • DISP_Y_AXIS3$\quad$1$\quad:$グラフ3のY軸の表示(1:表示する、0:表示しない)
  • DISP_Y_AXIS4$\quad$1$\quad:$グラフ4のY軸の表示(1:表示する、0:表示しない)
    $\quad$
  • DISP_Z_AXIS1$\quad$1$\quad:$グラフ1のZ軸の表示(1:表示する、0:表示しない)
  • DISP_Z_AXIS2$\quad$1$\quad:$グラフ2のZ軸の表示(1:表示する、0:表示しない)
  • DISP_Z_AXIS3$\quad$0$\quad:$グラフ3のZ軸の表示(1:表示する、0:表示しない)
  • DISP_Z_AXIS4$\quad$1$\quad:$グラフ4のZ軸の表示(1:表示する、0:表示しない)
    $\quad$
  • DISP_WIRE_FRAME1$\quad$1$\quad:$グラフ1のwire frameの表示(1:表示する、0:表示しない)
  • DISP_WIRE_FRAME2$\quad$1$\quad:$グラフ2のwire frameの表示(1:表示する、0:表示しない)
  • DISP_WIRE_FRAME3$\quad$1$\quad:$グラフ3のwire frameの表示(1:表示する、0:表示しない)
  • DISP_WIRE_FRAME4$\quad$1$\quad:$グラフ4のwire frameの表示(1:表示する、0:表示しない)
    $\quad$
  • DISP_GRADATION1$\quad$1$\quad:$グラフ1のgradationの表示(1:表示する、0:表示しない)
  • DISP_GRADATION2$\quad$1$\quad:$グラフ2のgradationの表示(1:表示する、0:表示しない)
  • DISP_GRADATION3$\quad$1$\quad:$グラフ3のgradationの表示(1:表示する、0:表示しない)
  • DISP_GRADATION4$\quad$1$\quad:$グラフ4のgradationの表示(1:表示する、0:表示しない)
    $\quad$
  • AZIMUTH1$\quad$-60$\quad:$グラフ1の視点の方向角
  • AZIMUTH2$\quad$-90$\quad:$グラフ2の視点の方向角
  • AZIMUTH3$\quad$-90$\quad:$グラフ3の視点の方向角
  • AZIMUTH4$\quad$-60$\quad:$グラフ4の視点の方向角
    $\quad$
  • ZENITH1$\quad$35$\quad:$グラフ1の視点の天頂角
  • ZENITH2$\quad$90$\quad:$グラフ2の視点の天頂角
  • ZENITH3$\quad$0$\quad:$グラフ3の視点の天頂角
  • ZENITH4$\quad$-35$\quad:$グラフ4の視点の天頂角
    $\quad$
  • X0_1$\quad$90$\quad:$グラフ1の画面上の右方向へのオフセット
  • X0_2$\quad$90$\quad:$グラフ2の画面上の右方向へのオフセット
  • X0_3$\quad$90$\quad:$グラフ3の画面上の右方向へのオフセット
  • X0_4$\quad$90$\quad:$グラフ4の画面上の右方向へのオフセット
    $\quad$
  • Y0_1$\quad$280$\quad:$グラフ1の画面上の下方向へのオフセット
  • Y0_2$\quad$300$\quad:$グラフ2の画面上の下方向へのオフセット
  • Y0_3$\quad$250$\quad:$グラフ3の画面上の下方向へのオフセット
  • Y0_4$\quad$100$\quad:$グラフ4の画面上の下方向へのオフセット
    $\quad$
  • SIZE1$\quad$10$\quad:$グラフ1の大きさ
  • SIZE2$\quad$10$\quad:$グラフ2の大きさ
  • SIZE3$\quad$10$\quad:$グラフ3の大きさ
  • SIZE4$\quad$10$\quad:$グラフ4の大きさ
    $\quad$
  • WIRE_FRAME_ROUGHNESS$\quad$2$\quad:$ワイヤーフレームの表示の粗さ
    $\quad$(値が大きいほど粗く、しかし速く表示される)
    $\quad$
  • GRADATION_ROUGHNESS$\quad$10$\quad:$グラデーションの表示の粗さ
    $\quad$(値が大きいほど粗く、しかし速く表示される)
    $\quad$
  • INTERVAL$\quad$100$\quad:$外部データを表示するときの更新間隔(単位:msec)
    $\quad$
  • MARKER_SIZE$\quad$5$\quad:$外部データを表示するときのマーカーの大きさ
    $\quad$
  • MARKER_COLOR$\quad$5$\quad:$外部データを表示するときのマーカーの色
    $\quad$0:Red 1:Green 2:Blue 3:DarkRed 4:Olive 5:DarkBlue 6:Orange 7:Lime
    $\quad$8:Cyan 9:Yellow 10:Gold 11:White 12:Black 13:Complementary(補色)
    $\quad$14:Gradation 15:GradationComplementary(グラデーションの補色)
    $\quad$
  • DISP_TEXT_DATA$\quad$1$\quad:$コンソール画面へのテキストデータの表示
    (1:表示する、0:表示しない)
    「Load Data」、「Start」および「Step」ボタンを押したときにコンソール画面に表示されるテキストデータの表示/非表示をコントロールします。
    $\quad$
  • USE_DLL_FUNCTION$\quad$0$\quad :$DLLに記述されている関数を使う
    (1:使う、0:使わない)
    DLLの関数を使う場合は、テキスト入力ボックスの数式は使われない
    $\quad$
  • LOAD_DLL_FUNCTION_PARAMETERS$\quad$1
    : DLLの関数の設定パラメータを自動的に読みこむ(1:読み込む、0:読み込まない)
    読み込むことが可能なのは、X_MAX、X_MIN、Y_MAX、Y_MIN、Z_MAX、Z_MINの6種類。
    $\quad$
  • DATA$\quad:$これ以降はデータの領域になるという目印
    ※下記は3個の点を位置を変更しながら何回も表示する場合の例

1.66051$\quad$-9.37681$\quad$90.6819$\quad:$1個目の点の$x,y,z$のデータ(1週目)
1.57018$\quad$0.211493$\quad$2.51019$\quad:$2個目の点の$x,y,z$のデータ(1週目)
4.8735$\quad$-5.95996$\quad$59.2721$\quad:$3個目の点の$x,y,z$のデータ(1週目)

3.66375$\quad$-9.64171$\quad$106.386$\quad:$1個目の点の$x,y,z$のデータ(2週目)
2.35267$\quad$6.21998$\quad$44.2232$\quad:$2個目の点の$x,y,z$のデータ(2週目)
-3.18094$\quad$3.17545$\quad$20.2019$\quad:$3個目の点の$x,y,z$のデータ(2週目)

-6.81448$\quad$2.35633$\quad$51.9894$\quad:$1個目の点の$x,y,z$のデータ(3週目)
-5.18479$\quad$3.02591$\quad$36.0382$\quad:$2個目の点の$x,y,z$のデータ(3週目)
-4.86251$\quad$-1.94372$\quad$27.4221$\quad:$3個目の点の$x,y,z$のデータ(3週目)

※ 関数の数式は必ず一行目に書きます
※ データ(DATA以降)は必ず最後に配置します
※ 一行目の数式とデータ(DATA以降)以外の項目は、この順番に並んでいなくても問題ありません。
※ 一行目の数式とITERATION、SWARM_SIZE、データ(DATA以降)以外の項目は、無くても問題ありません。
※ データ群とデータ群の間は一行開けなくても問題ありません。

4. 表示例

4.1 表示例1 1個の点を表示

sample1.cppを実行すると、graph_data.txtというファイルが作成され、中身は「出力結果1」になります。
graph_data.txtをOptGraph.exeと同じディレクトリに置いて「Load Data」ボタンを押すとデータが読み込まれます。
その後「Start」ボタンを押すことによりデータが表示されます。
図4.1A
図1A.gif

図4.1B 設定値
図41B 1個の点を表示 設定値.png

sample1.cpp
// 1個の点を表示

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string str_formula = "x**2 + y**2"; // 数式入力のテキストボックスに表示される数式

const int ITERATION = 1; // 試行回数
const int SWARM_SIZE = 1; // 群の大きさ

double x, y, z; // データの保存用

double function(double x, double y)
{
	double z = x * x + y * y;
	return z;
}

// データの生成
void create_graph_data()
{
	x = 3.0;
	y = 7.0;
	z = function(x, y);
}

// 生成されたデータのファイルへの書き込み
void write_data()
{
	ofstream fout;
	fout.open("graph_data.txt");

	fout << str_formula << endl;
	fout << "ITERATION" << " " << ITERATION << endl;
	fout << "SWARM_SIZE" << " " << SWARM_SIZE << endl;
	fout << "DATA" << endl;
	fout << x << " " << y << " " << z << endl;

	fout.close();
}

int main()
{
	create_graph_data();

	write_data();
}
出力結果1
x**2 + y**2
ITERATION 1
SWARM_SIZE 1
DATA
3 7 58

4.2 表示例2 1個の点をランダムな位置に表示

図4.2A
図2.gif

図4.2B 設定値(図4.1Bと同じ)
図41B 1個の点を表示 設定値.png

sample02.cpp
// 1個の点をランダムな位置に表示

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string str_formula = "x**2 + y**2"; // 数式入力のテキストボックスに表示される数式

const int ITERATION = 1; // 試行回数
const int SWARM_SIZE = 1; // 群の大きさ

double X_MAX = 10; // X軸の表示範囲の上限
double X_MIN = -10; // X軸の表示範囲の下限

double Y_MAX = 10; // Y軸の表示範囲の上限
double Y_MIN = -10; // Y軸の表示範囲の下限

double x, y, z; // データの保存用

double function(double x, double y)
{
	double z = x * x + y * y;
	return z;
}

// 0以上1以下の実数乱数
#define RAND_01 ((double)rand() / RAND_MAX)

// ランダムなデータの生成
void create_graph_data()
{
	x = (X_MAX - X_MIN) * RAND_01 + X_MIN;
	y = (Y_MAX - Y_MIN) * RAND_01 + Y_MIN;
	z = function(x, y);
}

// 生成されたデータのファイルへの書き込み
void write_data()
{
	ofstream fout;
	fout.open("graph_data.txt");

	fout << str_formula << endl;
	fout << "ITERATION" << " " << ITERATION << endl;
	fout << "SWARM_SIZE" << " " << SWARM_SIZE << endl;
	fout << "DATA" << endl;
	fout << x << " " << y << " " << z << endl;

	fout.close();
}

int main()
{
	srand ((unsigned)time(NULL));

	create_graph_data();

	write_data();
}
出力結果2
x**2 + y**2
ITERATION 1
SWARM_SIZE 1
DATA
-7.4102 2.26966 60.0624

4.3 表示例3 1個の点がランダムに動き回る

図4.3A
図3.gif

図4.3B 設定値(図4.1Bと同じ)
図41B 1個の点を表示 設定値.png

sample03.cpp
// 1個の点がランダムに動き回る

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string str_formula = "x**2 + y**2"; // 数式入力のテキストボックスに表示される数式

const int ITERATION = 10; // 試行回数
const int SWARM_SIZE = 1; // 群の大きさ

double X_MAX = 10; // X軸の表示範囲の上限
double X_MIN = -10; // X軸の表示範囲の下限

double Y_MAX = 10; // Y軸の表示範囲の上限
double Y_MIN = -10; // Y軸の表示範囲の下限

double x[ITERATION]; // xのデータ保存用の配列
double y[ITERATION]; // yのデータ保存用の配列
double z[ITERATION]; // zのデータ保存用の配列

double function(double x, double y)
{
	double z = x * x + y * y;
	return z;
}

// 0以上1以下の実数乱数
#define RAND_01 ((double)rand() / RAND_MAX)

// ランダムなデータの生成
void create_graph_data()
{
	for (int i = 0; i < ITERATION; i++) {
		x[i] = (X_MAX - X_MIN) * RAND_01 + X_MIN;
		y[i] = (Y_MAX - Y_MIN) * RAND_01 + Y_MIN;
		z[i] = function(x[i], y[i]);
	}
}

// 生成されたデータのファイルへの書き込み
void write_data()
{
	ofstream fout;
	fout.open("graph_data.txt");

	fout << str_formula << endl;

	fout << "ITERATION" << " " << ITERATION << endl;
	fout << "SWARM_SIZE" << " " << SWARM_SIZE << endl;

	fout << "X_MAX" << " " << X_MAX << endl;
	fout << "X_MIN" << " " << X_MIN << endl;

	fout << "Y_MAX" << " " << Y_MAX << endl;
	fout << "Y_MIN" << " " << Y_MIN << endl;

	fout << "DATA" << endl;
	for (int i = 0; i < ITERATION; i++) {
		fout << x[i] << " " << y[i] << " " << z[i] << endl;
	}

	fout.close();
}

int main()
{
	srand ((unsigned)time(NULL));

	create_graph_data();

	write_data();
}
出力結果3
x**2 + y**2
ITERATION 10
SWARM_SIZE 1
X_MAX 10
X_MIN -10
Y_MAX 10
Y_MIN -10
DATA
-4.6617 8.93246 101.52
6.73696 -9.94385 144.267
2.42897 -9.27366 91.9006
2.35145 9.63439 98.3508
-3.81146 -3.30058 25.421
8.49971 1.52928 74.5838
1.86926 -1.59093 6.02519
-1.4359 -8.58089 75.6935
-5.0499 1.88635 29.0598
7.03848 8.06574 114.596

4.4 表示例4 10個の点がランダムに動き回る(1)

図4.4A
sample04.gif

図4.4B 設定値(図4.1Bと同じ)
図41B 1個の点を表示 設定値.png

sample04.cpp
// 10個の点がランダムに動き回る(1)

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string str_formula = "x**2 + y**2"; // 数式入力のテキストボックスに表示される数式

const int ITERATION = 10; // 試行回数
const int SWARM_SIZE = 10; // 群の大きさ

double X_MAX = 10; // X軸の表示範囲の上限
double X_MIN = -10; // X軸の表示範囲の下限

double Y_MAX = 10; // Y軸の表示範囲の上限
double Y_MIN = -10; // Y軸の表示範囲の下限

double x[ITERATION][SWARM_SIZE]; // xのデータ保存用の配列
double y[ITERATION][SWARM_SIZE]; // yのデータ保存用の配列
double z[ITERATION][SWARM_SIZE]; // zのデータ保存用の配列

double function(double x, double y)
{
	double z = x * x + y * y;
	return z;
}

// 0以上1以下の実数乱数
#define RAND_01 ((double)rand() / RAND_MAX)

// ランダムなデータの生成
void create_graph_data()
{
	for (int i = 0; i < ITERATION; i++) {
		for (int j = 0; j < SWARM_SIZE; j++) {
			x[i][j] = X_MIN + (X_MAX - X_MIN) * RAND_01;
			y[i][j] = Y_MIN + (Y_MAX - Y_MIN) * RAND_01;
			z[i][j] = function(x[i][j], y[i][j]);
		}
	}
}

// 生成されたデータのファイルへの書き込み
void write_data()
{
	ofstream fout;
	fout.open("graph_data.txt");

	fout << str_formula << endl;

	fout << "ITERATION" << " " << ITERATION << endl;
	fout << "SWARM_SIZE" << " " << SWARM_SIZE << endl;

	fout << "X_MAX" << " " << X_MAX << endl;
	fout << "X_MIN" << " " << X_MIN << endl;

	fout << "Y_MAX" << " " << Y_MAX << endl;
	fout << "Y_MIN" << " " << Y_MIN << endl;

	fout << "DATA" << endl;
	for (int i = 0; i < ITERATION; i++) {
		for (int j = 0; j < SWARM_SIZE; j++) {
			fout << x[i][j] << " " << y[i][j] << " " << z[i][j] << endl;
		}
		fout << endl;
	}

	fout.close();
}

int main()
{
	srand ((unsigned)time(NULL));

	create_graph_data();

	write_data();
}
出力結果4
x**2 + y**2
ITERATION 10
SWARM_SIZE 10
X_MAX 10
X_MIN -10
Y_MAX 10
Y_MIN -10
DATA
-0.487381 5.00839 25.3215
-0.655843 -0.164495 0.457188
9.96399 8.47224 171.06
5.16648 -8.26289 94.9678
-7.86981 -9.57579 153.63
7.7398 -2.64199 66.8846
-0.65157 4.22956 18.3137
-3.13517 7.61834 67.8683
7.88812 3.9732 78.0088
-8.41609 -8.50642 143.19

2.50771 -9.68627 100.112
-4.87472 -6.31092 63.5907
-4.05438 -5.49913 46.6785
-4.64827 -4.22346 39.444
-2.01575 -6.3213 44.0221
-8.64986 -1.05502 75.9332
-0.286569 0.605182 0.448367
-3.23038 -3.52458 22.8581
8.60897 0.910367 74.9431
0.549028 -5.93921 35.5756

0.0564592 1.01962 1.04282
-4.35163 6.11316 56.3075
0.953703 -0.134587 0.927664
-3.58501 6.16016 50.7999
-9.00449 7.5103 137.485
-4.79171 -0.51973 23.2306
-2.71035 3.8139 21.8918
-1.09592 -3.92132 16.5778
7.91192 0.261544 62.6669
-4.0904 -7.84967 78.3486

0.0338755 -1.92053 3.68958
-5.68896 -1.86682 35.8492
8.24885 5.77013 101.338
1.77892 1.49754 5.40721
8.70785 9.17966 160.093
7.85211 2.38258 67.3323
4.71603 -2.76589 29.8911
-0.762658 -9.79064 96.4383
9.38658 -3.53496 100.604
8.73653 -0.60213 76.6896

-9.00632 -2.55593 87.6465
8.43013 -7.69463 130.274
-3.34696 6.26331 50.4313
7.75018 7.52556 116.699
-0.0662252 4.1728 17.4166
7.05313 1.65136 52.4737
8.05414 8.51558 137.384
7.33146 2.65297 60.7886
-5.73778 -1.93274 36.6576
6.68142 2.97281 53.4789

-8.9526 -4.07819 96.7808
4.15021 -9.52452 107.941
9.78637 -6.96219 144.245
1.59764 5.37523 31.4455
2.46315 5.57726 37.1729
4.18439 1.26133 19.1001
-8.90866 9.15159 163.116
-9.87915 -1.64464 100.302
0.447096 3.11502 9.90327
-9.70031 7.11539 144.725

-0.248115 8.01813 64.3519
8.4344 -9.68078 164.857
8.92331 9.34751 167.001
2.32826 1.74841 8.4777
-4.9736 -9.31516 111.509
-3.08939 9.59838 101.673
-5.46007 9.40367 118.241
9.64354 2.74026 100.507
7.06839 -1.97424 53.8598
-1.05502 7.96258 64.5158

-3.87371 4.37422 34.1394
-3.75835 -3.69427 27.7728
2.62123 -6.36769 47.4183
-7.72088 6.63686 103.66
6.64602 5.44969 73.8686
-1.68188 4.56099 23.6313
3.22977 9.20408 95.1465
-7.16788 4.81979 74.6089
7.64763 -9.4409 147.617
-5.65294 -4.71236 54.1621

-4.06415 -7.56401 73.7316
-8.97275 -9.3054 167.101
-3.78033 3.51665 26.6577
7.65801 -5.79882 92.2714
-3.51115 -2.58217 18.9958
0.620441 -5.05173 25.9049
4.44441 -4.34553 38.6364
1.51402 -0.287179 2.37474
5.04074 -2.48573 31.5879
0.0265511 6.78518 46.0394

-8.6523 9.9707 174.277
6.69118 0.199286 44.8116
-5.64379 0.762047 32.4331
6.15162 -7.55791 94.9644
7.3571 7.7636 114.4
1.55614 -6.23646 41.315
-9.48851 7.76055 150.258
0.716269 -3.79131 14.8871
-8.75118 -2.22266 81.5234
4.64278 -9.49339 111.68

4.5 表示例5 10個の点がランダムに動き回る(2)

グラフ1に関する設定を全て外部(graph_data.txt)から入力する
図4.5A
図5A.gif

図4.5B 設定値(図4.1Bと同じ)
図41B 1個の点を表示 設定値.png

sample05.cpp
// 10個の点がランダムに動き回る(2)
// グラフ1に関する設定を全て外部(graph_data.txt)から入力

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string str_formula = "x**2 + y**2"; // 数式入力のテキストボックスに表示される数式

const int ITERATION = 10; // 試行回数
const int SWARM_SIZE = 10; // 群の大きさ

double X_MAX = 10; // X軸の表示範囲の上限
double X_MIN = -10; // X軸の表示範囲の下限

double Y_MAX = 10; // Y軸の表示範囲の上限
double Y_MIN = -10; // Y軸の表示範囲の下限

double Z_MAX = 200; // Z軸の表示範囲の上限
double Z_MIN = 0; // Z軸の表示範囲の下限

bool DISP_GRAPH1 = 1; // グラフ1の表示(1:表示する、0:表示しない)

bool DISP_X_AXIS1 = 1; // グラフ1のX軸の表示(1:表示する、0:表示しない)
bool DISP_Y_AXIS1 = 1; // グラフ1のY軸の表示(1:表示する、0:表示しない)
bool DISP_Z_AXIS1 = 1; // グラフ1のZ軸の表示(1:表示する、0:表示しない)

bool DISP_WIRE_FRAME1 = 1; // グラフ1のwire frameの表示(1:表示する、0:表示しない)
bool DISP_GRADATION1 = 1; // グラフ1のgradationの表示(1:表示する、0:表示しない)

int AZIMUTH1 = -60; // グラフ1の視点の方向角
int ZENITH1 = 35; // グラフ1の視点の天頂角

int X0_1 = 80; // グラフ1の画面上の右方向へのオフセット
int Y0_1 = 280; // グラフ1の画面上の下方向へのオフセット

int SIZE1 = 10; // グラフ1の大きさ

int WIRE_FRAME_ROUGHNESS = 2; // ワイヤーフレームの表示の粗さ(値が大きいほど粗く、しかし速く表示される)
int GRADATION_ROUGHNESS = 10; // グラデーションの表示の粗さ(値が大きいほど粗く、しかし速く表示される)

int INTERVAL = 250; // 外部データを表示するときの更新間隔(単位:msec)

int MARKER_SIZE = 5; // 外部データを表示するときのマーカーの大きさ
int MARKER_COLOR = 5; // 外部データを表示するときのマーカーの色[ 0:Red 1:Green 2:Blue 3:DarkRed 4:Olive 5:DarkBlue 6:Orange 7:Lime 8:Cyan 9:Yellow 10:Gold 11:White 12:Black 13:Complementary(補色) 14:Gradation 15:GradationComplementary(グラデーションの補色)]

bool USE_DLL_FUNCTION = 0; // DLLに記述されている関数を使う(テキスト入力ボックスの数式は使わない)
bool LOAD_DLL_FUNCTION_PARAMETERS = 1; // DLLの関数の設定パラメータを自動的に読みこむ

double x[ITERATION][SWARM_SIZE]; // xのデータ保存用の配列
double y[ITERATION][SWARM_SIZE]; // yのデータ保存用の配列
double z[ITERATION][SWARM_SIZE]; // zのデータ保存用の配列

double function(double x, double y)
{
	double z = x * x + y * y;
	return z;
}

// 0以上1以下の実数乱数
#define RAND_01 ((double)rand() / RAND_MAX)

// ランダムなデータの生成
void create_graph_data()
{
	for (int i = 0; i < ITERATION; i++) {
		for (int j = 0; j < SWARM_SIZE; j++) {
			x[i][j] = X_MIN + (X_MAX - X_MIN) * RAND_01;
			y[i][j] = Y_MIN + (Y_MAX - Y_MIN) * RAND_01;
			z[i][j] = function(x[i][j], y[i][j]);
		}
	}
}

// 生成されたデータのファイルへの書き込み
void write_data()
{
	ofstream fout;
	fout.open("graph_data.txt");

	fout << str_formula << endl;

	fout << "ITERATION" << " " << ITERATION << endl;
	fout << "SWARM_SIZE" << " " << SWARM_SIZE << endl;

	fout << "X_MAX" << " " << X_MAX << endl;
	fout << "X_MIN" << " " << X_MIN << endl;

	fout << "Y_MAX" << " " << Y_MAX << endl;
	fout << "Y_MIN" << " " << Y_MIN << endl;

	fout << "Z_MAX" << " " << Z_MAX << endl;
	fout << "Z_MIN" << " " << Z_MIN << endl;

	fout << "DISP_GRAPH1" << " " << DISP_GRAPH1 << endl;

	fout << "DISP_X_AXIS1" << " " << DISP_X_AXIS1 << endl;
	fout << "DISP_Y_AXIS1" << " " << DISP_Y_AXIS1 << endl;
	fout << "DISP_Z_AXIS1" << " " << DISP_Z_AXIS1 << endl;

	fout << "DISP_WIRE_FRAME1" << " " << DISP_WIRE_FRAME1 << endl;
	fout << "DISP_GRADATION1" << " " << DISP_GRADATION1 << endl;

	fout << "AZIMUTH1" << " " << AZIMUTH1 << endl;
	fout << "ZENITH1" << " " << ZENITH1 << endl;

	fout << "X0_1" << " " << X0_1 << endl;
	fout << "Y0_1" << " " << Y0_1 << endl;

	fout << "SIZE1" << " " << SIZE1 << endl;

	fout << "WIRE_FRAME_ROUGHNESS" << " " << WIRE_FRAME_ROUGHNESS << endl;
	fout << "GRADATION_ROUGHNESS" << " " << GRADATION_ROUGHNESS << endl;

	fout << "INTERVAL" << " " << INTERVAL << endl;

	fout << "MARKER_SIZE" << " " << MARKER_SIZE << endl;
	fout << "MARKER_COLOR" << " " << MARKER_COLOR << endl;

	fout << "USE_DLL_FUNCTION" << " " << USE_DLL_FUNCTION << endl;
	fout <<  "LOAD_DLL_FUNCTION_PARAMETERS" << LOAD_DLL_FUNCTION_PARAMETERS << endl;

	fout << "DATA" << endl;
	for (int i = 0; i < ITERATION; i++) {
		for (int j = 0; j < SWARM_SIZE; j++) {
			fout << x[i][j] << " " << y[i][j] << " " << z[i][j] << endl;
		}
		fout << endl;
	}

	fout.close();
}

int main()
{
	srand ((unsigned)time(NULL));

	create_graph_data();

	write_data();
}
出力結果5
x**2 + y**2
ITERATION 10
SWARM_SIZE 10
X_MAX 10
X_MIN -10
Y_MAX 10
Y_MIN -10
Z_MAX 200
Z_MIN 0
DISP_GRAPH1 1
DISP_X_AXIS1 1
DISP_Y_AXIS1 1
DISP_Z_AXIS1 1
DISP_WIRE_FRAME1 1
DISP_GRADATION1 1
AZIMUTH1 -60
ZENITH1 35
X0_1 80
Y0_1 280
SIZE1 10
WIRE_FRAME_ROUGHNESS 2
GRADATION_ROUGHNESS 10
INTERVAL 250
MARKER_SIZE 5
MARKER_COLOR 5
USE_DLL_FUNCTION 0
LOAD_DLL_FUNCTION_PARAMETERS1
DATA
-4.05683 4.691 38.4633
-1.52867 -7.3632 56.5536
6.88772 -5.91906 82.476
-7.88873 0.856044 62.9649
-8.89645 5.94653 114.508
9.57152 9.50377 181.936
1.4951 7.52922 58.9245
1.28269 0.809046 2.29986
0.79928 -7.65923 59.3027
-8.47407 -2.51076 78.1138

4.19294 -5.13718 43.9714
6.82852 0.0497452 46.6311
-0.102847 -8.77926 77.086
6.43666 -2.13111 45.9722
8.42097 3.96649 86.6458
0.483718 -2.80068 8.07781
-8.9465 -0.923185 80.8922
-8.52535 -0.793176 73.3106
8.25495 -6.6863 112.851
4.7203 -8.82687 100.195

-1.46397 0.0558489 2.14634
3.33598 3.99274 27.0707
-1.51219 -8.26899 70.6629
-6.55446 -0.926237 43.8189
-5.44481 6.98111 78.3818
-4.80636 -2.21229 27.9953
7.2045 0.666829 52.3495
5.21104 -3.42143 38.8611
-1.90954 4.86496 27.3141
6.14978 0.860927 38.561

0.862148 -1.0477 1.84098
8.91049 0.834071 80.0925
6.2212 -3.07474 48.1573
3.19071 2.33253 15.6213
1.86743 -9.93042 102.1
1.98401 -4.15632 21.2113
-2.04932 -6.89749 51.775
-4.36079 -3.18766 29.1777
-1.34556 -8.07978 67.0933
1.12522 0.359203 1.39514

-9.46165 1.07212 90.6723
2.10791 3.54228 16.9911
8.26411 9.08506 150.834
5.47899 -1.72704 33.002
8.32698 -0.237129 69.3947
9.95117 8.03583 163.6
-8.57906 7.5927 131.249
-7.65252 -8.49483 130.723
4.06659 -4.62874 37.9624
7.21854 6.21937 90.7879

0.112003 -7.81365 61.0657
5.39354 -4.60189 50.2676
-7.25089 -0.122379 52.5904
7.11112 -8.92819 130.281
-2.33619 6.08936 42.5381
-4.65865 -3.39579 33.2344
-2.06641 -7.93878 67.2943
4.93027 1.76794 27.4331
-8.67855 -6.73452 120.671
-6.81692 -6.52272 89.0163

-9.4293 1.0184 89.9489
7.53166 -4.68551 78.6799
-2.67129 3.19437 17.3398
-4.12091 -1.03549 18.0542
0.33784 -7.8283 61.3965
-4.71847 0.694906 22.7468
-1.49815 -1.87414 5.75687
4.56221 5.99536 56.7581
-0.538041 -4.20515 17.9727
-3.49406 -4.49263 32.3922

-5.69079 2.85623 40.5431
-4.75936 -4.62813 44.0711
-0.950652 -1.97974 4.82309
-5.55406 5.10788 56.9381
3.45317 -3.01492 21.0141
2.00171 6.16199 41.977
-2.08533 -5.64196 36.1803
6.7101 4.24665 63.0595
-1.05747 9.68749 94.9657
-7.2869 8.5876 126.846

3.90728 5.71276 47.9025
-2.772 1.21494 9.16005
-4.326 -3.02591 27.8704
-2.77017 -0.584429 8.01537
7.74163 -3.10465 69.5717
0.703452 4.4792 20.5581
-9.48912 1.46397 92.1866
8.0932 -0.149846 65.5224
9.32188 -2.35572 92.4469
-0.433058 -8.17316 66.9881

-5.14206 -5.35936 55.1635
-6.26514 -4.07941 55.8936
-3.42631 6.13514 49.3795
-6.57155 2.00476 47.2043
-0.257271 1.62694 2.71313
4.18256 1.37547 19.3857
-3.22855 -4.99985 35.422
1.03244 8.85739 79.5192
-6.60756 8.44417 114.964
9.26084 3.06803 95.176

4.6 表示例6 10個の点がランダムに動き回る(3)

グラフ1~4に関する設定を全て外部(graph_data.txt)から入力する
図4.6A
図6A.gif

図4.6B 設定値
図46B 10個の点がランダムに動き回る(3).png

sample06.cpp
// 10個の点がランダムに動き回る(3)
// グラフ1~4に関する設定を全て外部(graph_data.txt)から入力

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string str_formula = "x**2 + y**2"; // 数式入力のテキストボックスに表示される数式

const int ITERATION = 10; // 試行回数
const int SWARM_SIZE = 10; // 群の大きさ

double X_MAX = 10; // X軸の表示範囲の上限
double X_MIN = -10; // X軸の表示範囲の下限

double Y_MAX = 10; // Y軸の表示範囲の上限
double Y_MIN = -10; // Y軸の表示範囲の下限

double Z_MAX = 200; // Z軸の表示範囲の上限
double Z_MIN = 0; // Z軸の表示範囲の下限

bool DISP_GRAPH1 = 1; // グラフ1の表示(1:表示する、0:表示しない)
bool DISP_GRAPH2 = 1; // グラフ2の表示(1:表示する、0:表示しない)
bool DISP_GRAPH3 = 1; // グラフ3の表示(1:表示する、0:表示しない)
bool DISP_GRAPH4 = 1; // グラフ4の表示(1:表示する、0:表示しない)

bool DISP_X_AXIS1 = 1; // グラフ1のX軸の表示(1:表示する、0:表示しない)
bool DISP_X_AXIS2 = 1; // グラフ2のX軸の表示(1:表示する、0:表示しない)
bool DISP_X_AXIS3 = 1; // グラフ3のX軸の表示(1:表示する、0:表示しない)
bool DISP_X_AXIS4 = 1; // グラフ4のX軸の表示(1:表示する、0:表示しない)

bool DISP_Y_AXIS1 = 1; // グラフ1のY軸の表示(1:表示する、0:表示しない)
bool DISP_Y_AXIS2 = 0; // グラフ2のY軸の表示(1:表示する、0:表示しない)
bool DISP_Y_AXIS3 = 1; // グラフ3のY軸の表示(1:表示する、0:表示しない)
bool DISP_Y_AXIS4 = 1; // グラフ4のY軸の表示(1:表示する、0:表示しない)

bool DISP_Z_AXIS1 = 1; // グラフ1のZ軸の表示(1:表示する、0:表示しない)
bool DISP_Z_AXIS2 = 1; // グラフ2のZ軸の表示(1:表示する、0:表示しない)
bool DISP_Z_AXIS3 = 0; // グラフ3のZ軸の表示(1:表示する、0:表示しない)
bool DISP_Z_AXIS4 = 1; // グラフ4のZ軸の表示(1:表示する、0:表示しない)

bool DISP_WIRE_FRAME1 = 1; // グラフ1のwire frameの表示(1:表示する、0:表示しない)
bool DISP_WIRE_FRAME2 = 1; // グラフ2のwire frameの表示(1:表示する、0:表示しない)
bool DISP_WIRE_FRAME3 = 1; // グラフ3のwire frameの表示(1:表示する、0:表示しない)
bool DISP_WIRE_FRAME4 = 1; // グラフ4のwire frameの表示(1:表示する、0:表示しない)

bool DISP_GRADATION1 = 1; // グラフ1のgradationの表示(1:表示する、0:表示しない)
bool DISP_GRADATION2 = 1; // グラフ2のgradationの表示(1:表示する、0:表示しない)
bool DISP_GRADATION3 = 1; // グラフ3のgradationの表示(1:表示する、0:表示しない)
bool DISP_GRADATION4 = 1; // グラフ4のgradationの表示(1:表示する、0:表示しない)

int AZIMUTH1 = -60; // グラフ1の視点の方向角
int AZIMUTH2 = -90; // グラフ2の視点の方向角
int AZIMUTH3 = -90; // グラフ3の視点の方向角
int AZIMUTH4 = -60; // グラフ3の視点の方向角

int ZENITH1 = 35; // グラフ1の視点の天頂角
int ZENITH2 = 90; // グラフ2の視点の天頂角
int ZENITH3 = 0; // グラフ3の視点の天頂角
int ZENITH4 = -35; // グラフ3の視点の天頂角

int X0_1 = 90; // グラフ1の画面上の右方向へのオフセット
int X0_2 = 90; // グラフ2の画面上の右方向へのオフセット
int X0_3 = 90; // グラフ3の画面上の右方向へのオフセット
int X0_4 = 90; // グラフ4の画面上の右方向へのオフセット

int Y0_1 = 280; // グラフ1の画面上の下方向へのオフセット
int Y0_2 = 300; // グラフ2の画面上の下方向へのオフセット
int Y0_3 = 250; // グラフ3の画面上の下方向へのオフセット
int Y0_4 = 100; // グラフ4の画面上の下方向へのオフセット

int SIZE1 = 10; // グラフ1の大きさ
int SIZE2 = 10; // グラフ2の大きさ
int SIZE3 = 10; // グラフ3の大きさ
int SIZE4 = 10; // グラフ4の大きさ

int WIRE_FRAME_ROUGHNESS = 2; // ワイヤーフレームの表示の粗さ(値が大きいほど粗く、しかし速く表示される)
int GRADATION_ROUGHNESS = 10; // グラデーションの表示の粗さ(値が大きいほど粗く、しかし速く表示される)

int INTERVAL = 500; // 外部データを表示するときの更新間隔(単位:msec)

int MARKER_SIZE = 5; // 外部データを表示するときのマーカーの大きさ
int MARKER_COLOR = 5; // 外部データを表示するときのマーカーの色[ 0:Red 1:Green 2:Blue 3:DarkRed 4:Olive 5:DarkBlue 6:Orange 7:Lime 8:Cyan 9:Yellow 10:Gold 11:White 12:Black 13:Complementary(補色) 14:Gradation 15:GradationComplementary(グラデーションの補色)]

bool USE_DLL_FUNCTION = 0; // DLLに記述されている関数を使う(テキスト入力ボックスの数式は使わない)
bool LOAD_DLL_FUNCTION_PARAMETERS = 1; // DLLの関数の設定パラメータを自動的に読みこむ

double x[ITERATION][SWARM_SIZE]; // xのデータ保存用の配列
double y[ITERATION][SWARM_SIZE]; // yのデータ保存用の配列
double z[ITERATION][SWARM_SIZE]; // zのデータ保存用の配列

double function(double x, double y)
{
	double z = x * x + y * y;
	return z;
}

// 0以上1以下の実数乱数
#define RAND_01 ((double)rand() / RAND_MAX)

// ランダムなデータの生成
void create_graph_data()
{
	for (int i = 0; i < ITERATION; i++) {
		for (int j = 0; j < SWARM_SIZE; j++) {
			x[i][j] = X_MIN + (X_MAX - X_MIN) * RAND_01;
			y[i][j] = Y_MIN + (Y_MAX - Y_MIN) * RAND_01;
			z[i][j] = function(x[i][j], y[i][j]);
		}
	}
}

// 生成されたデータのファイルへの書き込み
void write_data()
{
	ofstream fout;
	fout.open("graph_data.txt");

	fout << str_formula << endl;

	fout << "ITERATION" << " " << ITERATION << endl;
	fout << "SWARM_SIZE" << " " << SWARM_SIZE << endl;

	fout << "X_MAX" << " " << X_MAX << endl;
	fout << "X_MIN" << " " << X_MIN << endl;

	fout << "Y_MAX" << " " << Y_MAX << endl;
	fout << "Y_MIN" << " " << Y_MIN << endl;

	fout << "Z_MAX" << " " << Z_MAX << endl;
	fout << "Z_MIN" << " " << Z_MIN << endl;

	fout << "DISP_GRAPH1" << " " << DISP_GRAPH1 << endl;
	fout << "DISP_GRAPH2" << " " << DISP_GRAPH2 << endl;
	fout << "DISP_GRAPH3" << " " << DISP_GRAPH3 << endl;
	fout << "DISP_GRAPH4" << " " << DISP_GRAPH4 << endl;

	fout << "DISP_X_AXIS1" << " " << DISP_X_AXIS1 << endl;
	fout << "DISP_X_AXIS2" << " " << DISP_X_AXIS2 << endl;
	fout << "DISP_X_AXIS3" << " " << DISP_X_AXIS3 << endl;
	fout << "DISP_X_AXIS4" << " " << DISP_X_AXIS4 << endl;

	fout << "DISP_Y_AXIS1" << " " << DISP_Y_AXIS1 << endl;
	fout << "DISP_Y_AXIS2" << " " << DISP_Y_AXIS2 << endl;
	fout << "DISP_Y_AXIS3" << " " << DISP_Y_AXIS3 << endl;
	fout << "DISP_Y_AXIS4" << " " << DISP_Y_AXIS4 << endl;

	fout << "DISP_Z_AXIS1" << " " << DISP_Z_AXIS1 << endl;
	fout << "DISP_Z_AXIS2" << " " << DISP_Z_AXIS2 << endl;
	fout << "DISP_Z_AXIS3" << " " << DISP_Z_AXIS3 << endl;
	fout << "DISP_Z_AXIS4" << " " << DISP_Z_AXIS4 << endl;

	fout << "DISP_WIRE_FRAME1" << " " << DISP_WIRE_FRAME1 << endl;
	fout << "DISP_WIRE_FRAME2" << " " << DISP_WIRE_FRAME2 << endl;
	fout << "DISP_WIRE_FRAME3" << " " << DISP_WIRE_FRAME3 << endl;
	fout << "DISP_WIRE_FRAME4" << " " << DISP_WIRE_FRAME4 << endl;

	fout << "DISP_GRADATION1" << " " << DISP_GRADATION1 << endl;
	fout << "DISP_GRADATION2" << " " << DISP_GRADATION2 << endl;
	fout << "DISP_GRADATION3" << " " << DISP_GRADATION3 << endl;
	fout << "DISP_GRADATION4" << " " << DISP_GRADATION4 << endl;

	fout << "AZIMUTH1" << " " << AZIMUTH1 << endl;
	fout << "AZIMUTH2" << " " << AZIMUTH2 << endl;
	fout << "AZIMUTH3" << " " << AZIMUTH3 << endl;
	fout << "AZIMUTH4" << " " << AZIMUTH4 << endl;

	fout << "ZENITH1" << " " << ZENITH1 << endl;
	fout << "ZENITH2" << " " << ZENITH2 << endl;
	fout << "ZENITH3" << " " << ZENITH3 << endl;
	fout << "ZENITH4" << " " << ZENITH4 << endl;

	fout << "X0_1" << " " << X0_1 << endl;
	fout << "X0_2" << " " << X0_2 << endl;
	fout << "X0_3" << " " << X0_3 << endl;
	fout << "X0_4" << " " << X0_4 << endl;

	fout << "Y0_1" << " " << Y0_1 << endl;
	fout << "Y0_2" << " " << Y0_2 << endl;
	fout << "Y0_3" << " " << Y0_3 << endl;
	fout << "Y0_4" << " " << Y0_4 << endl;

	fout << "SIZE1" << " " << SIZE1 << endl;
	fout << "SIZE2" << " " << SIZE2 << endl;
	fout << "SIZE3" << " " << SIZE3 << endl;
	fout << "SIZE4" << " " << SIZE4 << endl;

	fout << "WIRE_FRAME_ROUGHNESS" << " " << WIRE_FRAME_ROUGHNESS << endl;
	fout << "GRADATION_ROUGHNESS" << " " << GRADATION_ROUGHNESS << endl;

	fout << "INTERVAL" << " " << INTERVAL << endl;

	fout << "MARKER_SIZE" << " " << MARKER_SIZE << endl;
	fout << "MARKER_COLOR" << " " << MARKER_COLOR << endl;

	fout << "USE_DLL_FUNCTION" << " " << USE_DLL_FUNCTION << endl;
	fout <<  "LOAD_DLL_FUNCTION_PARAMETERS" << " " << LOAD_DLL_FUNCTION_PARAMETERS << endl;

	fout << "DATA" << endl;
	for (int i = 0; i < ITERATION; i++) {
		for (int j = 0; j < SWARM_SIZE; j++) {
			fout << x[i][j] << " " << y[i][j] << " " << z[i][j] << endl;
		}
		fout << endl;
	}

	fout.close();
}

int main()
{
	srand ((unsigned)time(NULL));

	create_graph_data();

	write_data();
}
出力結果6
x**2 + y**2
ITERATION 10
SWARM_SIZE 10
X_MAX 10
X_MIN -10
Y_MAX 10
Y_MIN -10
Z_MAX 200
Z_MIN 0
DISP_GRAPH1 1
DISP_GRAPH2 1
DISP_GRAPH3 1
DISP_GRAPH4 1
DISP_X_AXIS1 1
DISP_X_AXIS2 1
DISP_X_AXIS3 1
DISP_X_AXIS4 1
DISP_Y_AXIS1 1
DISP_Y_AXIS2 0
DISP_Y_AXIS3 1
DISP_Y_AXIS4 1
DISP_Z_AXIS1 1
DISP_Z_AXIS2 1
DISP_Z_AXIS3 0
DISP_Z_AXIS4 1
DISP_WIRE_FRAME1 1
DISP_WIRE_FRAME2 1
DISP_WIRE_FRAME3 1
DISP_WIRE_FRAME4 1
DISP_GRADATION1 1
DISP_GRADATION2 1
DISP_GRADATION3 1
DISP_GRADATION4 1
AZIMUTH1 -60
AZIMUTH2 -90
AZIMUTH3 -90
AZIMUTH4 -60
ZENITH1 35
ZENITH2 90
ZENITH3 0
ZENITH4 -35
X0_1 90
X0_2 90
X0_3 90
X0_4 90
Y0_1 280
Y0_2 300
Y0_3 250
Y0_4 100
SIZE1 10
SIZE2 10
SIZE3 10
SIZE4 10
WIRE_FRAME_ROUGHNESS 2
GRADATION_ROUGHNESS 10
INTERVAL 500
MARKER_SIZE 5
MARKER_COLOR 5
USE_DLL_FUNCTION 0
LOAD_DLL_FUNCTION_PARAMETERS 1
DATA
6.97684 8.66512 123.761
4.79843 -9.50987 113.463
8.081 -9.52269 155.984
-9.72594 2.45399 100.616
3.61675 -0.210273 13.1251
3.99335 8.0871 81.348
-8.92148 -9.85839 176.781
-2.74026 7.70013 66.8009
-3.15104 -9.55504 101.228
9.1699 -3.48125 96.2061

7.7221 -7.09342 109.947
-4.66109 0.986053 22.6981
-5.50157 4.73861 52.7217
5.27146 9.16135 111.719
-6.71926 6.78579 91.1954
-1.01779 3.35368 12.2831
0.0833155 -7.8106 61.0124
3.50383 -6.90054 59.8943
4.38765 8.21528 86.7422
-0.100406 -3.37443 11.3969

-2.72744 -5.62853 39.1193
1.4127 8.90072 81.2186
-0.264595 -0.0589007 0.0734801
-6.63259 4.4261 63.5816
6.83645 -5.94836 82.1201
-4.53841 -7.1276 71.3998
-6.7156 -8.58882 118.867
-2.94229 -4.30708 27.208
-3.89996 6.83157 61.88
6.11316 1.83752 40.7472

-0.0357067 1.66662 2.77888
2.36488 -9.30479 92.1717
0.897549 -4.71236 23.012
-4.59883 0.390942 21.3021
-6.12415 4.72945 59.8729
-1.76489 9.54955 94.3087
0.0234993 5.61327 31.5093
-2.98502 -9.3292 95.9443
-1.00314 -2.50343 7.27348
7.49382 3.23038 66.5927

2.18909 6.75588 50.4341
-1.12583 4.62325 22.6419
-7.61711 -9.86999 155.437
-4.32722 7.09403 69.0501
5.47105 -7.93817 92.947
-1.79296 -1.23569 4.74166
-0.128483 -1.05502 1.12959
-7.65801 -3.11319 68.3371
9.26695 3.41472 97.5366
9.129 -8.54976 156.437

4.28449 1.80212 21.6045
4.93393 7.26554 77.1317
-1.25034 -2.125 6.079
2.72073 2.6426 14.3857
6.1333 -4.00189 53.6326
5.07187 -7.19047 77.4267
1.8186 -3.17545 13.3908
-0.392773 -3.83038 14.8261
-3.18216 -1.3419 11.9269
7.40043 -8.45882 126.318

-1.44688 -2.39784 7.8431
-4.96567 4.49751 44.8855
4.33576 9.62279 111.397
0.911588 -9.06552 83.0147
3.16568 7.64824 68.5172
-3.55205 -4.00922 28.6909
-8.52229 -3.16019 82.6163
-7.22526 -3.56182 64.8909
-1.54454 1.14353 3.69327
-6.42811 4.68307 63.2517

6.53981 4.25886 60.907
4.66292 2.48573 27.9217
2.76162 -1.85034 11.0503
0.985443 2.53822 7.41368
6.51723 2.21473 47.3793
1.58055 6.01306 38.6551
9.41527 6.25111 127.724
-6.798 -5.78234 79.6483
-7.18558 0.325022 51.7382
-6.80532 2.47475 52.4368

-1.30772 4.69344 23.7385
-7.75201 -5.65111 92.0287
-0.553911 2.87637 8.58032
7.66106 4.35896 77.6924
2.27149 -8.97275 85.6699
7.73919 7.28507 112.967
-6.2627 6.71682 84.3371
-2.04993 2.20374 9.05868
0.178533 -9.75341 95.1609
9.46043 9.3762 177.413

9.53246 1.64525 93.5746
0.679647 8.11151 66.2586
-9.75219 6.42994 136.449
-7.55852 -6.26881 96.4292
-7.10807 -6.69668 95.3701
7.4395 1.76428 58.4588
-9.9292 -3.12113 108.33
-5.45946 -2.51381 36.1249
0.301828 8.56807 73.503
8.62056 -1.05808 75.4336

4.7 表示例7 山登り法

(4.6)のデータ生成関数を修正して、山登り法に変更しました。

図4.7A
図7A.gif

図4.7B 設定値(図4.6Bと同じ)
図47B 山登り法 設定値.png

sample07.cpp
// 山登り法

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string str_formula = "x**2 + y**2"; // 数式入力のテキストボックスに表示される数式

const int ITERATION = 100; // 試行回数
const int SWARM_SIZE = 10; // 群の大きさ

double X_MAX = 10; // X軸の表示範囲の上限
double X_MIN = -10; // X軸の表示範囲の下限

double Y_MAX = 10; // Y軸の表示範囲の上限
double Y_MIN = -10; // Y軸の表示範囲の下限

double Z_MAX = 200; // Z軸の表示範囲の上限
double Z_MIN = 0; // Z軸の表示範囲の下限

bool DISP_GRAPH1 = 1; // グラフ1の表示(1:表示する、0:表示しない)
bool DISP_GRAPH2 = 1; // グラフ2の表示(1:表示する、0:表示しない)
bool DISP_GRAPH3 = 1; // グラフ3の表示(1:表示する、0:表示しない)
bool DISP_GRAPH4 = 1; // グラフ4の表示(1:表示する、0:表示しない)

bool DISP_X_AXIS1 = 1; // グラフ1のX軸の表示(1:表示する、0:表示しない)
bool DISP_X_AXIS2 = 1; // グラフ2のX軸の表示(1:表示する、0:表示しない)
bool DISP_X_AXIS3 = 1; // グラフ3のX軸の表示(1:表示する、0:表示しない)
bool DISP_X_AXIS4 = 1; // グラフ4のX軸の表示(1:表示する、0:表示しない)

bool DISP_Y_AXIS1 = 1; // グラフ1のY軸の表示(1:表示する、0:表示しない)
bool DISP_Y_AXIS2 = 0; // グラフ2のY軸の表示(1:表示する、0:表示しない)
bool DISP_Y_AXIS3 = 1; // グラフ3のY軸の表示(1:表示する、0:表示しない)
bool DISP_Y_AXIS4 = 1; // グラフ4のY軸の表示(1:表示する、0:表示しない)

bool DISP_Z_AXIS1 = 1; // グラフ1のZ軸の表示(1:表示する、0:表示しない)
bool DISP_Z_AXIS2 = 1; // グラフ2のZ軸の表示(1:表示する、0:表示しない)
bool DISP_Z_AXIS3 = 0; // グラフ3のZ軸の表示(1:表示する、0:表示しない)
bool DISP_Z_AXIS4 = 1; // グラフ4のZ軸の表示(1:表示する、0:表示しない)

bool DISP_WIRE_FRAME1 = 1; // グラフ1のwire frameの表示(1:表示する、0:表示しない)
bool DISP_WIRE_FRAME2 = 1; // グラフ2のwire frameの表示(1:表示する、0:表示しない)
bool DISP_WIRE_FRAME3 = 1; // グラフ3のwire frameの表示(1:表示する、0:表示しない)
bool DISP_WIRE_FRAME4 = 1; // グラフ4のwire frameの表示(1:表示する、0:表示しない)

bool DISP_GRADATION1 = 1; // グラフ1のgradationの表示(1:表示する、0:表示しない)
bool DISP_GRADATION2 = 1; // グラフ2のgradationの表示(1:表示する、0:表示しない)
bool DISP_GRADATION3 = 1; // グラフ3のgradationの表示(1:表示する、0:表示しない)
bool DISP_GRADATION4 = 1; // グラフ4のgradationの表示(1:表示する、0:表示しない)

int AZIMUTH1 = -60; // グラフ1の視点の方向角
int AZIMUTH2 = -90; // グラフ2の視点の方向角
int AZIMUTH3 = -90; // グラフ3の視点の方向角
int AZIMUTH4 = -60; // グラフ3の視点の方向角

int ZENITH1 = 35; // グラフ1の視点の天頂角
int ZENITH2 = 90; // グラフ2の視点の天頂角
int ZENITH3 = 0; // グラフ3の視点の天頂角
int ZENITH4 = -35; // グラフ3の視点の天頂角

int X0_1 = 90; // グラフ1の画面上の右方向へのオフセット
int X0_2 = 90; // グラフ2の画面上の右方向へのオフセット
int X0_3 = 90; // グラフ3の画面上の右方向へのオフセット
int X0_4 = 90; // グラフ4の画面上の右方向へのオフセット

int Y0_1 = 280; // グラフ1の画面上の下方向へのオフセット
int Y0_2 = 300; // グラフ2の画面上の下方向へのオフセット
int Y0_3 = 250; // グラフ3の画面上の下方向へのオフセット
int Y0_4 = 100; // グラフ4の画面上の下方向へのオフセット

int SIZE1 = 10; // グラフ1の大きさ
int SIZE2 = 10; // グラフ2の大きさ
int SIZE3 = 10; // グラフ3の大きさ
int SIZE4 = 10; // グラフ4の大きさ

int WIRE_FRAME_ROUGHNESS = 2; // ワイヤーフレームの表示の粗さ(値が大きいほど粗く、しかし速く表示される)
int GRADATION_ROUGHNESS = 10; // グラデーションの表示の粗さ(値が大きいほど粗く、しかし速く表示される)

int INTERVAL = 100; // 外部データを表示するときの更新間隔(単位:msec)

int MARKER_SIZE = 5; // 外部データを表示するときのマーカーの大きさ
int MARKER_COLOR = 5; // 外部データを表示するときのマーカーの色[ 0:Red 1:Green 2:Blue 3:DarkRed 4:Olive 5:DarkBlue 6:Orange 7:Lime 8:Cyan 9:Yellow 10:Gold 11:White 12:Black 13:Complementary(補色) 14:Gradation 15:GradationComplementary(グラデーションの補色)]

bool USE_DLL_FUNCTION = 0; // DLLに記述されている関数を使う(テキスト入力ボックスの数式は使わない)
bool LOAD_DLL_FUNCTION_PARAMETERS = 1; // DLLの関数の設定パラメータを自動的に読みこむ

double x[ITERATION][SWARM_SIZE]; // xのデータ保存用の配列
double y[ITERATION][SWARM_SIZE]; // yのデータ保存用の配列
double z[ITERATION][SWARM_SIZE]; // zのデータ保存用の配列

// 0以上1以下の実数乱数
#define RAND_01 ((double)rand() / RAND_MAX)

double function(double x, double y)
{
	double z = x * x + y * y;
	return z;
}

// 山登り法のデータの生成
void create_graph_data()
{
	for (int i = 0; i < ITERATION; i++) {
		for (int j = 0; j < SWARM_SIZE; j++) {
			x[i][j] = X_MIN + (X_MAX - X_MIN) * RAND_01;
			y[i][j] = Y_MIN + (Y_MAX - Y_MIN) * RAND_01;
			z[i][j] = function(x[i][j], y[i][j]);
			
			if (i > 0) {
				if (z[i][j] > z[i-1][j]) {
					x[i][j] = x[i-1][j];
					y[i][j] = y[i-1][j];
					z[i][j] = z[i-1][j];
				}
			}
		}
	}
}

// 生成されたデータのファイルへの書き込み
void write_data()
{
	ofstream fout;
	fout.open("graph_data.txt");

	fout << str_formula << endl;

	fout << "ITERATION" << " " << ITERATION << endl;
	fout << "SWARM_SIZE" << " " << SWARM_SIZE << endl;

	fout << "X_MAX" << " " << X_MAX << endl;
	fout << "X_MIN" << " " << X_MIN << endl;

	fout << "Y_MAX" << " " << Y_MAX << endl;
	fout << "Y_MIN" << " " << Y_MIN << endl;

	fout << "Z_MAX" << " " << Z_MAX << endl;
	fout << "Z_MIN" << " " << Z_MIN << endl;

	fout << "DISP_GRAPH1" << " " << DISP_GRAPH1 << endl;
	fout << "DISP_GRAPH2" << " " << DISP_GRAPH2 << endl;
	fout << "DISP_GRAPH3" << " " << DISP_GRAPH3 << endl;
	fout << "DISP_GRAPH4" << " " << DISP_GRAPH4 << endl;

	fout << "DISP_X_AXIS1" << " " << DISP_X_AXIS1 << endl;
	fout << "DISP_X_AXIS2" << " " << DISP_X_AXIS2 << endl;
	fout << "DISP_X_AXIS3" << " " << DISP_X_AXIS3 << endl;
	fout << "DISP_X_AXIS4" << " " << DISP_X_AXIS4 << endl;

	fout << "DISP_Y_AXIS1" << " " << DISP_Y_AXIS1 << endl;
	fout << "DISP_Y_AXIS2" << " " << DISP_Y_AXIS2 << endl;
	fout << "DISP_Y_AXIS3" << " " << DISP_Y_AXIS3 << endl;
	fout << "DISP_Y_AXIS4" << " " << DISP_Y_AXIS4 << endl;

	fout << "DISP_Z_AXIS1" << " " << DISP_Z_AXIS1 << endl;
	fout << "DISP_Z_AXIS2" << " " << DISP_Z_AXIS2 << endl;
	fout << "DISP_Z_AXIS3" << " " << DISP_Z_AXIS3 << endl;
	fout << "DISP_Z_AXIS4" << " " << DISP_Z_AXIS4 << endl;

	fout << "DISP_WIRE_FRAME1" << " " << DISP_WIRE_FRAME1 << endl;
	fout << "DISP_WIRE_FRAME2" << " " << DISP_WIRE_FRAME2 << endl;
	fout << "DISP_WIRE_FRAME3" << " " << DISP_WIRE_FRAME3 << endl;
	fout << "DISP_WIRE_FRAME4" << " " << DISP_WIRE_FRAME4 << endl;

	fout << "DISP_GRADATION1" << " " << DISP_GRADATION1 << endl;
	fout << "DISP_GRADATION2" << " " << DISP_GRADATION2 << endl;
	fout << "DISP_GRADATION3" << " " << DISP_GRADATION3 << endl;
	fout << "DISP_GRADATION4" << " " << DISP_GRADATION4 << endl;

	fout << "AZIMUTH1" << " " << AZIMUTH1 << endl;
	fout << "AZIMUTH2" << " " << AZIMUTH2 << endl;
	fout << "AZIMUTH3" << " " << AZIMUTH3 << endl;
	fout << "AZIMUTH4" << " " << AZIMUTH4 << endl;

	fout << "ZENITH1" << " " << ZENITH1 << endl;
	fout << "ZENITH2" << " " << ZENITH2 << endl;
	fout << "ZENITH3" << " " << ZENITH3 << endl;
	fout << "ZENITH4" << " " << ZENITH4 << endl;

	fout << "X0_1" << " " << X0_1 << endl;
	fout << "X0_2" << " " << X0_2 << endl;
	fout << "X0_3" << " " << X0_3 << endl;
	fout << "X0_4" << " " << X0_4 << endl;

	fout << "Y0_1" << " " << Y0_1 << endl;
	fout << "Y0_2" << " " << Y0_2 << endl;
	fout << "Y0_3" << " " << Y0_3 << endl;
	fout << "Y0_4" << " " << Y0_4 << endl;

	fout << "SIZE1" << " " << SIZE1 << endl;
	fout << "SIZE2" << " " << SIZE2 << endl;
	fout << "SIZE3" << " " << SIZE3 << endl;
	fout << "SIZE4" << " " << SIZE4 << endl;

	fout << "WIRE_FRAME_ROUGHNESS" << " " << WIRE_FRAME_ROUGHNESS << endl;
	fout << "GRADATION_ROUGHNESS" << " " << GRADATION_ROUGHNESS << endl;

	fout << "INTERVAL" << " " << INTERVAL << endl;

	fout << "MARKER_SIZE" << " " << MARKER_SIZE << endl;
	fout << "MARKER_COLOR" << " " << MARKER_COLOR << endl;

	fout << "USE_DLL_FUNCTION" << " " << USE_DLL_FUNCTION << endl;
	fout <<  "LOAD_DLL_FUNCTION_PARAMETERS" << " " << LOAD_DLL_FUNCTION_PARAMETERS << endl;

	fout << "DATA" << endl;
	for (int i = 0; i < ITERATION; i++) {
		for (int j = 0; j < SWARM_SIZE; j++) {
			fout << x[i][j] << " " << y[i][j] << " " << z[i][j] << endl;
		}
		fout << endl;
	}

	fout.close();
}

int main()
{
	srand ((unsigned)time(NULL));

	create_graph_data();

	write_data();
}

4.8 表示例8 ローレンツ・アトラクタ

ローレンツ・アトラクタのプログラムはAIが作成したものを、そのまま流用させてもらいました。
10000点ものデータをコンソール画面に表示すると非常に時間がかかるため、「Disp Text Data」のチェックボックスはOFFにして実行すると、高速に表示されます。
10000よりも多くの点を表示したい場合は、default_setteng.iniの中のSWARM_SIZEの最大値の設定を変更する必要があります。
テキストデータの表示中に中断したい場合は、コンソール画面の右上の終了ボタンを押すと、プログラム全体が終了します。
図4.8
ローレンツ・アトラクタ.png

sample08.cpp
// ローレンツ・アトラクタ

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <stdexcept>

using namespace std;

string str_formula = "0"; // 数式入力のテキストボックスに表示される数式

const int ITERATION = 1; // 試行回数
const int SWARM_SIZE = 10000; // 群の大きさ

double X_MAX = 30; // X軸の表示範囲の上限
double X_MIN = -30; // X軸の表示範囲の下限

double Y_MAX = 30; // Y軸の表示範囲の上限
double Y_MIN = -30; // Y軸の表示範囲の下限

double Z_MAX = 60; // Z軸の表示範囲の上限
double Z_MIN = 0; // Z軸の表示範囲の下限

bool DISP_GRAPH1 = 1; // グラフ1の表示(1:表示する、0:表示しない)

bool DISP_X_AXIS1 = 1; // グラフ1のX軸の表示(1:表示する、0:表示しない)
bool DISP_Y_AXIS1 = 1; // グラフ1のY軸の表示(1:表示する、0:表示しない)
bool DISP_Z_AXIS1 = 1; // グラフ1のZ軸の表示(1:表示する、0:表示しない)

bool DISP_WIRE_FRAME1 = 1; // グラフ1のwire frameの表示(1:表示する、0:表示しない)
bool DISP_GRADATION1 = 0; // グラフ1のgradationの表示(1:表示する、0:表示しない)

int AZIMUTH1 = -45; // グラフ1の視点の方向角
int ZENITH1 = 45; // グラフ1の視点の天頂角

int X0_1 = 80; // グラフ1の画面上の右方向へのオフセット
int Y0_1 = 320; // グラフ1の画面上の下方向へのオフセット

int SIZE1 = 20; // グラフ1の大きさ

int WIRE_FRAME_ROUGHNESS = 2; // ワイヤーフレームの表示の粗さ(値が大きいほど粗く、しかし速く表示される)
int GRADATION_ROUGHNESS = 10; // グラデーションの表示の粗さ(値が大きいほど粗く、しかし速く表示される)

int INTERVAL = 250; // 外部データを表示するときの更新間隔(単位:msec)

int MARKER_SIZE = 1; // 外部データを表示するときのマーカーの大きさ
int MARKER_COLOR = 0; // 外部データを表示するときのマーカーの色
// 0:Red 1:Green 2:Blue 3:DarkRed 4:Olive 5:DarkBlue 6:Orange 7:Lime 8:Cyan 9:Yellow 10:Gold
// 11:White 12:Black 13:Complementary(補色) 14:Gradation 15:GradationComplementary(グラデーションの補色)
bool DISP_READ_DATA = 0; // 読み込んだ外部データをコンソール画面に表示する(1:表示する、0:表示しない)

bool USE_DLL_FUNCTION = 0; // DLLに記述されている関数を使う(テキスト入力ボックスの数式は使わない)
bool LOAD_DLL_FUNCTION_PARAMETERS = 1; // DLLの関数の設定パラメータを自動的に読みこむ

// ローレンツ方程式のパラメータ
struct LorenzParams {
	double sigma; // プラント係数
	double rho;   // レイリー数
	double beta;  // 幾何パラメータ
};

// ローレンツ方程式の微分を計算
void lorenz_deriv(double x, double y, double z, const LorenzParams &p,
				double &dx, double &dy, double &dz) {
	dx = p.sigma * (y - x);
	dy = x * (p.rho - z) - y;
	dz = x * y - p.beta * z;
}

int main() {
	// パラメータ設定(典型的なカオス条件)
	LorenzParams params = {10.0, 28.0, 8.0 / 3.0};

	// 初期条件
	double x = 1.0, y = 1.0, z = 1.0;

	// 時間刻みとステップ数
	double dt = 0.01;
	int steps = SWARM_SIZE;

	// 出力ファイル
	ofstream fout("graph_data.txt");
	if (!fout) {
		cerr << "ファイルを開けませんでした。\n";
		return 1;
	}

	fout << str_formula << endl;

	fout << "ITERATION" << " " << ITERATION << endl;
	fout << "SWARM_SIZE" << " " << SWARM_SIZE << endl;

	fout << "X_MAX" << " " << X_MAX << endl;
	fout << "X_MIN" << " " << X_MIN << endl;

	fout << "Y_MAX" << " " << Y_MAX << endl;
	fout << "Y_MIN" << " " << Y_MIN << endl;

	fout << "Z_MAX" << " " << Z_MAX << endl;
	fout << "Z_MIN" << " " << Z_MIN << endl;

	fout << "DISP_GRAPH1" << " " << DISP_GRAPH1 << endl;

	fout << "DISP_X_AXIS1" << " " << DISP_X_AXIS1 << endl;
	fout << "DISP_Y_AXIS1" << " " << DISP_Y_AXIS1 << endl;
	fout << "DISP_Z_AXIS1" << " " << DISP_Z_AXIS1 << endl;

	fout << "DISP_WIRE_FRAME1" << " " << DISP_WIRE_FRAME1 << endl;
	fout << "DISP_GRADATION1" << " " << DISP_GRADATION1 << endl;

	fout << "AZIMUTH1" << " " << AZIMUTH1 << endl;
	fout << "ZENITH1" << " " << ZENITH1 << endl;

	fout << "X0_1" << " " << X0_1 << endl;
	fout << "Y0_1" << " " << Y0_1 << endl;

	fout << "SIZE1" << " " << SIZE1 << endl;

	fout << "WIRE_FRAME_ROUGHNESS" << " " << WIRE_FRAME_ROUGHNESS << endl;
	fout << "GRADATION_ROUGHNESS" << " " << GRADATION_ROUGHNESS << endl;

	fout << "INTERVAL" << " " << INTERVAL << endl;

	fout << "MARKER_SIZE" << " " << MARKER_SIZE << endl;
	fout << "MARKER_COLOR" << " " << MARKER_COLOR << endl;
	fout << "DISP_READ_DATA" << " " << DISP_READ_DATA << endl;

	fout << "USE_DLL_FUNCTION" << " " << USE_DLL_FUNCTION << endl;
	fout <<  "LOAD_DLL_FUNCTION_PARAMETERS" << LOAD_DLL_FUNCTION_PARAMETERS << endl;

	fout << "DATA" << endl;

	fout << fixed << setprecision(6);
//	fout << "t,x,y,z\n"; // CSV ヘッダ

	// 数値積分(オイラー法)
	double t = 0.0;
	for (int i = 0; i < steps; ++i) {
//		fout << t << "," << x << "," << y << "," << z << "\n";
		fout << x << " " << y << " " << z << endl;

		double dx, dy, dz;
		lorenz_deriv(x, y, z, params, dx, dy, dz);

		// オイラー法で更新
		x += dx * dt;
		y += dy * dt;
		z += dz * dt;
		t += dt;
	}

	fout.close();
	cout << "計算完了: graph_data.txt に保存しました。\n";
	return 0;
}

5. 動画への変換について

【Start (Save Images)】ボタンを押すことにより、各データの状態をpng画像として保存することができます。
png画像は下記のように1番から順番に番号が振られます。
Graph00001、Graph00002、Graph00003、・・・
連番のpng画像を「HD Video Converter Factory Pro」やフリーソフトの「ImageMagic」を使うことによりgif動画などに変換することが可能です。
以下は私がImageMagicでpngからgifに変換するときに使っているバッチファイルです。

gifconv.bat
magick -limit thread 1 -dispose background -delay 50 -loop 0 graph*.png output.gif

6. DLLによる関数機能について

図6.1の赤枠内がDLL関数の操作に関係する部分です。
OptGraphではDLLを用いることにより、C++で作成した関数を使用することができます。
DLLの関数を使う場合は、「Use Dll Function」のチェックボックスにチェックを入れます。
その下にある「Load Dll Function Settings」のチェックボックスにチェックを入れておくと、load_dll_function_parameters関数に記述してある設定条件が自動的に読み込まれます。
DLLの関数が使われるときは、最上部の数式エリアに記述されている関数は使われません。
DLLでは、一行では書けないような複雑な関数も記述可能です。
$\quad$

  • Use Dll Function
    DLLに記述されている関数を使用する。
    $\quad$
  • Load Dll Function Parameters
    DLLに記述されている関数の設定値を自動的に読み込む。
    読み込むことが可能なのは、X_MAX、X_MIN、Y_MAX、Y_MIN、Z_MAX、Z_MINの6種類。
    $\quad$
    Visual Studio 2022の場合、図6.2に示すように新しいプロジェクトの作成時に「ダイナミック リンクライブラリ(DLL)」を選択して、図6.3に示すように「OptGraphDll」の名前でプロジェクトを作成します。
    その後、図6.4に示すようにソースファイルにdll_function.cppを追加し、ヘッダーファイルにdll_function.hを追加します。
    ビルドしてできたOptGraphDll.dllは、OptGraph.exeと同じディレクトリに配置します。
    図6.1
    図61.png

図6.2
make_dll1.png

図6.3
make_dll2a.png

図6.4
make_dll3.png

dll_function.cpp
#include "pch.h"

#define _USE_MATH_DEFINES
#include <math.h>

#define OptGraph_DLL_EXPORTS

#include "dll_function.h"

double X_MAX; // X軸の表示範囲の上限
double X_MIN; // X軸の表示範囲の下限

double Y_MAX; // Y軸の表示範囲の上限
double Y_MIN; // Y軸の表示範囲の下限

double Z_MAX; // Z軸の表示範囲の上限
double Z_MIN; // Z軸の表示範囲の下限

// あらかじめ設定されている関数
double dll_function(double x, double y)
{
	double z = x * x + y * y;
	return z;
}

// DLLに記述されている関数の設定条件
void load_dll_function_parameters()
{
	X_MAX = 10;
	X_MIN = -10;
	Y_MAX = 10;
	Y_MIN = -10;
	Z_MAX = 200;
	Z_MIN = 0;
}
dll_function.h
#pragma once

#ifdef OptGraph_DLL_EXPORTS
#define OptGraph_DLL_API __declspec(dllexport)
#else
#define OptGraph_DLL_API __declspec(dllimport)
#endif

extern "C" OptGraph_DLL_API double X_MAX; // X軸の表示範囲の上限
extern "C" OptGraph_DLL_API double X_MIN; // X軸の表示範囲の下限
extern "C" OptGraph_DLL_API double Y_MAX; // Y軸の表示範囲の上限
extern "C" OptGraph_DLL_API double Y_MIN; // Y軸の表示範囲の下限
extern "C" OptGraph_DLL_API double Z_MAX; // Z軸の表示範囲の上限
extern "C" OptGraph_DLL_API double Z_MIN; // Z軸の表示範囲の下限

extern "C" OptGraph_DLL_API double dll_function(double x, double y);
extern "C" OptGraph_DLL_API void load_dll_function_parameters();
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?