解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

C# の List の 2次元配列みたいな使い方



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


前の記事でListを使ってみましたが、使い勝手が良さそうなので、2次元配列みたいな使い方をしてます。

C# の List の使い方 - 解析エンジニアの自動化 blog



動作環境


Windows 7
Visual Studio 2017



プログラム

ソースコード


using System;
using System.Collections.Generic;
 
namespace List_How_to_use
{
    class Program
    {
        static void Main(string[] args)
        {
            // 2 次元配列のように扱える List の定義
            var varList = new List<List<int>>();
 
            // 代入する要素の作成用変数
            int calc = 0;
 
            // List に要素を代入する
            for(int i = 0; i < 10; i++)
            {
                // i 行目の要素に List を作成する
                varList.Add(new List<int>());
 
                // i 行目の要素を作成・追加する
                for(int j = 0; j < 10; j++)
                {
                    // 要素の作成
                    calc = i * j;
 
                    // 要素の追加
                    varList[i].Add(calc);
                }
            }
 
            // 出力( 10 × 10 の数値が表示される)
            // i 行目のループ
            for(int i = 0; i < varList.Count; i++)
            {
                // j 列目のループ
                for(int j = 0; j < varList[i].Count; j++)
                {
                    // j 列目が最後の要素なら
                    if(j + 1 == varList[i].Count)
                    {
                        Console.WriteLine(string.Format("{0, 4}", varList[i][j]));
                    }
                    // j 列目が最後の要素では無いなら
                    else
                    {
                        Console.Write(string.Format("{0, 4}", varList[i][j]));
                    }
                }
            }
 
            // 何かキーが押されるまで待つ
            Console.ReadKey();
        }
    }
}



結果

2次元配列の様に使えました。

図2 出力結果



コメント

Listは使えますね。

とっつきにくくて、Listは使ってこなかったんですが、早く使うべきでした。

ソートや削除の方法もやってみたいと思います。



以上

C# の List の使い方



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


C言語でもVBでも配列をよく使ってきました。

C#では配列の動的な追加、削除の方法が調べてもよく分からず、だいたいListを使う方法が推奨されていました。

C#を使う上でListの使い方を覚えておく必要性はかなり高いと感じたので記事にします。



動作環境


Windows 7
Visual Studio 2017



プログラム

ソースコード


using System;
using System.Collections.Generic;
 
namespace List_How_to_use
{
    class Program
    {
        static void Main(string[] args)
        {
            // List の作成
            var varList = new List<string>();
 
            // List の要素追加
            varList.Add("one");
            varList.Add("two");
            varList.Add("three");
            varList.Add("four");
            varList.Add("five");
 
            // 出力
            Console.WriteLine("[{0}]", string.Join(", ", varList));
 
            // 何かキーが押されるまで待つ
            Console.ReadKey();
        }
    }
}



結果

配列のように扱えました。

図2 出力結果



コメント

かなり使いやすい印象です。

今度はListを2次元配列の様に扱う方法を試してみたいです。



以上

VBA からは操作可能なシートの保護方法



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Excel VBA でアプリケーションを作った時に、ユーザーに触って欲しくないセルや設定などがあったりします。

そんな時はセルの設定で『ロック』する指定を行い、『シートの保護』を行えば、セルをロックすることができます。

しかし、 VBA からもロックしたセルの値の取得などが出来なくなります。

そこで、 VBA からの操作は出来るけど、ユーザーの操作は出来ないといった設定を行います。



動作環境


Windows 7
Excel 2007



プログラム

ソースコード

このソースコードは VBE の ThisWorkbook モジュールに記述します。

VBE は Excel 画面が表示されている時に Alt+F11 を押すと起動します。

図1 VBE 画面

Private Sub Workbook_Open()
   
    With ThisWorkbook.Worksheets("保護したいシート名")
       
        ' シートが保護されていない場合
        If .ProtectContents = False Then
           
            ' VBAからの変更はできるパスワード付き保護をかける(描画オブジェクトの操作も出来る)
            .Protect UserInterfaceOnly:=True, Password:="pass", DrawingObjects:=False
           
        ' シートが保護されている場合
        Else
           
            ' パスワード付き保護の解除
            .Unprotect Password:="pass"
           
            ' VBAからの変更はできるパスワード付き保護をかける(描画オブジェクトの操作も出来る)
            .Protect UserInterfaceOnly:=True, Password:="pass", DrawingObjects:=False
           
        End If
       
    End With
   
End Sub



結果

ソースコードを書き込んだ Excel ファイルを起動すると、 VBA が自動でシートを保護します。

セルに何か入力しようとすると図2 の様なアラートが表示されます。

図2 保護成功



コメント

シートの保護の Protect メソッドの引数は以下の通りたくさんあります。

上のソースコードでは DrawingObjects の VBA 操作を許可しています。

必要に応じて、以下の引数を調べてみてください。

DrawingObjects
Contents
Scenarios
UserInterfaceOnly
AllowFormattingCells
AllowFormattingColumns
AllowFormattingRows
AllowInsertingColumns
AllowInsertingRows
AllowInsertingHyperlinks
AllowDeletingColumns
AllowDeletingRows
AllowSorting
AllowFiltering
AllowUsingPivotTables



以上

C# で2次元の凸包(グラハムスキャン)を計算する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


板の上に数本の釘が刺さっていて、その全ての釘の外側から輪ゴムをかけた時に出来る多角形を求めることを凸包と言います。

簡単なものであれば、パターンマッチングや点の範囲を割り出す時に使えます。

範囲と範囲の重なりや離れ具合なんかを計算する時にも使えます。

2次元の平面上で凸包された輪郭線を検出したくなったので C# で作成しました。




動作環境


Windows 7
Visual Studio 2017
・OpenCvSharp



プログラム

仕様

以前、3次元点群データを作成する記事を書きました。
C# でテスト用3次元点群データを作成する - 解析エンジニアの自動化 blog


せっかくなので、このプログラムで作成した点群データを使って、凸包します。
記事の通りのプログラムを実行すれば、デスクトップに Test-Nodes-Data.txt というファイルが作成されます。

プログラムを使う流れを考えます。

①上の記事のプログラムで作った点の情報が記述されたテキストファイルをGUIのテキストボックスにドラッグ&ドロップする。

②実行ボタンを押す。

以上!!

この仕様に見合ったGUIを考えます。

GUI

作成したGUIは図1 の通りです。

2種類のコントロールを合計3つ設置しただけのとても簡単なものです。

・テキストボックス
・ボタン(実行)
・ボタン(キャンセル)

図1 GUI


ソースコード

描画は OpenCvSharp を使いました。

OpenGL(OpenTK)でも良かったのですが、後で OpenCV を使って凸包の結果に対して、さらに何らかの処理をする事を考えて、 OpenCV にしました。

今回はソースコードが長いので、もし、確認するのであれば、 Visual Studio にコピペして確認することをお勧めします。

using System;
using System.Collections;
using System.Windows.Forms;
using System.IO;
using OpenCvSharp.CPlusPlus;
 
namespace ConvexHuller
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void DD(object sender, DragEventArgs e)
        {
            // ドロップファイルの取得
            string[] args = (string[])e.Data.GetData(DataFormats.FileDrop, false);
 
            // ドロップファイル数の取得
            int args_cnt = args.Length;
 
            // ドロップファイル数のチェック
            if (args_cnt > 1)
            {
                MessageBox.Show("引数が多すぎます。" + Environment.NewLine + "ファイルを1つだけドロップしてください。");
                return;
            }
 
            // sender をテキストボックスとして変数化
            TextBox txtTgt = sender as TextBox;
 
            // sender がテキストボックスではないなら終了
            if (txtTgt == null)
            {
                return;
            }
 
            // テキストボックスにファイル名出力
            txtTgt.Text = args[0];
        }
 
        private void DE(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.All;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
 
        //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
        // 凸包
        // ConvexHull(points)
        //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
        private double[][] ConvexHull(double[][] points)
        {
            // 引き渡されたジャグ配列が何行あるかを取得
            int Num = points.Length;
 
            // 同じ行数のジャグ配列の作成
            double[][] convex = new double[Num][];
 
            // Y の値が小さい、かつ、 X の値が大きいキー座標を探す
            int limit = 0; // キー座標の要素番号記憶用変数
            for (int i = 1; i < Num; i++)
            {
                // 小さい Y の値を見つけたら、要素番号を記憶する
                if (points[limit][1] > points[i][1]) { limit = i; }
 
                // Y の値が同じであっても、 X の値が大きければ要素番号を記憶する
                else if (points[limit][1] == points[i][1] && points[limit][0] < points[i][0])
                { limit = i; }
            }
 
            // キー座標からみた角度を求める 以下のような並び順の配列を作る。ただし、キー座標の角度はゼロにする
            // 角度 要否ID X座標 Y座標(3次元座標を持つ場合は凸包したい平面における座標値とする)
            // なお、要否ID => 要:0 否:-1
            double theta = 0; // 角度
            for (int i = 0; i < Num; i++)
            {
                // キー座標なら、角度=0、要否ID=0、X座標、Y座標
                if (limit == i)
                {
                    convex[i] = new double[] { 0, 0, points[i][0], points[i][1] };
                }
               
                // キー座標以外は角度を算出して配列の作成
                else
                {
                    theta = Math.Atan2(points[i][1] - points[limit][1], points[i][0] - points[limit][0]);
                    if (theta < 0) { theta = 2 * Math.PI + theta; }
                    convex[i] = new double[] { theta, 0, points[i][0], points[i][1] };
                }
            }
 
            // ゼロ列目の角度の大きい順にソートする
            Array.Sort(convex, StructuralComparisons.StructuralComparer);
 
            // 角HIJ 計算:角度がマイナスのI点はIDを-1として事実上、無きものとする
            int del = 0;       // 要素番号の増減用変数
            int h;             //
            int j;             //
            double theta1 = 0; //
            double theta2 = 0; //
            int cntMinus = 0;  // 要否IDが否になった要素数カウンタ
 
            for (int i = 1; i < Num; i++)
            {
                if (convex[i][1] == -1)
                {
                    while (convex[i][1] == -1) { i += del; }
                }
 
                del = 1; // 次のループのために初期化する
 
                h = i - del; // i点の1個前の点の要素番号を設定する
                j = i + del; // i点の1個後の点の要素番号を設定する
 
                // h 点の探索
                // 要否ID が「否」ならさらに1個前の要素番号を調べて要否ID が「要」の要素を見つける
                while (convex[h][1] == -1) { del++; h = i - del; }
 
                del = 1; // 次のループのために初期化する
 
                // i点の1個後のj点の要素番号が配列の外に到達してしまったら
                if (j == Num) { j = 0; }
 
                // j 点の探索
                // 要否ID が「否」ならさらに1個後の要素番号を調べて要否ID が「要」の要素を見つける
                while (convex[j][1] == -1)
                {
                    del++;
                    j = i + del;
                    // i点の1個後のj点の要素番号が配列の外に到達してしまったら
                    if (j == Num) { j = 0; }
                }
 
                del = 1; // 次のループのために初期化する
 
                // i-h角度の算出
                theta1 = Math.Atan2(convex[i][3] - convex[h][3], convex[i][2] - convex[h][2]);
                if (theta1 < 0) { theta1 = 2 * Math.PI + theta1; }
 
                // j-i角度の算出
                theta2 = Math.Atan2(convex[j][3] - convex[i][3], convex[j][2] - convex[i][2]);
                if (theta2 < 0) { theta2 = 2 * Math.PI + theta2; }
 
                // 角度がマイナスなら要否ID を「否」にして要素数を減少させる
                if (theta2 - theta1 < 0)
                {
                    convex[i][1] = -1; cntMinus++;
                    while (convex[i][1] == -1) { i -= del; }
                    i--;
                }
 
                del = 1; // 次のループのために初期化する
            }
 
            // 戻り値用に配列に入れ直す
            // ジャグ配列の準備
            double[][] ret = new double[Num - cntMinus][];
            int cnt = 0; // 要素番号カウンタ
            for (int i = 0; i < convex.Length; i++)
            {
                // 要素ID が「否」なら戻り値から除外する
                if (convex[i][1] != -1)
                {
                    ret[cnt] = new double[] { convex[i][2], convex[i][3] };
                    cnt++;
                }
            }
 
            // 戻り値
            return ret;
        }
 
        //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
        // OpenCV
        // 凸包描画関数
        // PlotConvexHull(img, points, Ox, Oy)
        //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
        private void PlotConvexHull(Mat img, double[][] points, double Ox, double Oy)
        {
            for (int i = 0; i < points.Length; i++)
            {
                // ジャグ配列で最後の要素はジャグ配列の先頭の要素と直線で結ぶため、要素番号を恣意的に操作して直線で結ぶ
                if (i + 1 == points.Length)
                {
                    Cv2.Line(img, new OpenCvSharp.CPlusPlus.Point(Ox + points[i][0], Oy - points[i][1]), new OpenCvSharp.CPlusPlus.Point(Ox + points[0][0], Oy - points[0][1]), new Scalar(0, 0, 255), 1);
                }
                // ジャグ配列の今のi要素とi+1要素を直線で結ぶ
                else
                {
                    Cv2.Line(img, new OpenCvSharp.CPlusPlus.Point(Ox + points[i][0], Oy - points[i][1]), new OpenCvSharp.CPlusPlus.Point(Ox + points[i + 1][0], Oy - points[i + 1][1]), new Scalar(0, 0, 255), 1);
                }
            }
        }
 
        //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
        // OpenCV
        // ×点の OpenCV 出力
        // Cv2PlotPoint(img, points, Ox, Oy)
        //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
        private void Cv2PlotPoint(Mat img, double[][] point, double Ox, double Oy)
        {
            // ×印で点を描画する際の×の長さ設定
            double xLength = 1.5;
            double deltaX = xLength / Math.Sqrt(2);
            double deltaY = xLength / Math.Sqrt(2);
 
            // ×印で点を描画する
            for (int i = 0; i < point.Length; i++)
            {
                // ×の\の描画
                Cv2.Line(img, new OpenCvSharp.CPlusPlus.Point(Ox + point[i][0] - deltaX, Oy - point[i][1] - deltaY), new OpenCvSharp.CPlusPlus.Point(Ox + point[i][0] + deltaX, Oy - point[i][1] + deltaY), new Scalar(255, 255, 255));
 
                // ×の/の描画
                Cv2.Line(img, new OpenCvSharp.CPlusPlus.Point(Ox + point[i][0] + deltaX, Oy - point[i][1] - deltaY), new OpenCvSharp.CPlusPlus.Point(Ox + point[i][0] - deltaX, Oy - point[i][1] + deltaY), new Scalar(255, 255, 255));
            }
        }
 
        //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        // 実行ボタン
        //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        private void button1_Click(object sender, EventArgs e)
        {
            // このメソッドへのパラメータ
            string arg = textBox1.Text;
 
            string sDir;
            string sFile;
 
            string[] sReadLines;
 
            int cntNodes = 0;
 
            string[] delimLine;
 
            double sX;
            double sZ;
 
            double minX = 0; double maxX = 0; double minZ = 0; double maxZ = 0;
 
            // 引数ファイルの情報取得
            sDir = Path.GetDirectoryName(arg);
            sFile = Path.GetFileNameWithoutExtension(arg);
 
            // 引数ファイルの読み込み
            sReadLines = File.ReadAllLines(arg);
 
            // ノード情報の数をカウント
            for (int j = 0; j < sReadLines.Length; j++)
            {
                if (sReadLines[j].IndexOf('*') == -1)
                {
                    cntNodes++;
                }
            }
 
            // ノード数分のジャグ配列を用意する
            double[][] coorXZ = new double[cntNodes][];
 
            // ノードの X , Z 座標ジャグ配列を作成
            cntNodes = 0;
            for (int j = 0; j < sReadLines.Length; j++)
            {
                if (sReadLines[j].IndexOf('*') == -1)
                {
                    delimLine = sReadLines[j].Split(',');
 
                    sX = double.Parse(delimLine[1]);
                    sZ = double.Parse(delimLine[3]);
 
                    if (minX > sX) { minX = sX; }
                    if (maxX < sX) { maxX = sX; }
                    if (minZ > sZ) { minZ = sZ; }
                    if (maxZ < sZ) { maxZ = sZ; }
 
                    coorXZ[cntNodes] = new double[] { sX, sZ };
                    cntNodes++;
                }
            }
 
            // 凸包
            double[][] outXZ = ConvexHull(coorXZ);
 
            // 原点とマージン設定
            double Ox = 0; double Oz = 0; double margin = 25;
 
            // 画面サイズ
            double justHeight = margin + Math.Abs(maxZ - minZ) + margin;
            double justWidth = margin + Math.Abs(maxX - minX) + margin;
            int screenHeight = (int)Math.Ceiling(justHeight); // 小数点切り上げ
            int screenWidth = (int)Math.Ceiling(justWidth);   // 小数点切り上げ
 
            if (minX < 0) { Ox = Math.Abs(0 - minX) + margin; }
            else { Ox = -minX + margin; }
 
            if (minZ < 0) { Oz = Math.Abs(0 - minZ) + margin; }
            else { Oz = screenHeight - minZ + margin; }
 
            // Mat クラスで画像を作成する
            Mat img1 = new Mat(screenHeight, screenWidth, MatType.CV_8UC3, new Scalar(0, 0, 0));
            Mat imgGray1 = new Mat(screenHeight, screenWidth, MatType.CV_8SC1, new Scalar(0, 0, 0));
            Mat imgBinary1 = new Mat(screenHeight, screenWidth, MatType.CV_8SC1, new Scalar(0, 0, 0));
 
            // Mat にノード
            Cv2PlotPoint(img1, coorXZ, Ox, Oz);
 
            // Mat に凸包描画
            PlotConvexHull(img1, outXZ, Ox, Oz);
 
            Cv2.ImShow("image1", img1);
        }
 
        //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        // キャンセルボタン
        //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}



結果

3次元点群を X-Z 平面的に見て凸包計算が出来ました。

図2 凸包結果



コメント

3次元の点群データから X 、 Z 座標を選び、平面的に扱いましたが、 X 、 Y 座標でももちろん出来ます。

必要に応じてソースコードを変更してください。

個人的には面白かったので、3次元凸包も試してみたくなりました。



以上

Visual Studio 2017 の C# で OpenCvSharp を NuGet からインストールする



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


以前の記事で、 OpenTK をダウンロードして Visual Studio 2017 で使用出来るように設定しました。

Visual Studio 2017 の C# で OpenTK を手動で使えるようにする - 解析エンジニアの自動化 blog


なかなか手間のかかる作業で、すぐに忘れてしまうと思います。

OpenTK は設定してしまったので、 NuGet から OpenCvSharp を設定してみます。



動作環境


Windows 7
Visual Studio 2017
・OpenCvSharp



環境設定

VS 2017 でプロジェクトの新規作成

『新しいプロジェクトの作成』を押します。

図1 Visual Studio 初期画面


Windows フォーム アプリケーション』を選択して、プロジェクト名を入力します。

図2 プロジェクト設定


新しいプロジェクトが出来ました。

図3 プロジェクト作成したところ


NuGet からインストール

メニューバーの『プロジェクト』の『NuGetパッケージの管理』をクリックする。

図4 NuGet 表示


『参照』タブを開いて、検索テキストボックスに『opencvsharp』と入力すると、OpenCV関連のパッケージが表示されるので、『OpenCv Sharp-AnyCPU』を選択して、『インストール』ボタンを押します。

図5 インストール


以上でインストール終了です。



テスト

テストとして、OpenCVを使用してみます。

GUI

ボタンが1つだけのGUIを作成します。

図6 GUI


関数作成

作成したボタンをダブルクリックすると、ソースコードを書き込む関数が作成されます。

図7 作成された関数


赤枠の中にソースコードを書き込みます。

図8 ソースコードを書く場所


ソースコード

図8 の赤枠で囲まれたソースコードを書く場所に下のソースコードを書き入れます。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using OpenCvSharp;
using OpenCvSharp.CPlusPlus;
 
namespace OpenCvsharp_Sample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            // Mat クラスで画像を作成する
            int screenHeight = 620;
            int screenWidth = 400;
            Mat img = new Mat(screenHeight, screenWidth, MatType.CV_8UC3, new Scalar(0, 0, 0));
 
            // 円を描画する
            Cv2.Circle(img, new OpenCvSharp.CPlusPlus.Point(180, 150), 150, new Scalar(255, 255, 255), 3);
 
            // 矩形を描画
            Cv2.Rectangle(img, new OpenCvSharp.CPlusPlus.Rect(180, 150, 150, 100), new Scalar(0, 255, 0), 2);
 
            // 画像表示
            Cv2.ImShow("Image", img);
        }
    }
}



結果

ボタンを押すと丸と四角が描画された『Image』というウィンドウタイトルのウィンドウが表示されます。

図10 OpenCvSharp



コメント

NuGet の簡単さは素晴らしいですね!!

python でいう pip みたいなものですかね!

OpenCV は画像処理系のライブラリとしては有名ですし、色んな関数があるので、ドンドン使いたいです!



以上

Visual Studio 2017 の C# で OpenTK を手動で使えるようにする



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


OpenGLは優れたグラフィックライブラリです。
使えばたちまち凄いグラフィカルなソフトが作れ…るかもしれない。

まぁ、淡い期待を胸に抱いてとりあえず Visual Studio 2017 で使えるように環境を整えたいと思います。



動作環境


Windows 7
Visual Studio 2017
・OpenTK



環境設定

C# から OpenGL を使うためには OpenTK といったラッパークラスを使う必要があります。

手順をまとめます。

OpenTK のダウンロード

『opentk-1.0.0-rc1.exe』でインターネット検索すると図1 のサイトにたどり着けると思います。


図1 ダウンロードサイト


5秒くらい待つと図2 の様に自動的にダウンロードを開始します。


図2 ダウンロード開始


OpenTK のインストール

インストールはダウンロードした exe ファイルをダブルクリックして、『 Yes 』ばっかり押していけば OK です。

図3 インストーラ起動


図4 インストールフォルダの画面


VS 2017 でプロジェクトの新規作成

Visual Studio 2017 で 『Windows フォーム アプリケーション』のプロジェクトを新規作成します。

『新しいプロジェクトの作成』を押します。

図5 初期画面


Windows フォーム アプリケーション』を選択して、プロジェクト名を入力します。

そして、『OK』ボタンを押します。

図6 プロジェクト名設定


プロジェクトを作成すると図7 の様な画面になります。

図7 プロジェクトが出来たところ


OpenTK の参照

インストールした OpenTK をプロジェクトから参照します。

ソリューション エクスプローラの『参照』を右クリックして、プルダウンメニューの『参照の追加』をクリックします。

図8 参照の追加


参照マネージャーの『参照』をクリックして『参照』ボタンをクリックします。

図9 参照マネージャー


さっき OpenTK をインストールしたフォルダに移動していきます。

図10 参照選択


『OpenTK.dll』と『OpenTK.GL Control.dll』を選択して、『追加』ボタンを押します。

図11 dll 選択


参照マネージャーに『OpenTK.dll』と『OpenTK.GL Control.dll』が追加されました。
『OpenTK.dll』と『OpenTK.GL Control.dll』のチェックボックスにチェックを入れて(チェックが入っているとは思いますが)『OK』ボタンを押します。

図12 参照追加


ソリューション エクスプローラの参照に Open TK の必要な dll が追加されました。

図13 参照に dll が追加されたところ


OpenTK のコントロール追加

『Form1.Designer.cs』を開きます。

開いたら、赤四角で囲われた『+』をクリックして、ソースコードを表示させます。

図14 Form1.Designer.cs


ソースコードを表示すると図15 のようになってます。

図15 展開した Form1.Designer.cs


図16 の『追加』と記載している矢印(↓↑)で囲まれたソースコードを追加します。

図16 コントロールを追加した Form1.Designer.cs



テスト

図16 まで設定出来たら、『F5』を押してプログラムを実行します。

図17 実行画面


Form1.cs[デザイン]を見ると図18 の様に黒い四角が表示されています。

これで、 OpenTK コントロールがフォームに追加されました。

図18 Form1.cs[デザイン] 画面



コメント

かなりめんどくさい作業でした。

すぐ忘れちゃうし備忘録も兼ねてまとめました。



以上

C# でテスト用3次元点群データを作成する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


関数を単体でテストする時に、サンプルはあるんだけど開発の初期段階に不必要なほどに大規模過ぎたり、手軽に動作確認出来ない状況でした。

手頃なサイズのテスト用の点群データが欲しかったので、乱数を使って自分で用意することにしました。



動作環境


Windows 7
Visual Studio 2017



プログラム

C# でコンソールアプリケーションから3次元点群データを作ることにしました。

ソースコード


using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace TestNodeDataMaker
{
    class Program
    {
        static void Main(string[] args)
        {
            // 出力ファイル名設定
            string strFileName = "Test-Nodes-Data.txt";
           
            // ノード作成点数設定
            int Num = 500;
 
            // ノード座標作成用乱数
            Random r = new Random();
            int limitLowerX = -500; int limitUpperX = 500;
            int limitLowerY = -200; int limitUpperY = 380;
            int limitLowerZ = -100; int limitUpperZ = 100;
 
            // ノード座標格納用変数
            double X; double Y; double Z;
 
            // ノードデータ格納用変数
            string data = "";
 
            // 進捗用
            float n;
 
            for (int i = 1; i < Num + 1; i++)
            {
                // 座標データの作成
                X = r.Next(limitLowerX, limitUpperX) * r.NextDouble();
                Y = r.Next(limitLowerY, limitUpperY) * r.NextDouble();
                Z = r.Next(limitLowerZ, limitUpperZ) * r.NextDouble();
 
                // ノードデータ生成
                data += string.Format("{0,8}", i) + ",";
                data += string.Format("{0,25}", X) + ",";
                data += string.Format("{0,25}", Y) + ",";
                data += string.Format("{0,25}", Z);
                data += Environment.NewLine;
 
                // 進捗表示
                n = (float)i / (float)Num * 100;
                Console.WriteLine("進捗: {0} %", n);
            }
 
            // デスクトップパス取得
            string desktopPath = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
 
            // デスクトップにファイル出力
            File.WriteAllText(desktopPath + "\\" + strFileName, data);
 
            Console.WriteLine("終了するには何かキーを押してください");
            Console.ReadKey();
        }
    }
}



結果

プログラムを動作させると図1 の様な画面があらわれます。

図1 図


出力された3次元点群データのテキストは図2 の様になります。

       1,          6.3419938172875,         32.3797981638367,         30.2311103065643
       2,         65.3217181774423,        -24.1840215437971,        -59.7495026326503
       3,         133.303746833142,         153.961790378653,        -15.0303173880234
       4,        -165.354889512227,        -157.992553269021,        -10.2588013579411
       5,        -165.324958051241,         6.73502210096224,         28.8967961803529
       6,         70.8150947209518,         3.87346041382917,        -1.02425204730791
       7,        -247.969437494394,        -158.615209471721,        -65.7111761149537
       8,        -273.171083640853,        -34.7948258476308,         18.5856005337954
       9,         413.639641303401,         78.6291895064661,         77.9080133037213
      10,         321.776127606526,         74.6001970277169,        -13.7713193072804
      11,        -98.3101255829959,         105.284636926504,       -0.321951792725339
      12,        -294.764162543586,         66.9673876850714,         27.9224270265188
      13,        -14.0366258211604,        -4.17781448186273,          19.425438293454
      14,        -200.028653564876,         284.383265075452,        -6.95180639110124
      15,         6.26787774370419,        -104.621650874904,        -49.8994326800571
      16,         190.686348534043,         83.0590186706088,         13.1859776401827
      17,        -100.734863492071,         34.4978201782786,         23.1548094000457
      18,         148.056873064515,        -52.5473776099027,         6.69026045440243
      19,        -10.9465185464111,        -16.4920338366609,          -22.70314659211
      20,        -95.5632537377827,         25.8589797405801,         11.0018485835762
      21,         82.2883799831794,         46.1520711580068,         -11.669955024342
      22,        -91.4098852152982,         83.6798656306601,         22.2636931139341
      23,        -357.578080959422,         12.7621054969552,        -19.6622081565029
      24,            60.1613564194,         23.4275280607061,        -5.57761998175533
      25,         5.61259095958089,         16.8930173050114,         6.54400835118443
      26,        -267.275660079101,         37.5950771186478,        -7.80450549992011
      27,        -183.079307418819,         -4.2589268275811,        -1.29120744033307
      28,        -157.735602482099,          241.30158039243,        -42.7793646337368
      29,         73.2819660530807,         -7.9249531961628,         18.5657552646314
      30,         88.0711913938034,         81.7476144618111,         33.5162309391965
      31,         39.9376362831973,         95.6743854301397,         2.93921116736681
      32,          161.38977017784,        -2.82450883594552,         63.8642416605094
      33,        -298.021263246434,         117.556948885581,        -65.3192460054156
      34,         50.7092538288372,         68.0359133929181,        -40.9445107131938
      35,        -26.4323570748942,        -101.755449050924,         46.7479159667845
      36,         89.5660319209872,          122.22089270792,         25.6809449706604
      37,        -300.831166354395,         -65.647461558528,        -42.9804614474906
      38,        -126.660514549194,        -17.9701973516355,        -89.7130199348149
      39,         98.1656872006905,         12.9794744090082,         3.72425763342728
      40,         -139.66510077364,         10.7054486333884,        -22.8295927410152
      41,         -9.4116474918144,         127.439024580381,         6.13867892610779
      42,         255.408656640169,         339.344042249184,         -2.7215962646164
      43,         2.81490457235598,         94.8636378137691,         5.42626769068943
      44,        -200.641937854533,         -24.516528952176,         34.6722081465052
      45,        -77.1691441662466,        -106.399924418144,         -56.039353760909
      46,         21.0030906996704,         123.406785375628,         1.39782863920453
      47,         176.782639334808,         34.9095082180153,         -4.0461332965857
      48,         16.8738579400228,         174.517812856714,         18.9749236530508
      49,         24.4490881052097,         -52.543481678955,        -35.1524266559409
      50,         17.7515041379964,        -23.6562858399266,        -19.2276173360774
      51,        -129.411712371005,         1.95745239497975,        -12.5889378835396
      52,        -109.683135451601,         2.57952889733926,        -43.4591697656825
      53,         5.10268943668468,        -62.1863377518888,        -56.8034968566166
      54,         49.5913810457994,         86.2068079813415,        -60.4896832632318
      55,         74.7558696636725,         106.903269979592,        -49.9459976996044
      56,         175.889088328876,         89.2549326304602,        -14.4146394205348
      57,        -303.333589095778,         96.3268202507528,        -61.5039032266959
      58,        -8.81101162583149,        -51.3552995353729,         -20.371362183416
      59,        0.769677474521882,         106.286783966369,         10.9689298397717
      60,        -81.5934141262404,        -59.4882528425605,         5.50954979914685
      61,         166.772447653009,         163.250747143408,         6.15399366531241
      62,        -109.240760470387,         318.371378323702,        -8.22261119504581
      63,        -15.0156844281665,         25.4604880583754,         68.9795114654021
      64,         20.8262361217412,         48.0703781904049,        -1.48183199087243
      65,         170.216010450486,         90.0770764490948,        -26.7864745607537
      66,        -276.698163275466,        -28.3542746144134,         11.4408767649163
      67,        -353.344866215878,         55.8952323840443,        -24.6672371442743
      68,          -115.0395544409,         85.1865126142216,        -29.1427724860342
      69,        -4.94535075963724,         59.2193242028446,         33.7554558356085
      70,        -273.329166338467,         223.286810435023,         4.16176491610788
      71,        -337.301490913751,        -55.0428533307476,         70.5661194653093
      72,        -71.0852696807521,         3.61790055205016,        -10.2547001062216
      73,        -28.1268849773923,         227.505139106654,         81.8737271231942
      74,         -14.963066767884,        -5.01205905015211,         67.5409211379201
      75,        -63.1897043842774,         151.689773578052,         76.9616559548125
      76,          100.42502127887,         165.029562626513,        -18.4933001308205
      77,         62.1725165509491,         151.142906411152,        -0.56603472892476
      78,        -119.553616437853,        -65.3133597603596,         39.1569693513014
      79,         18.7036565778328,         19.2657941390135,        -31.6699393660156
      80,         355.846356386247,         99.6918463644999,        -7.65928387439776
      81,        -35.4725425194355,        -32.4307089897016,        -29.8217318923314
      82,        -216.149859641748,         61.8821159460964,        -13.0029444084516
      83,        -196.867156269433,         16.6022419624972,         32.7018313769725
      84,         70.1210873528016,        -169.903297903903,        -25.4836685068364
      85,        -123.407965996027,         -33.076355584467,         12.6931990704933
      86,         66.2818539069415,         67.8059765220648,         13.0988166938065
      87,         289.224812059768,        -59.6872237388451,         6.55229336468144
      88,         106.399870024249,         130.633189056829,         48.4325176609831
      89,         82.8097698887856,        -37.8392569841069,         27.2337238989927
      90,        -88.7842459291146,         140.640141105577,        -38.8751226872556
      91,         8.58053577066424,        -49.9553886987061,         -1.1158681181799
      92,         133.324035032338,         175.013630190871,        -8.65878452903534
      93,        -17.4537289754738,        -15.1217840086305,        -58.1977587576014
      94,         217.899434909643,         138.009871363644,         48.9656780576174
      95,        -131.006487182345,         2.43333691471877,        -2.82333343514397
      96,         30.4542316708035,         49.9430814059186,         65.4400511688739
      97,         60.2053618804577,        -176.763527664711,         9.14662136842805
      98,         11.5612864082499,         3.61769690579628,         59.8027736841714
      99,        -72.4927380320117,         -164.27090820124,         15.8869506408865
     100,         364.829982468314,        -51.5784576281805,        -36.7481601348837
     101,          60.401469329559,        -48.5828131440016,         66.2956767055651
     102,         87.7486163548886,        -50.7613273955701,        -28.5193500055556
     103,         338.638888944704,        -15.2976079225995,        -68.0031008925303
     104,         -64.952917394672,         81.2681529118066,         11.0945063322291
     105,        -33.9015936059419,         30.3810116296546,         1.72013698598376
     106,         47.1030224753092,         39.3768034425456,        -35.5573818346287
     107,        -58.8981533920849,        -90.1360125165135,        -1.99553185980559
     108,       0.0792428143691471,         10.4139543540841,          89.656913825151
     109,         229.940378528526,         113.701214971813,        -6.55172362763049
     110,         -94.927086071543,        -110.016951194972,        -19.8978306157039
     111,        -85.2055140515815,        -1.19811793658795,         56.3762599762419
     112,        -390.487261053402,         26.4107551702348,        -34.9398317327443
     113,         7.98997254250104,         104.482526968924,        -24.0853492655257
     114,         150.695351441715,         134.306241685667,        -3.67941758114817
     115,        -59.6929290493452,        -23.0021937051798,         25.4875800136885
     116,         199.127480964701,        -112.916888742203,         1.98734101233414
     117,         166.932021967569,        -56.5766034585315,        -13.6197913268673
     118,         -2.6838746101986,        -1.05980261138631,         56.7061665964807
     119,        -204.460513947746,         33.8146420222775,         33.8898406875738
     120,        -46.9754186165405,        -32.0518984925244,         32.1325278953335
     121,         19.9278105958029,        -156.993943170176,        -22.4553218723532
     122,         116.058043850147,         144.015789865523,         8.23307357180541
     123,         -20.418115366445,        -5.55034787699131,        -57.1309592328644
     124,          90.995980539823,         9.76868410118329,         9.09109577401127
     125,         -203.75801660668,         103.866900263292,         5.56137170156528
     126,        -306.386467548733,         128.529560134061,        -78.8460682178131
     127,        -221.128872070056,         -9.0942346184022,        -11.6523812020441
     128,        -219.600240892544,         29.9185861004137,        -50.9470653054058
     129,        -166.585805413586,         73.0132072805489,        -23.7850106790592
     130,        -42.1340550110368,         44.8467388464356,         69.0282889614013
     131,        -68.9870568071432,        -140.701613767399,         30.9831221708949
     132,        -287.323579078225,        -53.0724102813156,         2.55001383021009
     133,        -93.3723181399388,         29.9870242527626,        -26.6138231063326
     134,        -70.2531459770413,         4.68763035335002,        -40.0513188764692
     135,        -142.044251885751,         3.02060383000439,        -12.0514604076983
     136,        -159.411908314755,         71.9264291762032,        -6.34094333198897
     137,         -84.210931577818,         173.438612193073,         1.16167212331745
     138,        -55.1406132239572,        -4.53700500937971,        -62.6856164493065
     139,         13.1696554893486,         150.223817809123,          44.229737252104
     140,       -0.320421978514838,         113.860593762184,       -0.131083010756915
     141,         2.94747305612428,        -1.67089832651936,        -54.0977297076479
     142,         329.782225074611,        -18.7080188317727,         1.04628123158882
     143,        -328.574111209518,         38.9808056917883,         12.9091258053245
     144,        -10.1330575394132,         72.6725299436005,        0.996067334895985
     145,        -233.231729377169,         48.8089929352556,         17.2936706288223
     146,        -339.661919749184,         257.708157448428,        -50.3672869481925
     147,         104.276953791397,          120.27198974894,        -7.33020950077577
     148,        -41.4693447092871,        -29.2977268971958,        0.906414802142612
     149,         27.4277125370818,        -3.67412485725904,         27.4306238393442
     150,        -2.63102705061018,         68.9778440035776,        -41.3079289194699
     151,         290.723141472192,         37.6706394728602,         29.8439792626742
     152,        -80.1500326628564,         83.5460568957711,        -31.0063328067802
     153,         117.352241553996,          111.19438043432,        -45.7728272540368
     154,        -182.187096810987,        -69.4066526318931,         11.2400189560093
     155,         196.076326382382,        -84.3303245065409,        -4.63425342535332
     156,        -406.632022391368,        -26.1649251310923,         14.4757216528411
     157,        -115.343949080139,        -47.2255554065227,         5.65578037624051
     158,        -16.5697376078785,        -75.6127865592077,         1.23047670872439
     159,        0.590463283281058,         155.999245220329,         57.0183864305813
     160,        -60.4620663390784,        -68.0941326744362,        -7.76412701595767
     161,         204.093082978899,         181.515304197797,        -9.21720033242237
     162,        -81.4330328066987,        -12.8835143004002,        -48.8231472083475
     163,         40.5371628042949,         231.060901459801,        -22.7856738505818
     164,        -134.839192687925,         5.65302511940385,        -24.0484962351846
     165,        -12.9331438303614,        -103.809997619507,         30.3180282825222
     166,         19.9031456368524,        -0.11220114962766,         15.2888998907473
     167,         -61.510045298147,          346.27773636639,         12.2454309054862
     168,         66.1947237263409,         285.294406651656,        -17.8005267734642
     169,         145.089121840936,        -101.589988869424,        -20.6863700177923
     170,         67.8123269322386,         107.831518029716,        -70.1280351095498
     171,        -228.526569002553,          25.187108592683,         20.7449145376426
     172,         116.192909208682,        -135.714768306219,        -5.22765274868703
     173,        -25.7214500502317,         24.4457817759578,        -32.0401632627659
     174,        -99.2656912702442,        -95.9713042154775,         21.8984118531916
     175,        -225.404291973172,         165.030067559811,        -14.6145380421609
     176,        -148.056063919354,         200.392832477294,          51.732386644805
     177,        -231.743066871419,          48.616718366098,        -42.7110679842118
     178,        -273.838818480186,        -141.804210506754,        -33.4066317982071
     179,          225.66047766882,         70.7855476130664,        -22.4651413655212
     180,         161.624014940869,        -155.410151730483,         35.5375095622323
     181,         249.886869747139,         -29.570804513791,          4.4545766927556
     182,         78.7277583464644,         69.1003489122262,         20.4527762031428
     183,         -261.65858826491,          21.083342597393,                        0
     184,          14.265770207283,         125.444232661484,        -71.7910734916996
     185,        -71.1274878266861,         12.8747228118008,        -23.8274322263093
     186,         118.383299454294,        -84.3623801015142,          8.8537266155955
     187,        -11.5332850811692,         19.9583553932413,        -75.3558973704259
     188,        -120.866488395662,         5.48051979368577,         15.0419714912036
     189,        -136.817112803374,         110.071881324552,        -6.59783464418623
     190,        -149.513761871268,         99.4329690232095,         10.2627671837168
     191,        -191.150529284566,        -6.26767097519136,         14.0303812842026
     192,        -87.7315318667011,        -4.16190190341412,         52.9181920229076
     193,         -33.452184614936,         52.4152214417305,         49.2541748374953
     194,         105.409038448897,         20.0450416468294,        -74.7166718145444
     195,        -72.3199838811159,        -169.660893868963,        -28.1500982298283
     196,         5.14727963839997,        -57.8981891050461,        -28.2055017949108
     197,          15.009408809249,         90.8829155987515,         4.40228846781062
     198,        -15.5550528688147,         6.86027296206927,        -16.6779986339053
     199,         129.220956226448,          28.210468607587,         5.52483696794363
     200,        -5.50573877315304,         49.1945833671813,         13.0844709407932
     201,        -71.2325198115932,        -30.4061860476649,         5.32725952161814
     202,         6.79944859342624,          322.56500394203,        -52.1401775079501
     203,        -109.589510371717,         103.309955475531,         86.0638607656881
     204,        -89.6084051698485,         81.5581909970186,         -45.396253348047
     205,         152.562652368361,         50.6641151614786,          15.266574046233
     206,        -492.076486992685,         -88.629489763933,        -13.5667788402954
     207,         277.146957885077,         47.1562461476569,         3.70328634777259
     208,        -198.547404042234,      -0.0498237731167226,         27.0231221742104
     209,         372.080962843765,         -73.045542383122,        -72.8000684007071
     210,         77.6821136370684,        -35.5362733875105,         1.49657744983983
     211,        -14.7221060659374,        -131.123209293523,         21.1156433746757
     212,         296.940074627725,        -71.0489291060012,         9.87426391331212
     213,        -32.1344919978336,        -90.1197067117876,         9.83614305538877
     214,         -67.663161666907,         22.5775660167344,        -1.51273118123074
     215,        -204.288872733381,          17.982416262842,         43.0029359995401
     216,        -196.036051725986,        -74.6646230493973,        -58.2876414890809
     217,        -246.890206703399,         28.5784749186498,        -30.3119915650748
     218,        -145.234465912559,        -128.398525508306,        -17.6829909056812
     219,         87.1645146353005,          233.45214040645,        -73.5307399428127
     220,         4.23966370161607,         155.888235963829,         16.5418095358376
     221,        -124.607668194271,         78.3975544750679,        -8.56655585000597
     222,        -3.13625950745133,         43.7668450659918,       -0.973367721295621
     223,         32.2397234031184,         34.8991615278177,        -83.5490602881411
     224,        -94.3852865851416,         25.6150177082117,        -43.5361242823005
     225,         103.386966248689,         3.07728065600492,         6.88626466267103
     226,        -29.1126639531519,         95.8540932400404,         7.30200210553687
     227,        -21.8004802706654,          -50.34765162242,         1.89897072822739
     228,        -49.7659938194631,         166.544984310188,        -47.6564187033365
     229,        -178.484001128694,        -137.351016466204,         33.2976071184024
     230,        -302.787106476159,         70.7455030417747,        -2.96258765783281
     231,         386.474211865326,        -87.3222065662603,         35.9272459623996
     232,        -49.0446501136965,         78.3785607816552,        0.980282672206071
     233,         28.9216507314339,          38.641499537342,        -19.6705212931477
     234,         61.3564972911759,        -100.921267219317,        -31.7451410962945
     235,          -186.3865533119,        -21.8319969991371,        -2.21705176505123
     236,         -24.745559606117,         24.6904143005099,         58.4431794557921
     237,         326.559394677896,         89.4562442290859,        -13.9794122888611
     238,         -156.60156535199,         3.21829270255672,        -42.7898417677683
     239,         307.116388761027,         24.3984051348634,        -2.20847905204095
     240,        -134.596444666198,         168.000150281936,         15.0249495566939
     241,         -352.17735201734,         185.902460183903,        -26.5364857029805
     242,        -54.5678480679951,        -5.60671868995145,        -7.22709395327936
     243,         50.0692263315754,         31.5393794079029,        -6.83516678718625
     244,         7.18126564527921,        -33.2944473416053,        -11.1673494773765
     245,         100.641107997224,         112.875636303739,        -48.1691585658906
     246,         122.062181058369,        -23.6529455276453,         -25.267468496816
     247,         306.389898360888,        -14.6193818364383,          16.988097860938
     248,         -29.215496793024,        -38.6744631075647,         57.6918655716311
     249,        -73.4052744896176,         29.1848513564024,         51.9369261124809
     250,        -90.4948914379323,         44.5671071189303,          21.269880101676
     251,         196.592311701548,         7.87807550834402,         10.7715115965211
     252,         -61.001085794997,        -16.7228677448457,        -54.2043938870562
     253,        -30.8909795483998,         20.0490467157443,         -9.2662850624259
     254,        -120.441672764924,        -82.8340624695802,        -19.7069622016079
     255,         237.301855714667,        -3.18379617258152,         51.5399602593574
     256,         248.189465025994,         227.364701695444,         7.83975170312438
     257,        -105.489211529721,        -4.72894094080149,         8.43231363521531
     258,         29.3145404208054,          8.5268853500145,         16.9256684598167
     259,        -233.336674032424,         -25.577353176464,        -24.4555503839886
     260,        -377.861885203916,         43.5184233228296,         1.30757558220419
     261,         259.422883800893,         64.4246066689606,        -15.3721657853444
     262,        -190.876202134824,         215.616655901827,        -37.2376111840073
     263,         92.0788707156102,        -145.696280969165,        -78.0864794985794
     264,        -8.92746680831884,        -86.3127184646729,         -3.6133015628966
     265,         17.9017683723484,         49.7035304185485,         51.8895765612319
     266,          59.651516375901,         44.7201608399489,        -30.7748789907316
     267,         61.9852104647947,         39.6868734833258,         22.7903334483459
     268,         57.7296240877964,         37.1489316039481,        -37.6578235540808
     269,        -75.6684389285131,         270.343630036499,         5.89125220845046
     270,         338.361197763291,         35.6902987303633,         71.9458727161148
     271,        -277.236857446487,         25.0331756216628,         6.00809032936026
     272,        -274.493985033358,          72.767613485813,          80.925971156883
     273,        -114.766212070718,         225.716283201108,         -47.151619463764
     274,         11.6146739756757,         3.28249860009295,        -35.4708209468382
     275,         273.033750044663,         43.2790331236455,        -5.62042410328073
     276,        -74.3994280390439,        -3.80602831663845,        -28.9143414371248
     277,         80.4200226629246,         73.1746573621289,        -22.2878743998184
     278,          8.8549151992681,         2.85366597671698,         19.1561983549763
     279,        -68.8169200177383,         152.774372437398,          59.222138086903
     280,        -48.7138169634686,         24.9500301284483,        -11.1733473162974
     281,         51.4945338868976,        -11.5080687596966,         49.3737650939141
     282,         21.2572939830168,        -31.8942552832394,        -49.0503070601496
     283,        -65.5477101521323,         209.572705725475,         5.86180605500089
     284,        -212.217921373536,        -24.0156451966686,        -48.0599880740326
     285,         49.0833120602571,         34.8746003442791,         24.5412962495076
     286,         385.787185811339,         248.063585144497,         41.2964839196282
     287,         -113.63333266677,        -116.488099734526,        -34.2477261481098
     288,         -15.312493323494,          188.52279494634,        -5.61084230179472
     289,        -231.479775976147,         44.2073355299455,         20.1191004496622
     290,         123.385093130351,         145.672572770003,         25.0988239343738
     291,        -193.191038819585,         24.3291879609829,        -8.89777097287484
     292,         188.688841973752,          3.2853820553447,         1.89188307891222
     293,        -189.090945575894,         63.1951340060658,        -88.1822647285565
     294,          197.04226020679,        -74.1274971860123,        -5.81523622284422
     295,        -375.607360692512,        -45.6783600136071,         35.7672534108941
     296,         204.978310212948,         61.5383399587769,         42.3215534967936
     297,        -169.135831593599,         48.6512112471514,        -99.6143632100962
     298,          -236.0716383234,        -94.5377057485924,        -15.9730855822438
     299,         188.333138163822,        -2.03070453788652,        -30.4173602771095
     300,        -42.8996460339518,        -26.8282144352925,        -7.92874261547287
     301,        -110.010429387917,          110.15717998294,        -6.69519832669534
     302,         65.7678887759186,         163.531832074528,        -24.3087564363651
     303,        -85.9402204574739,         38.7842649923564,         9.66984343420241
     304,        -221.452290971974,         180.709720926224,        -16.4779496940216
     305,         -118.00772739109,          7.7521423617155,         34.0597517350967
     306,         121.036499117052,        -2.34011231378657,         40.7173864770296
     307,        -16.1232459406011,         199.395709601881,          45.108581972359
     308,        -5.39033310645741,        -82.9957335167545,        -15.8164181037882
     309,         124.846664206053,         38.6580337573113,          -41.63185500383
     310,         165.504925356016,        -1.23226079495263,         62.9153496874102
     311,         105.440676980857,         6.70867223930949,        -21.7430293302718
     312,        -103.748547628405,         26.6858594728102,         19.5860590057383
     313,           7.032896628153,         195.358475243374,        -1.34251019234886
     314,        -23.3511143342364,          326.11233879631,         2.73339923924459
     315,        -181.321439667289,         50.0050169443735,        -45.5090786849657
     316,        -123.349661282892,         53.4626051045314,        -11.3396918733323
     317,        -82.7764932023252,        -114.057440189206,         2.60825565206271
     318,         187.285315683244,        -5.99655693210501,        -2.59379682438159
     319,        -18.9433764051382,          40.543623273514,         24.5969753175028
     320,         348.266916319852,        -103.614347001358,         27.5037112564331
     321,         131.307080251308,        -87.4864321413852,        -32.1600427069515
     322,         307.208552620471,         177.260266720439,        0.326868385228733
     323,         200.670589144188,        -1.81233862219953,         9.66294283124755
     324,         64.2771133670011,        -14.5968637692727,        -3.78962112953403
     325,         13.1504913350337,         177.727185875516,           32.79298764737
     326,        -239.440631542094,          97.521914371998,          -46.69258005018
     327,          349.76425216336,         24.1571471803622,        -50.1156985452937
     328,        -198.872466407191,         80.3116088068632,        -18.4097676511899
     329,        -7.84099573634611,         235.025879738864,         35.2616962023367
     330,        -56.7641134721991,          31.140672913818,        -32.0876452778874
     331,         12.9049970269692,         141.291102283304,        -21.8715149079782
     332,        -15.2061703038431,        -40.1105480273769,        -89.4861858568556
     333,         13.8831452400811,         -99.297312505216,         -18.249295343761
     334,         37.6282411425506,         175.463417052973,        -16.6289746428975
     335,           41.10283115185,          310.07954378616,         1.57131257772972
     336,        -198.760693226364,         88.2082858263554,         -63.430370731014
     337,         202.815111667297,        -21.7405771472215,        -4.37639262032527
     338,        -400.058317463872,        -153.887179176271,        -35.7528105777469
     339,         26.0057466551688,          79.999770734459,         10.5116745296454
     340,         38.8024252763961,         23.5690983326962,         8.28764845071717
     341,         229.521132449396,         12.3868331659524,        -22.5516635410263
     342,        -35.6142985455758,          36.666256560323,         40.3297834966005
     343,        -307.572067565085,        -5.46344190019343,        -8.07181623953945
     344,         265.920936381408,         66.7439369045868,        -1.77620749071995
     345,        -231.491041876139,        -5.21642581709494,         0.36071092279661
     346,        -205.440924710334,        -22.2433059067667,         29.7078864275049
     347,        -8.08088332185563,         177.649856585846,       -0.453275218817068
     348,          140.39181984048,         47.9665726041266,        -52.3529431467657
     349,        -98.3834345873368,         65.4013942784636,        -31.9108777888636
     350,        -216.700180448918,        -89.1734757987659,         13.2969887686414
     351,         -85.601770506055,         160.974442661262,         15.9671627767231
     352,         2.65662311141222,        -9.12216502945971,         29.7542364242274
     353,         14.3460881776857,         72.9909731042529,        -25.0042204572839
     354,        -34.5640131191183,         137.490848851153,          19.388098679198
     355,        -75.2372953906829,         2.06973826096847,         68.0169029841278
     356,         236.393005876519,        -42.8009738734928,        -1.34544846711003
     357,        -2.31551029920369,         43.6670220106221,         2.27781413229081
     358,        -18.7905346852683,         109.738170342864,         8.36150043847109
     359,        -51.4786053157778,         4.70854848190609,        -62.6222674961306
     360,        -93.9478339990358,         7.45227098811989,        -1.41614989257238
     361,         117.397466296981,        -42.0771853854308,        -10.0335417580947
     362,        -11.5662214306957,         60.8623449517704,          4.2601601352264
     363,        -1.84100202556746,         -63.189614387783,        -40.4343438709315
     364,           18.85836921486,        -21.2228596234801,         40.6209200623543
     365,         -29.413746477763,         23.5123765983211,        -42.0972886831021
     366,         2.73907723265657,          73.257297771637,         7.84187442988245
     367,         364.908909966661,         183.140940562888,        -50.7549994693859
     368,          29.997491519897,         12.6060235782554,         3.69540440276983
     369,         77.8858490688195,         22.4349779800675,        -6.59559697592426
     370,         280.748592153074,         54.0079449648075,         50.2589218873805
     371,          274.49998403457,         256.836975299212,         16.6478593426979
     372,         228.066714277522,          39.264236542985,         11.3278232772499
     373,         192.193788832144,         166.127385341622,         23.9096694755879
     374,         136.380755431196,        -52.5175955162931,         30.1301039117994
     375,        -153.156102724912,         116.354993787759,         4.74768820672654
     376,         112.974605828977,        -46.2099388754973,         22.7694571142874
     377,         217.654428904715,        -48.0669315406433,        -25.1150475019193
     378,         142.356930825094,         88.3035102474054,         -5.2207750553362
     379,        -100.425798254286,        -126.132822199786,         26.8764412155731
     380,        -12.4115607409792,        -30.4975651393168,         30.5525423784519
     381,        -62.5040312132351,          32.042114090194,         53.5909978363621
     382,        -173.915375754663,        -72.7725978571794,        0.758051529879706
     383,         62.1445942111987,        -59.1110262135561,         32.1622293219726
     384,         290.658448087358,         178.553862610158,        -4.00579343783008
     385,         104.173298616043,         53.9822329757652,         17.7777580464155
     386,         -142.00561143365,         172.045313227477,        -66.6723679041827
     387,        -52.1073377840721,         6.47443036850282,        -23.6733037678866
     388,        -161.971905727858,         308.273816848301,         37.9068584404452
     389,        -4.12282470014078,         36.3894197905387,        -15.6682093961482
     390,         9.80873192185943,        -4.58455526762854,         4.84511005126178
     391,        -259.043327401412,         159.398828958813,        -27.8243785467112
     392,        -198.173141884698,        -12.3287161478441,        -33.1864917479393
     393,        -455.653822829786,        -75.1194443191027,        -18.9779926249655
     394,        -343.357719029932,        -6.23372807644015,        -64.3669438810865
     395,         2.56727574140172,         44.5041981695705,        -19.1499011950334
     396,          91.736488496762,         35.4737450631679,         63.7661608791753
     397,        -86.6110541828028,        -21.9860865101153,        0.636772918811428
     398,        -91.1772179851203,         114.211440210329,        -17.5913005776663
     399,        -258.693078630461,         108.887289147306,        -26.5074689143838
     400,        -71.7139665371338,           148.7138492012,        -7.57018065060032
     401,        -78.7217434862264,         198.677190506215,          2.0192065071404
     402,         269.636257669719,        -81.3213192454173,         24.0121688735728
     403,        -60.2288376843691,        -5.94302066319763,         62.3786152882402
     404,         45.7365529750178,        -46.2187051229266,        -4.56916490875611
     405,         193.119663648829,         11.0915136784741,         52.5239358369838
     406,        -107.832281466961,        -14.5589207534487,         16.7806343821719
     407,        -72.9988124105142,         145.630684817969,        0.534492417487545
     408,        -186.060153119294,         238.171777514821,         7.79894856167908
     409,        -43.1191344573717,        -165.017332479831,        -6.13801978628059
     410,        -46.4328159999255,        -1.29185173255012,        -69.2547912147151
     411,         208.941004734925,        -11.0773237427125,        -12.9903663792603
     412,         179.891623854587,         50.1999196182936,         56.1256771251213
     413,         74.5608725559716,         146.367401066873,        -71.8497339588822
     414,         13.9704973650959,         129.118488789126,         39.0723430482076
     415,          121.20923477747,        -4.08588404212421,         46.9561976189521
     416,         12.0121201556232,        -57.4173440762876,         47.7978776482855
     417,        -33.1696934155979,        -25.7390538280546,        -79.4795335710419
     418,         57.7599889406748,        -32.6719413523897,         6.52032170748353
     419,        -15.7469769095755,        -80.2018076275484,        -1.00004108296709
     420,         171.120881582201,         150.758933777809,         -3.3096912295137
     421,        -146.550886196341,         27.7221924242201,         54.9550412273756
     422,        -3.88820216240743,         6.16666348891643,         16.7651327581914
     423,          19.864449775249,        -1.52066570963742,         71.7951855807543
     424,        -63.2391570639979,                        0,         9.26969987492529
     425,        -6.84288097258791,          60.056975819197,         39.6068951485711
     426,         282.527002483852,         84.3393508625866,        -15.8147000772016
     427,         187.141245491868,         160.160648848005,        -80.5037517149485
     428,         125.391345911842,          9.3903528011359,          11.177866920446
     429,        -477.149597726366,         78.2261330020736,        -48.0720918467604
     430,         57.2779820939889,        -46.6522359636855,         18.2525714013039
     431,         67.0631146822419,        -138.063670289732,         84.1318959594387
     432,           194.5550931406,         197.516722622102,        -27.5168252887748
     433,        -454.631799845785,         34.3361823439301,        -46.9452710104851
     434,         168.975313163351,        -11.9923086930031,         -59.197338303643
     435,         448.603983610218,         69.2573477184667,      0.00756317749971672
     436,         -120.62034751364,          74.583169158354,        0.897665073581815
     437,         251.384357684937,         119.882789002677,          -38.06913454927
     438,        -70.3986684891389,         37.1786633865808,         10.9374439976818
     439,        -95.7610326263872,        -16.7222922121744,        -4.64387059241714
     440,        -22.4673061019123,         40.5550553205214,        0.501477322774696
     441,        -164.426287687582,         264.115487583035,        -16.3096281282183
     442,        0.771483268948031,          30.688847903483,         12.7637705266307
     443,          -2.234900710748,         7.17591603806984,         -24.130715956041
     444,        -310.043540636563,         -68.061365915491,         -11.590234954185
     445,         94.1981775249346,        -66.3663560894161,          16.346231560384
     446,         304.239649882186,         170.271520102989,         15.2719258900135
     447,         21.7719494466539,        -55.4052874536278,         2.70999502516817
     448,         110.876635297144,         84.8732943110509,         12.2066624430971
     449,         186.919196815658,         41.3792803191483,         12.2749409243813
     450,         288.325037448818,        -19.8949891402828,          12.622938131738
     451,        -91.7083304471841,         64.8757723126913,         26.4732169688089
     452,         82.9720939774868,         7.17160985580255,        -28.6344866615881
     453,         273.873314947762,        -83.9858569521391,          42.971088354928
     454,         72.7500460570446,         84.6837837950717,         17.6529748149463
     455,        -125.449709720188,         153.519017898254,         32.9806146318934
     456,        -313.742000534545,         95.7445107664655,         59.2664635941696
     457,        -172.443614969702,         207.197073061111,         77.3894456491756
     458,        -473.069812968871,        -98.8206745408572,        -5.83457643437878
     459,         382.338795012952,         179.904425702013,          39.625133120746
     460,         77.9050275259209,        -97.8483933288829,         56.5909400920341
     461,        -228.078144616018,        -42.0892528994425,         16.7694015301622
     462,        -114.392832344115,         151.898339161602,         17.0722867185587
     463,         8.19490807885067,         36.6421827602397,         46.5681522104741
     464,        -131.066129936402,         52.2459703275217,         46.7073200488031
     465,         327.111862402461,        -8.40222312621876,        -16.7800409937184
     466,          106.60489315009,         10.9465424106207,          -1.770412686174
     467,         90.3100452061324,        -46.6203947903683,         5.85683352027872
     468,        -152.841190262158,        -109.476896184253,         24.7525306422042
     469,        -413.521089378521,         68.7974493288423,        -2.37952903955222
     470,         -118.30671464247,        -64.3264487182379,        -1.11225314536703
     471,        -59.6539588340809,         159.530970921522,          13.310867030784
     472,         69.0215806220759,         49.3076332320029,         -17.449944837694
     473,         25.4704727015786,         44.8575381957262,        -8.32304082034297
     474,         67.1351660728153,        -33.7233499445596,         28.5401688453463
     475,         -5.6858425883976,        -32.5274830612016,         34.2197275181393
     476,         -119.50879910286,         -17.547928243665,        -1.82897426971652
     477,         33.5815168845381,         189.039743295889,        -66.4091609089678
     478,        -157.659741998492,          188.12139708601,         4.64530784154558
     479,         29.4524025672359,        -17.3525364596176,         3.50503274030286
     480,        -65.4726929634217,          -2.369850588669,        -19.6609740795852
     481,         -109.06284366225,        -126.958402171246,        -34.0425585997489
     482,        -190.423743381362,         160.038652709703,         19.2391742734421
     483,         43.5431898159642,        -13.5881859872435,         21.3152501356393
     484,        -76.1208107155379,         222.273643694014,       -0.585669212316009
     485,        -18.0787910758885,         10.7635130247863,        -24.2171928515738
     486,         37.8016652007595,         4.16770227540643,         9.26371389453472
     487,         96.7763665787766,         4.25517264858595,         5.54292480765978
     488,        -49.9232681886867,         49.3528080030125,         -44.541192967231
     489,         318.925490065909,        -3.42941250066711,        -26.0956883514746
     490,         12.3293758357546,         157.641535593961,      -0.0405716896246056
     491,         -269.87523931911,        -25.8587086693657,          8.9861542852531
     492,        -2.18949024481209,         3.58279508705381,        -3.28229936737674
     493,         111.777659404919,        -17.9583007986463,         12.2681326662508
     494,        -427.576565925766,        -126.903077662412,        -15.9471322553917
     495,        -370.227558929579,        -11.9607869814899,          24.450766022527
     496,         73.3651729195217,        -85.3723384995816,         48.7593361459483
     497,        -322.221605443499,         150.809171391562,         12.1728172317021
     498,        -37.1946292050158,         21.1561563928407,        -40.9404879626541
     499,        -41.1623030636284,         76.1979822331099,        -4.98371177026243
     500,         164.014527419589,         222.003222492525,        -1.45161862925236
図2 図



コメント

乱数で簡単に作ったので立方体内にまばらに点が配置されました。

少し追加すれば、偏りなどを意図的に入れたり、好きな形の中に点を配置したりする事も出来そうです。

ニーズがありそうならやろうかなと思います。



以上