C#3D立方体ワイヤーフレーム (第3回) for VS2013 Express
第3回目
CThreeD.cs C#3D立方体ワイヤーフレーム (第1回) for VS2013 Express
CBond.cs C#3D立方体ワイヤーフレーム (第2回) for VS2013 Express
CRubic.cs C#3D立方体ワイヤーフレーム (第3回) for VS2013 Express
Form1.cs C#3D立方体ワイヤーフレーム (第4回) for VS2013 Express
CThreeDクラスでは座標を2次元に投影する機能を
CBondクラスで立方体の座標を格納した。
CRubicクラスでは、CBondで格納した座標を
ひとつの塊とみなして操作し。
CRubicクラス
CRubic.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Drawing; namespace WindowsFormsApplication1 { public partial class Form1 : Form { class CRubic { private Vertex m_ViewVertex; private Polar m_ViewPolar = new Polar(); private CThreeD m_pThreeD; private int m_scale; Polar m_OldViewPolar = new Polar(); Point m_ClickPoint = new Point(); private CBond[] m_pBond = new CBond[3]; /*============================================================================= 機能 メモリDCに描画する 引数 pDC : メモリデバイスコンテキストへのポインタ =============================================================================*/ public void DrawRubic(Graphics gra, Pen pen, int scale) { int i, j, k; i = 0; j = 0; k = 0; m_scale = scale; m_ViewPolar.r = m_scale; m_pBond[0].DrawBond(gra, pen, m_ViewVertex); } /*============================================================================= 機能 コンストラクタ =============================================================================*/ public CRubic(int scale) { int i, j, k; i = 0; j = 0; k = 0; m_pThreeD = new CThreeD(); m_scale = scale; m_pBond[0] = new CBond(i, j, k, ref m_pThreeD); InitWorld(); TransferScreen(); } /*============================================================================= 機能 視点を初期化する =============================================================================*/ public void InitWorld() { m_ViewPolar.r = m_scale; m_ViewPolar.p = 0; m_ViewPolar.q = 0; m_pThreeD.PolarToVertex(m_ViewPolar, ref m_ViewVertex); } /*======================================================================== 機能 ルービックキューブを投影変換をする ========================================================================*/ public void TransferScreen() { int i, j, k; i = 0; j = 0; k = 0; m_pBond[0].TransferScreen(m_ViewPolar); } /*======================================================================== 機能 マウスがクリックされた位置を覚えておく 引数 point : クリックされた位置 ========================================================================*/ public void SetClickPoint(Point point) { SetViewPolar(); m_ClickPoint.X = point.X; m_ClickPoint.Y = point.Y; } /*======================================================================== 機能 視点を回転させる 引数 point : 現在のマウスの位置 ========================================================================*/ public void TurnViewPoint(Point point) { double p, q; p = m_ClickPoint.X - point.X; q = m_ClickPoint.Y - point.Y; m_pThreeD.TurnPolar(ref m_ViewPolar, m_OldViewPolar, p / 200, q / 200); m_pThreeD.PolarToVertex(m_ViewPolar, ref m_ViewVertex); TransferScreen(); } public void MoveCubes(Point point) { double p, q; p = m_ClickPoint.X - point.X; q = m_ClickPoint.Y - point.Y; m_pBond[0].m_Center.x = -(int)p; m_pBond[0].m_Center.y = -(int)q; TransferScreen(); } /*======================================================================== 機能 現在の視点を記憶する ========================================================================*/ public void SetViewPolar() { m_OldViewPolar.r = m_ViewPolar.r; m_OldViewPolar.p = m_ViewPolar.p; m_OldViewPolar.q = m_ViewPolar.q; } } } }
private CBond[] m_pBond = new CBond[3];
CBondの座標情報郡を入れている。
今回0番目しか使用していないが、増やすことで
座標情報を一つの塊とみなす事が出来る。
public void DrawRubic(Graphics gra, Pen pen, int scale)
{
int i, j, k;
i = 0; j = 0; k = 0;
m_scale = scale;
m_ViewPolar.r = m_scale;
m_pBond[0].DrawBond(gra, pen, m_ViewVertex);
}
Form1クラスのGraphics,PenをBondクラスに渡して描画。
詳細 C#3D立方体ワイヤーフレーム (第2回) for VS2013 Express
public void SetClickPoint(Point point)
{
SetViewPolar();
m_ClickPoint.X = point.X;
m_ClickPoint.Y = point.Y;
}
マウスがクリックされたときのX,Y座標を取得。
public void TurnViewPoint(Point point)
{
double p, q;
p = m_ClickPoint.X - point.X;
q = m_ClickPoint.Y - point.Y;
m_pThreeD.TurnPolar(ref m_ViewPolar, m_OldViewPolar, p / 200, q / 200);
m_pThreeD.PolarToVertex(m_ViewPolar, ref m_ViewVertex);
TransferScreen();
}
public void MoveCubes(Point point)
{
double p, q;
p = m_ClickPoint.X - point.X;
q = m_ClickPoint.Y - point.Y;
m_pBond[0].m_Center.x = -(int)p;
m_pBond[0].m_Center.y = -(int)q;
TransferScreen();
}
マウスが動いたときに呼び出される。
(TurnViewPoint)は左クリックしたまま動いた時。→回転
(MoveCubes)は左クリックしたまま動いた時。→相対座標を移動。
p = m_ClickPoint.X - point.X;
q = m_ClickPoint.Y - point.Y;
マウスの移動情報は、縦と横しかないのでこの2つの変化量をX,Yとしている。
このX、Yの変化量をTurnViewPoint()関数では、第1回で紹介したように
p=X軸固定した際の変化角度
q=Y軸固定した際の変化角度
として、TurnPolar()関数で、角度の変化量を与えて、PolarToVertex()で
極座標を直行座標に変換した座標をm_ViewVertexで参照渡しで取得。
DrawRubic()関数が呼ばれた際に、座標のm_ViewVertexを
m_pBond[0].DrawBond(gra, pen, m_ViewVertex);に与えて
2次元に描画している。
次回は第4回目、マウスのイベントを拾ってこのクラスに渡す処理。
終わり。
作って覚えるVisual C# 2015 デスクトップアプリ入門
- 作者: 荻原裕之,宮崎昭世
- 出版社/メーカー: 秀和システム
- 発売日: 2016/01/29
- メディア: 単行本
- この商品を含むブログ (1件) を見る
猫でもわかるC#プログラミング 第3版 (猫でもわかるプログラミング)
- 作者: 粂井康孝
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/27
- メディア: 単行本
- この商品を含むブログ (2件) を見る