barus's diary

とても真面目なblogですにゃ

C#3D立方体ワイヤーフレーム (第3回) for VS2013 Express

f:id:hatakeka:20160912174949g:plain

 

第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 デスクトップアプリ入門

作って覚えるVisual C# 2015 デスクトップアプリ入門

 
猫でもわかるC#プログラミング 第3版 (猫でもわかるプログラミング)

猫でもわかるC#プログラミング 第3版 (猫でもわかるプログラミング)

 
C#実践開発手法 (マイクロソフト公式解説書)

C#実践開発手法 (マイクロソフト公式解説書)