OptGraphのその他の機能については下記のページをご覧ください。
1. 外部デー入力機能の概要
OptGraphは外部で作成したデータを読み込んで、グラフに重ねて表示することが可能です。
外部データはgraph_data.txtに記述して、OptGraph.exeと同じフォルダに置きます。
「Load Data」ボタンを押すことによってデータを読み込み、「Start」ボタンを押すことによって、データをグラフに重ねて表示します。
データを一個づつ表示したい場合は、「Step」ボタンを使用します。
2. 外部データの読み込み関係の操作および表示
- 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

// 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();
}
x**2 + y**2
ITERATION 1
SWARM_SIZE 1
DATA
3 7 58
4.2 表示例2 1個の点をランダムな位置に表示
// 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();
}
x**2 + y**2
ITERATION 1
SWARM_SIZE 1
DATA
-7.4102 2.26966 60.0624
4.3 表示例3 1個の点がランダムに動き回る
// 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();
}
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)
// 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();
}
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

// 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();
}
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

// 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();
}
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)のデータ生成関数を修正して、山登り法に変更しました。
// 山登り法
#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

// ローレンツ・アトラクタ
#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に変換するときに使っているバッチファイルです。
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
#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;
}
#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();










