piXoneer Development Library
XDL 3.0 for C#
XDL의 다양한 데이터 구조체에 대한 활용법을 설명합니다.
XVertex, XGrid, XColorTable, XGeoPoint, XAngle등에 대해서 설명합니다.
“만들기” 버튼을 누르면 프로젝트가 기본적으로 생성되고, 화면에 Form을 디자인할 수 있는 화면이 생성된다. 만약 아래와 같이 Form 디자인화면이 생성되지 않으면, [솔루션 탐색기] 창에서 “Form1.cs”를 마우스 더블클릭하여 디자인화면을 연다.
솔루션 탐색기의 프로젝트 아래에 있는 참조 아이템의 마우스 오른쪽 버튼을 클릭하여 생성되는 팝업 메뉴에서서 “참조 추가” 메뉴를 선택한다.
메뉴를 선택하면 아래와 같이 [참조 관리자] 대화상자가 나타나며, 대화상자 아래쪽에 있는 “찾아보기” 버튼을 클릭한다.
열기 대화상자에서 “C:\Pixoneer\XDL3.0\bin\NXDL.dll” 파일을 선택한 후 “추가”를 클릭하고, [참조 관리자] 대화상자의 “확인” 버튼을 클릭한다. 솔루션 탐색기의 [참조]에 “NXDL” 이 추가된 것을 확인할 수 있다.
Form1의 디자인 화면에서 Form을 선택한 후 [속성] 창(Visual Studio 메뉴 [보기]-[속성 창]을 선택하면 된다.)에서 [이벤트] 메뉴를 클릭하고 이벤트 목록 중 “FormClosed”를 선택한 뒤 마우스 더블클릭을 하여 해당 이벤트를 추가한다.
아래와 같이 Form1_FormClosed 함수에 코드를 추가한다.
C#
namespace XDL_DataStructure
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Pixoneer.NXDL.Xfn.Close(); //코드 추가
}
}
}
C#
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; // 추가
C#
private void buttonXAngle_Click(object sender, EventArgs e)
{
}
C#
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());
}
라디안 값인 0.634345152625095값과 Degree값인 36.34530값이 동일하므로 Equal의 결과값을 나타내며 angle1의 객체로부터 Degree, DMS, Radian값을 프린트한다.
C#
private void buttonXVertex2i_Click(object sender, EventArgs e)
{
}
C#
private void buttonXVertex2i_Click(object sender, EventArgs e)
{
// XVertex2i는 2차원 점 좌표를 설정하는 x, y값을 갖는 데이터 구조에 해당합니다.
// XVertex2i에서 2는 2차원을 의미하고 i는 integer을 의미합니다.
// XVertex2i객체를 이용하여 기본 사칙연산은 물론이고, 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());
}
출력창에 XVertex2i객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.
C#
private void buttonXVertex2d_Click(object sender, EventArgs e)
{
}
C#
private void buttonXVertex2d_Click(object sender, EventArgs e)
{
// XVertex2d는 2차원 점 좌표를 설정하는 x, y값을 갖는 데이터 구조에 해당합니다.
// XVertex2d에서 2는 2차원을 의미하고 d는 double을 의미합니다.
// XVertex2d객체를 이용하여 기본 사칙연산은 물론이고, 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());
}
출력창에 XVertex2d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.
C#
private void buttonXVertex3d_Click(object sender, EventArgs e)
{
}
C#
private void buttonXVertex3d_Click(object sender, EventArgs e)
{
// XVertex3d는 3차원 점 좌표를 설정하는 x, y, z값을 갖는 데이터 구조에 해당합니다.
// XVertex3d에서 3는 3차원을 의미하고 d는 double을 의미합니다.
// XVertex3d객체를 이용하여 기본 사칙연산은 물론이고, 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());
}
출력창에 XVertex3d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.
C#
private void buttonXVertex4d_Click(object sender, EventArgs e)
{
}
C#
private void buttonXVertex4d_Click(object sender, EventArgs e)
{
// XVertex4d는 4차원 점 좌표를 성정하는 x, y, z, w값을 갖는 데이터 구조에 해당합니다.
// Xvertex4d에서 4는 4차원을 의미하고 d는 double을 의미합니다.
// Xvertex4d객체를 이용하여 기본 사칙연산은 물론이고, Normalize의 연산과 서로의 값이 동일한지 판단도 가능합니다.
// 1. 객체의 선언
XVertex4d v1 = new XVertex4d(100, 200, 300, 400);
XVertex4d v2 = new XVertex4d();
v2.x = 500; v2.y = 600; v2.z = 700; v2.w = 800;
// 2. XVertex4d 객체의 연산
XVertex4d v3 = v1 + v2;
XVertex4d v4 = 5 * v3 * 10;
XVertex4d v5 = v4 - v1;
double normV1 = v1.norm();
bool IsEqualV1V1 = v1.IsEqual(v1);
bool IsEqualV3V1 = v3.IsEqual(v1);
// 3. 결과값의 프린팅.
Console.WriteLine("x : " + v3.x.ToString() + " y : " + v3.y.ToString() + " z : " + v3.z.ToString() + " w : " + v3.w.ToString());
Console.WriteLine("x : " + v4.x.ToString() + " y : " + v4.y.ToString() + " z : " + v4.z.ToString() + " w : " + v4.w.ToString());
Console.WriteLine("x : " + v5.x.ToString() + " y : " + v5.y.ToString() + " z : " + v5.z.ToString() + " w : " + v5.w.ToString());
Console.WriteLine("norm v1 : " + normV1.ToString());
Console.WriteLine("v1 is equal to v1 : " + IsEqualV1V1);
Console.WriteLine("v3 Is equal to v1 : " + IsEqualV3V1);
}
출력창에 XVertex4d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Norm의 연산, IsEqual 함수를 수행하는 결과를 보여준다.
C#
private void buttonXGeoPoint_Click(object sender, EventArgs e)
{
}
Degree단위로 입력한 객체와 Radian값으로 입력한 객체가 동일한지 여부를 확인하고 XGeoPoint로부터 ECEF좌표값을 XVertex3d로 변환할 수 있다. 또한 ECEF값을 XGeoPoint로 변환하여 기존 입력값과 동일한지 여부를 확인할 수 있다.
C#
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");
}
}
출력창에 XGeoPoint객체를 이용한 다양한 형태로의 변환을 수행하고 동일한지 여부를 확인할 수 있다.
C#
private void buttonXColorTable_Click(object sender, EventArgs e)
{
}
C#
private void buttonXColorTable_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());
}
}
C#
private void buttonXGrid_Click(object sender, EventArgs e)
{
}
C#
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);
}
“만들기” 버튼을 누르면 프로젝트가 기본적으로 생성되고, 화면에 Window을 디자인할 수 있는 화면이 뜬다. 만약 아래와 같은 Window 창이 생성되지 않으면, [솔루션 탐색기] 창에서 MainWindow.xaml”를 마우스 더블클릭을 하여 창을 연다.
솔루션 탐색기의 프로젝트 아래에 있는 참조 아이템의 마우스 오른쪽 버튼을 클릭하여 생성되는 팝업메뉴에서 “참조추가” 메뉴를 선택한다.
메뉴를 선택하면 아래와 같이 [참조 관리자] 대화상자가 나타나며, 대화상자 아래쪽에 있는 “찾아보기” 버튼을 클릭한다.
“C:\Pixoneer\XDL3.0\bin\NXDL.dll” 파일을 선택한다. “추가” 를 클릭하고, [참조 관리자] 대화상자의 “확인” 버튼을 클릭한다. [참조] 에 “NXDL”이 추가된 것을 확인할 수 있다.
MainWindow.xaml 창에서 Window을 선택한 후 [속성] 창에서 [이벤트] 메뉴를 클릭하고 이벤트 목록 중 “Closed”를 마우스 더블클릭을 하여 해당 이벤트를 추가한다.
아래와 같이 Window_Closed 함수에 코드를 추가한다.
C#
namespace XDL_DataStructrue
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Closed(object sender, EventArgs e)
{
Pixoneer.NXDL.Xfn.Close(); //코드추가
}
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Pixoneer.NXDL; //추가
[F5]키를 눌러 실행하면 다음과 같은 화면이 뜬다.
C#
private void buttonXAngle_Click(object sender, RoutedEventArgs e)
{
}
C#
private void buttonXAngle_Click(object sender, RoutedEventArgs e)
{
// XAngle을 이용하여 Degree값을 DMS나 Radian값으로 변경하는 예제.
// 1. 객체의 선언
XAngle angle1 = new XAngle();
XAngle angle2 = new XAngle(0.6345435252625095);
// 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 : " + angle2.deg.ToString());
Console.WriteLine("DMS : " + nDeg.ToString() + " deg, " + nMin.ToString() + " min, " + sec.ToString() + " sec ");
Console.WriteLine("Radian : " + angle1.rad.ToString());
}
라디안 값인 0.634345152625095값과 Degree값인 36.34530값이 동일하므로 Equal의 결과값을 나타내며 angle1의 객체로부터 Degree, DMS, Radian값을 프린트한다.
C#
private void buttonXVertex2i_Click(object sender, RoutedEventArgs e)
{
}
C#
private void buttonXVertex2i_Click(object sender, RoutedEventArgs e)
{
// XVertex2i는 2차원 점 좌표를 설정하는 x, y값을 갖는 데이터 구조에 해당합니다.
// XVertex2i에서 2는 2차원을 의미하고 i는 integer을 의미합니다.
// XVertex2i객체를 이용하여 기본 사칙연산은 물론이고, 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());
}
출력창에 XVertex2i객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.
C#
private void buttonXVertex2d_Click(object sender, RoutedEventArgs e)
{
}
C#
private void buttonXVertex2d_Click(object sender, RoutedEventArgs e)
{
// XVertex2d는 2차원 점 좌표를 설정하는 x, y값을 갖는 데이터 구조에 해당합니다.
// XVertex2d에서 2는 2차원을 의미하고 d는 double을 의미합니다.
// XVertex2d객체를 이용하여 기본 사칙연산은 물론이고, 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());
}
출력창에 XVertex2d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.
C#
private void buttonXVertex3d_Click(object sender, RoutedEventArgs e)
{
}
C#
private void buttonXVertex3d_Click(object sender, RoutedEventArgs e)
{
// XVertex3d는 3차원 점 좌표를 설정하는 x, y, z값을 갖는 데이터 구조에 해당합니다.
// XVertex3d에서 3는 3차원을 의미하고 d는 double을 의미합니다.
// XVertex3d객체를 이용하여 기본 사칙연산은 물론이고, 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());
}
출력창에 XVertex3d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Dot Product, Norm의 연산을 수행하는 결과를 보여준다.
C#
private void buttonXVertex4d_Click(object sender, RoutedEventArgs e)
{
}
C#
private void buttonXVertex4d_Click(object sender, RoutedEventArgs e)
{
// XVertex4d는 4차원 점 좌표를 성정하는 x, y, z, w값을 갖는 데이터 구조에 해당합니다.
// Xvertex4d에서 4는 4차원을 의미하고 d는 double을 의미합니다.
// Xvertex4d객체를 이용하여 기본 사칙연산은 물론이고, Normalize의 연산과 서로의 값이 동일한지 판단도 가능합니다.
// 1. 객체의 선언
XVertex4d v1 = new XVertex4d(100, 200, 300, 400);
XVertex4d v2 = new XVertex4d();
v2.x = 500; v2.y = 600; v2.z = 700; v2.w = 800;
// 2. XVertex4d 객체의 연산
XVertex4d v3 = v1 + v2;
XVertex4d v4 = 5 * v3 * 10;
XVertex4d v5 = v4 - v1;
double normV1 = v1.norm();
bool IsEqualV1V1 = v1.IsEqual(v1);
bool IsEqualV3V1 = v3.IsEqual(v1);
// 3. 결과값의 프린팅.
Console.WriteLine("x : " + v3.x.ToString() + " y : " + v3.y.ToString() + " z : " + v3.z.ToString() + " w : " + v3.w.ToString());
Console.WriteLine("x : " + v4.x.ToString() + " y : " + v4.y.ToString() + " z : " + v4.z.ToString() + " w : " + v4.w.ToString());
Console.WriteLine("x : " + v5.x.ToString() + " y : " + v5.y.ToString() + " z : " + v5.z.ToString() + " w : " + v5.w.ToString());
Console.WriteLine("norm v1 : " + normV1.ToString());
Console.WriteLine("v1 is equal to v1 : " + IsEqualV1V1);
Console.WriteLine("v3 Is equal to v1 : " + IsEqualV3V1);
}
출력창에 XVertex4d객체를 이용한 객체의 생성과 객체를 이용한 덧셈, 뺄셈, Norm의 연산, IsEqual 함수를 수행하는 결과를 보여준다.
C#
private void buttonXGeoPoint_Click(object sender, RoutedEventArgs e)
{
}
Degree단위로 입력한 객체와 Radian값으로 입력한 객체가 동일한지 여부를 확인하고 XGeoPoint로부터 ECEF좌표값을 XVertex3d로 변환할 수 있다. 또한 ECEF값을 XGeoPoint로 변환하여 기존 입력값과 동일한지 여부를 확인할 수 있다.
C#
private void buttonXGeoPoint_Click(object sender, RoutedEventArgs 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");
}
}
출력창에 XGeoPoint객체를 이용한 다양한 형태로의 변환을 수행하고 동일한지 여부를 확인할 수 있다.
C#
private void buttonXColorTable_Click(object sender, RoutedEventArgs e)
{
}
C#
private void buttonXColorTable_Click(object sender, RoutedEventArgs 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());
}
}
C#
private void buttonXGrid_Click(object sender, RoutedEventArgs e)
{
}
C#
private void buttonXGrid_Click(object sender, RoutedEventArgs 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);
}