XDL Manual

XDL 데이터 객체 사용하기

(piXoneer XDL Tutorial)

 

 

 

 

 

 

이 문서는 XDL Development Library

 설치 및 사용하기 위한 문서입니다.

 

2017. 01.

 

 

 

 

목차

1    사용 하기... 9

1.1    XDL 엔진... 9

1.2    XDL의 데이터구조를 이용한 예제 프로그램 만들기... 9

1.3    XAngle활용 예제... 13

1.4    XVertex2i 활용 예제... 15

1.5    XVertex2d 활용 예제... 16

1.6    XVertex2i 활용 예제... 18

1.7    XVertex3d 활용 예제... 19

1.8    XVertex4d 활용 예제... 21

1.9    XGeoPoint 활용 예제... 22

1.10     XColorTable 활용 예제... 24

1.11     XGrid 활용 예제... 26

 

 


 

1      사용 하기

1.1    XDL 엔진

설치 프로그램으로 배포되는 XDL 엔진은 Visual Studio 2010 x86 Release 버전으로, Visual Studio 2010 이상의 버전에서 사용 가능하다.

아래의 설명은 Visual Studio 2010을 기준으로 하겠다.

 

1.2    XDL의 데이터구조를 이용한 예제 프로그램 만들기

1.2.1         Visual Studio 2010을 실행한다.

1.2.2         메뉴 [파일]-[새로 만들기]-[프로젝트]를 선택한다.

 

1.2.3         [새 프로젝트] 대화상자에서 왼쪽의 템플릿 창에서 “Visual C#”을 선택하고, 대화상자 중간의 목록에서 “Windows Forms 응용 프로그램을 선택한다. 프로젝트의 이름을 사용자가 원하는 경로로 이동한 다음 “XDL_DataStructure” 입력하고 [새 프로젝트] 대화상자의 확인버튼을 클릭한다.

프로젝트 이름은 Visual Studio가 생성하는 이름으로 기본으로 하겠다. 이 문서에서는 대화상자 오른쪽 아래에 있는 솔루션용 디렉토리 만들기는 선택하지 않겠다.

확인버튼을 누르면 프로젝트가 기본적으로 생성되고, 화면에 Form을 디자인할 수 있는 화면이 뜬다. 만약 아래와 같이 Form 디자인화면이 생성되지 않으면, [솔루션 탐색기] 창에서 “Form1.cs”를 마우스 더블클릭을 하여 디자인화면을 연다.

1.2.4         참조를 통해 NXDL.dll 항목을 추가한다.

솔루션 탐색기의 프로젝트 아래에 있는 참조 아이템의 마우스 오른쪽 버튼을 클릭하여 생성되는 팝업메뉴에서 참조추가메뉴를 선택한다.

메뉴를 선택하면 아래와 같이 [도구 상자 항목 선택] 대화상자가 나타나며, 대화상자 아래쪽에 있는 찾아보기버튼을 클릭한다.

열기 대화상자에서 “C:\Pixoneer\XDL1.2\bin\NXDL.dll” 파일을 선택한 후 열기를 클릭하고, [도구 상자 항목 선택] 대화상자의 확인버튼을 클릭한다. [참조] “NXDL”가 추가된 것을 확인할 수 있다.

 

1.2.5         프로그램 종료시 메모리를 해제를 위한 코드를 Form이 닫히는 이벤트에 추가한다.

Form1의 디자인 화면에서 Form을 선택한 후 [속성] (Visual Studio 메뉴 [보기]-[다른 창]-[속성 창]을 선택하면 된다.)에서 이벤트메뉴를 클릭하고 이벤트 목록 중 “FormClosed”를 선택한 뒤 마우스 더블클릭을 하여 해당이벤트를 추가한다.

아래의 굵은 글씨처럼 Form1_FormClosed 함수에 코드를 추가한다.

namespace XDL_DataStructure
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
Pixoneer.NXDL.Xfn.Close();	//코드 추가
        }
    }
}

 

1.2.6         다음과 같이 NXDL에 대하여 참조를 설정한다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Pixoneer.NXDL; // 추가

 

1.2.7         다음과 같이 Form에 버튼을 올려 디자인한다.

 


1.3    XAngle활용 예제

1.3.1         XAngle을 더블클릭하여 함수를 자동생성한다.

private void XAngle_Click(object sender, EventArgs e)
{

}

 

1.3.2         buttonXAngle_Click 함수에 다음과 같이 코드를 입력한다.

private void buttonXAngle_Click(object sender, EventArgs e)
{
// XAngle을 이용하여 Degree값을 DMS나 Radian값으로 변경하는 예제.
            // 1. 객체의 선언
            XAngle angle1 = new XAngle();
            XAngle angle2 = new XAngle(0.634345152625095); // 라디안 값을 입력

            // 2. 각도가 동일한지 여부 체크
            angle1.deg = 36.34530;
            if (angle1.IsEqual(angle2))
            {
                Console.WriteLine("Equal");
            }

            // 3. 변환값의 프린팅
            int nDeg, nMin;
            double sec;
            nDeg = nMin = 0;
            sec = 0;
            angle1.GetDms(ref nDeg, ref nMin, ref sec);
            Console.WriteLine("Degree : " + angle1.deg.ToString());
            Console.WriteLine("DMS : " + nDeg.ToString() + " deg, " + nMin.ToString() + " min, " + sec.ToString() + " sec");
            Console.WriteLine("Radian : " + angle1.rad.ToString());

}

1.3.3         컴파일하고 프로그램을 실행하여 XAngle버튼을 클릭한다.

 

1.3.4         출력창에 값이 프린트됨을 확인한다.

라디안 값인 0.634345152625095값과 Deg값인 36.34530값이 동일하므로 Equal의 결과값을 나타내며 angle1의 객체로부터 Degree, DMS, Radian값을 프린트한다.

 

1.4    XVertex2i 활용 예제

1.4.1         XVertex2i을 더블클릭하여 함수를 자동생성한다..

private void buttonXVertex2i_Click(object sender, EventArgs e)
{

}

 

1.4.2         buttonXVertex2i_Click 함수에 다음과 같이 코드를 입력한다.

private void buttonXVertex2i_Click(object sender, EventArgs e)
{
// XVertex2i는 2차원 점 좌표를 설정하는 x, y값을 갖는 데이터 구조에 해당합니다.
      // XVertex2i에서 2는 2차원을 의미하고 i는 integer을 의미합니다.
      // XVertex2i객체를 이용하여 기본 4칙연산은 물론이고, Dot Product나 Normalize등의 연산도 가능합니다.

      // 1. 객체의 선언
      XVertex2i v1 = new XVertex2i(100, 200);
      XVertex2i v2 = new XVertex2i();
      v2.x = 400; v2.y = 500;

      // 2. XVertex2i 객체의 연산
      XVertex2i v3 = v1 + v2;
      XVertex2i v4 = 5 * v3 * 10;
      XVertex2i v5 = v4 - v1;
      double dotV1V2 = v1.dotProduct(v2);
      double normV1 = v1.norm();

      // 3. 결과값의 프린팅.
      Console.WriteLine("x : " + v3.x.ToString() + " y : " + v3.y.ToString());
      Console.WriteLine("x : " + v4.x.ToString() + " y : " + v4.y.ToString());
      Console.WriteLine("x : " + v5.x.ToString() + " y : " + v5.y.ToString());
      Console.WriteLine("dot v1 v2 : " + dotV1V2.ToString());
      Console.WriteLine("norm v1 : " + normV1.ToString());  

}

1.4.3         컴파일하고 프로그램을 실행하여 XVertex2i버튼을 클릭한다.

 

1.4.4         출력창에 값이 프린트됨을 확인한다.

출력창에 XVertex2i객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.

 

1.5    XVertex2d 활용 예제

 

1.5.1         XVertex2d을 더블클릭하여 함수를 자동생성한다..

private void buttonXVertex2d_Click(object sender, EventArgs e)
{

}

 

1.5.2         buttonXVertex2d_Click 함수에 다음과 같이 코드를 입력한다.

private void buttonXVertex2d_Click(object sender, EventArgs e)
{
// XVertex2d는 2차원 점 좌표를 설정하는 x, y값을 갖는 데이터 구조에 해당합니다.
      // XVertex2d에서 2는 2차원을 의미하고 d는 double을 의미합니다.
      // XVertex2d객체를 이용하여 기본 4칙연산은 물론이고, Dot Product나 Normalize등의 연산도 가능합니다.

      // 1. 객체의 선언
      XVertex2d v1 = new XVertex2d(100.2, 200.5);
      XVertex2d v2 = new XVertex2d();
      v2.x = 400.2; v2.y = 500.5;

      // 2. XVertex2d 객체의 연산
      XVertex2d v3 = v1 + v2;
      XVertex2d v4 = 5 * v3 * 10;
      XVertex2d v5 = v4 - v1;
      double dotV1V2 = v1.dotProduct(v2); // Dot Product 연산
      double normV1 = v1.norm();          // Norm 계산

      // 3. 결과값의 프린팅.
      Console.WriteLine("x : " + v3.x.ToString() + " y : " + v3.y.ToString());
      Console.WriteLine("x : " + v4.x.ToString() + " y : " + v4.y.ToString());
      Console.WriteLine("x : " + v5.x.ToString() + " y : " + v5.y.ToString());
      Console.WriteLine("dot v1 v2 : " + dotV1V2.ToString());
      Console.WriteLine("norm v1 : " + normV1.ToString());

}

1.5.3         컴파일하고 프로그램을 실행하여 XVertex2d버튼을 클릭한다.

 

1.5.4         출력창에 값이 프린트됨을 확인한다.

출력창에 XVertex2d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.

 

1.6    XVertex2i 활용 예제

1.6.1         XVertex2i을 더블클릭하여 함수를 자동생성한다..

private void buttonXVertex2i_Click(object sender, EventArgs e)
{

}

 

1.6.2         buttonXVertex2i_Click 함수에 다음과 같이 코드를 입력한다.

private void buttonXVertex2i_Click(object sender, EventArgs e)
{
// XVertex2i는 2차원 점 좌표를 설정하는 x, y값을 갖는 데이터 구조에 해당합니다.
      // XVertex2i에서 2는 2차원을 의미하고 i는 integer을 의미합니다.
      // XVertex2i객체를 이용하여 기본 4칙연산은 물론이고, Dot Product나 Normalize등의 연산도 가능합니다.

      // 1. 객체의 선언
      XVertex2i v1 = new XVertex2i(100, 200);
      XVertex2i v2 = new XVertex2i();
      v2.x = 400; v2.y = 500;

      // 2. XVertex2i 객체의 연산
      XVertex2i v3 = v1 + v2;
      XVertex2i v4 = 5 * v3 * 10;
      XVertex2i v5 = v4 - v1;
      double dotV1V2 = v1.dotProduct(v2);
      double normV1 = v1.norm();

      // 3. 결과값의 프린팅.
      Console.WriteLine("x : " + v3.x.ToString() + " y : " + v3.y.ToString());
      Console.WriteLine("x : " + v4.x.ToString() + " y : " + v4.y.ToString());
      Console.WriteLine("x : " + v5.x.ToString() + " y : " + v5.y.ToString());
      Console.WriteLine("dot v1 v2 : " + dotV1V2.ToString());
      Console.WriteLine("norm v1 : " + normV1.ToString());  

}

1.6.3         컴파일하고 프로그램을 실행하여 XVertex2i버튼을 클릭한다.

 

1.6.4         출력창에 값이 프린트됨을 확인한다.

출력창에 XVertex2i객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.

 

1.7    XVertex3d 활용 예제

 

1.7.1         XVertex3d을 더블클릭하여 함수를 자동생성한다..

private void buttonXVertex3d_Click(object sender, EventArgs e)
{

}

 

1.7.2         ButtonXVertex3d_Click 함수에 다음과 같이 코드를 입력한다.

private void buttonXVertex3d_Click(object sender, EventArgs e)
{
// XVertex3d는 3차원 점 좌표를 설정하는 x, y, z값을 갖는 데이터 구조에 해당합니다.
// XVertex3d에서 3는 3차원을 의미하고 d는 double을 의미합니다.
// XVertex3d객체를 이용하여 기본 4칙연산은 물론이고, Dot Product나 Normalize등의 연산도 가능합니다.

// 1. 객체의 선언
XVertex3d v1 = new XVertex3d(100, 200, 300);
XVertex3d v2 = new XVertex3d();
v2.x = 400; v2.y = 500; v2.z = 600;

// 2. XVertex3d 객체의 연산
XVertex3d v3 = v1 + v2;
XVertex3d v4 = 5 * v3 * 10;
XVertex3d v5 = v4 - v1;
double dotV1V2 = v1.dotProduct(v2);
double normV1 = v1.norm();

// 3. 결과값의 프린팅.
Console.WriteLine("x : " + v3.x.ToString() + " y : " + v3.y.ToString() + " z : " + v3.z.ToString());
Console.WriteLine("x : " + v4.x.ToString() + " y : " + v4.y.ToString() + " z : " + v4.z.ToString());
Console.WriteLine("x : " + v5.x.ToString() + " y : " + v5.y.ToString() + " z : " + v5.z.ToString());
Console.WriteLine("dot v1 v2 : " + dotV1V2.ToString());
Console.WriteLine("norm v1 : " + normV1.ToString());

}

1.7.3         컴파일하고 프로그램을 실행하여 XVertex3d버튼을 클릭한다.

 

1.7.4         출력창에 값이 프린트됨을 확인한다.

출력창에 XVertex3d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.

 

 

1.8    XVertex4d 활용 예제

 

1.8.1           XVertex4d을 더블클릭하여 함수를 자동생성한다..

private void buttonXVertex4d_Click(object sender, EventArgs e)
{

}

 

1.8.2           ButtonXVertex4d_Click 함수에 다음과 같이 코드를 입력한다.

private void buttonXVertex3d_Click(object sender, EventArgs e)
{
// XVertex3d는 3차원 점 좌표를 설정하는 x, y, z값을 갖는 데이터 구조에 해당합니다.
// XVertex3d에서 3는 3차원을 의미하고 d는 double을 의미합니다.
// XVertex3d객체를 이용하여 기본 4칙연산은 물론이고, Dot Product나 Normalize등의 연산도 가능합니다.

// 1. 객체의 선언
XVertex3d v1 = new XVertex3d(100, 200, 300);
XVertex3d v2 = new XVertex3d();
v2.x = 400; v2.y = 500; v2.z = 600;

// 2. XVertex3d 객체의 연산
XVertex3d v3 = v1 + v2;
XVertex3d v4 = 5 * v3 * 10;
XVertex3d v5 = v4 - v1;
double dotV1V2 = v1.dotProduct(v2);
double normV1 = v1.norm();

// 3. 결과값의 프린팅.
Console.WriteLine("x : " + v3.x.ToString() + " y : " + v3.y.ToString() + " z : " + v3.z.ToString());
Console.WriteLine("x : " + v4.x.ToString() + " y : " + v4.y.ToString() + " z : " + v4.z.ToString());
Console.WriteLine("x : " + v5.x.ToString() + " y : " + v5.y.ToString() + " z : " + v5.z.ToString());
Console.WriteLine("dot v1 v2 : " + dotV1V2.ToString());
Console.WriteLine("norm v1 : " + normV1.ToString());

}

1.8.3           컴파일하고 프로그램을 실행하여 XVertex3d버튼을 클릭한다.

 

1.8.4           출력창에 값이 프린트됨을 확인한다.

출력창에 XVertex4d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Norm의 연산을 수행하는 결과를 보여준다.

 

1.9    XGeoPoint 활용 예제

 

1.9.1         XGeoPoint을 더블클릭하여 함수를 자동생성한다..

private void buttonXGeoPoint_Click(object sender, EventArgs e)
{

}

 

1.9.2         ButtonXGeoPoint_Click 함수에 다음과 같이 코드를 입력한다. Degree단위로 입력한 객체와 Radian값으로 입력한 객체가 동일한지 여부를 확인하고 XGeoPoint로부터 ECEF좌표값을 XVertex3d로 변환할 수 있다. 또한 ECEF값을 XGeoPoint로 변환하여 기존 입력값과 동일한지 여부를 확인할 수 있다. private void buttonXGeoPoint_Click(object sender, EventArgs e)
{
// XGeoPoint는 위경도 좌표와 ECEF 좌표간의 상호 변환을 수행하며 다양한 타 클래스의 입력객체로 활용된다.
        // 3차원 지구좌표의 계산 및 도시를 수행시 위경도와 ECEF좌표사이의 변환이 빈번히 일어나는데 이때 활용이 가능하다.

       // 1. 위경도 좌표값으로 부터 XGeoPoint객체를 생성
        XGeoPoint geoPos1 = XGeoPoint.FromDegree(127.123, 36.1234, 258);

        // 2. XGeoPoint객체로부터 Radian값으로 변환이 가능하며 Radian값으로부터 XGeoPoint객체를 생성
        XGeoPoint geoPos2 = XGeoPoint.FromRadian(geoPos1.lonr, geoPos1.latr, geoPos1.hgt);

        // 3. 두 XGeoPoint객체의 값이 동일한지 여부 확인
        if (geoPos1.IsEqual(geoPos2))
        {
            Console.WriteLine("geoPos1 is equal to geoPos2");
        }
        else
        {
            Console.WriteLine("geoPos1 is not equal to geoPos2");
        }

        // 4. XGeoPoint객체로부터 ECEF좌표값을 XVertex3d으로 얻는다.
        XVertex3d v1 = geoPos1.ecr;

        // 5. ECEF좌표값을 이용하여 XGeoPoint값을 생성한다. 
        XGeoPoint geopos3 = XGeoPoint.FromEcr(ref v1);
        if (geopos3.IsEqual(geoPos1))
        {
            Console.WriteLine("geoPos3 is equal to geoPos1");
        }
        else
        {
            Console.WriteLine("geoPos3 is not equal to geoPos1");
        }
}

1.9.3         컴파일하고 프로그램을 실행하여 XGeoPoint버튼을 클릭한다.

 

1.9.4         출력창에 값이 프린트됨을 확인한다.

출력창에 XGeoPoint객체를 이용한 다양한 형태로의 변환을 수행하고 동일한지 여부를 확인할 수 있다.

 

 

1.10 XColorTable 활용 예제

 

1.10.1      XColorTable을 더블클릭하여 함수를 자동생성한다..

private void buttonXColorTable_Click(object sender, EventArgs e)
{

}

 

1.10.2      ButtonXColorTable_Click 함수에 다음과 같이 코드를 입력한다. private void buttonXGeoPoint_Click(object sender, EventArgs e)
{
// 1. ColorTable이 기정의된 Table의 수를 얻는다.
      int nNumColorTable = Enum.GetNames(typeof(eColorTable)).Length;
      Console.WriteLine("ColorTable 수 : " + nNumColorTable.ToString());

      // 2. 기 정의된 ColorTable의 이름을 얻어서 프린트한다.
      String[] arrPNmaes = XColorTable.GetPaletteNameList();
      for (int i=0; i<arrPNmaes.Length; i++)
      {
      	Console.WriteLine(arrPNmaes[i]);
       }
        
       // 3. XColorTable의 객체를 생성하고 Rainbow ColorTable을 설정한다. 
       XColorTable clrTbl = new XColorTable();
       clrTbl.LoadColorTable(eColorTable.Rainbow);

      // 4. 각 256개의 칼라 테이블에 존재하는 r, g, b값을 얻어서 출력한다.
      byte r, g, b;
      r = g = b = 0;
      for (int i=0; i<=255; i++)
      {
          clrTbl.GetCLT(i, ref r, ref g, ref b);
      	  Console.WriteLine("Index " + i.ToString() + ", " + "R : " + r.ToString() + ", " + "G : " + g.ToString() + ", " + "B : " + b.ToString());
       }
            
       // 5. 일부 구간을 0으로 채운다.
       for (int i=0; i<=100; i++)
       {
           clrTbl.SetCLT(i, 0, 0, 0);
      }

       // 6. 각 256개의 칼라 테이블에 존재하는 r, g, b값을 얻어서 출력한다. 일부구간이 0으로 변경되었는지 확인한다.
       r = g = b = 0;
       for (int i = 0; i <= 255; i++)
       {
            clrTbl.GetCLT(i, ref r, ref g, ref b);
            Console.WriteLine("Index " + i.ToString() + ", " + "R : " + r.ToString() + ", " + "G : " + g.ToString() + ", " + "B : " + b.ToString());
        }
}

1.10.3      컴파일하고 프로그램을 실행하여 XColorTable버튼을 클릭한다.

 

1.10.4      출력창에 값이 프린트됨을 확인한다.

 

 

1.11 XGrid 활용 예제

 

1.11.1      XColorTable을 더블클릭하여 함수를 자동생성한다..

private void buttonXGrid_Click(object sender, EventArgs e)
{

}

 

1.11.2      ButtonXGrid_Click 함수에 다음과 같이 코드를 입력한다. private void buttonXGrid_Click(object sender, EventArgs e)
{
// 1. 32bit signed Integer형의 3x3형태의 XGrid객체를 생성한다. 
       XGrid grid = new XGrid(3, 3, eDataType.SINT32);

       // 2. grid객체에 값을 입력한다.
       int val = 1;
       for (int j = 0; j < 3; j++)
       {
          for (int i = 0; i < 3; i++)
          {
              grid.SetValue(j, i, val);
              val += 1;
          }
       }

       // 3. 입력된 grid객체의 값을 프린트한다.
       // 입력된 값을 얻을때는 Double형으로 캐스팅되어서 얻는다.
       double ret = 0;
       string strVal = "";
       for (int j = 0; j < 3; j++)
       {
           for (int i = 0; i < 3; i++)
           {
               grid.GetValue(j, i, ref ret); strVal = strVal + ret.ToString( ) + " ";
           }
           strVal += "; ";
       }
       Console.WriteLine(strVal);

       // 4. 입력된 grid값에 대한 Flip을 수행한다. 
       XGrid horzFlip =new XGrid();
       grid.FlipHorz(out horzFlip);

       // 5. Flip된 grid객체의 값을 프린트한다.
       ret = 0;
       strVal = "";
       for (int j = 0; j < 3; j++)
       {
           for (int i = 0; i < 3; i++)
           {
               horzFlip.GetValue(j, i, ref ret); strVal = strVal + ret.ToString() + " ";
           }
           strVal += "; ";
       }
       Console.WriteLine(strVal);


       // 6. 특정 Row를 얻는다.
       XGrid rowVec = new XGrid();
       horzFlip.GetRowVector(out rowVec, 1);
       strVal = "";
       for (int i = 0; i < 3; i++)
       {
            rowVec.GetValue(0, i, ref ret); strVal = strVal + ret.ToString() + " ";
       }
       Console.WriteLine(strVal);
    }
}

1.11.3      컴파일하고 프로그램을 실행하여 XGrid버튼을 클릭한다.

 

1.11.4      출력창에 값이 프린트됨을 확인한다.