プログラム

C++で数学ⅡBベクトル平行四辺形のサンプルコード

今回はサンプルプログラムの解説になります。
平行四辺形の3点が分かっている状態で、4点目を計算する関数をC++で作ってみました。画面はVB.NETのサンプルを作ってみましたので是非ご参考までに。

やりたいこと

AとBとDの点の座標から、Cの点の座標を返すようにします。

インプットデータ

  • A、B、DのXY座標(Xは横軸。Yは縦軸のドット数)

アウトプット

  • CのXY座標

ファイル構成

  • C++で関数を作成します。
  • VB.NETで画面を作成します。

DLLの作成方法などは以下ご参考ください。

C++(DLLファイル)作成

ここでは、DLL名はMath2Vector.dllとしてます。

dllmain.cpp

#include "Math2Vector.h"

MATH2VECTOR_API POINT vectorC(POINT ptA, POINT ptB, POINT ptD)
{
    int wkX;
    int wkY;
    POINT ptC;

    wkX = ptD.x - ptA.x;
    wkY = ptD.y - ptA.y;

    ptC.x = wkX - (-ptB.x);
    ptC.y = wkY - (-ptB.y);

    return ptC;
}

Math2Vector.h

ヘッダーファイル(インクルードファイル)を新規に作成して、関数を定義してます。

#pragma once
#ifndef __MATH2VECTOR_H
#define __MATH2VECTOR_H
extern "C" {
#ifdef MATH2VECTOR_EXPORTS
#define MATH2VECTOR_API __declspec(dllexport)
#else
#define MATH2VECTOR_API __declspec(dllimport)
#endif

	MATH2VECTOR_API POINT WINAPI vectorC(POINT ptA, POINT ptB, POINT ptD);
}
#endif

画面(VB.NET)作成

Formデザイン

  • 白い部分はPictureBox。大きさは640×480としてます。
  • XY座標を入力するTextBox。Cだけは入力不可
  • ボタンを押したら処理する流れ

Form1.vb

コード内容は以下のとおりです。

Public Class Form1
    <System.Runtime.InteropServices.DllImport("Math2Vector.dll")>
    Public Shared Function vectorC(ptA As Point, ptB As Point, ptD As Point) As Point
    End Function

    Private Sub BtnGetC_Click(sender As Object, e As EventArgs) Handles BtnGetC.Click
        Dim ptA As Point
        Dim ptB As Point
        Dim ptC As Point
        Dim ptD As Point

        'エラーチェック
        If IsNumeric(TxtAX.Text) And IsNumeric(TxtAY.Text) _
           And IsNumeric(TxtBX.Text) And IsNumeric(TxtBY.Text) _
           And IsNumeric(TxtDX.Text) And IsNumeric(TxtDY.Text) Then

            '上限チェック
            If TxtAX.Text > 480 Or TxtAX.Text < 0 Or TxtAY.Text > 640 Or TxtAY.Text < 0 Or
               TxtBX.Text > 480 Or TxtBX.Text < 0 Or TxtBY.Text > 640 Or TxtBY.Text < 0 Or
               TxtDX.Text > 480 Or TxtDX.Text < 0 Or TxtDX.Text > 640 Or TxtDX.Text < 0 Then

                MsgBox("上限オーバーです", MsgBoxStyle.Exclamation)
            Else

                ptA.X = TxtAX.Text
                ptA.Y = TxtAY.Text

                ptB.X = TxtBX.Text
                ptB.Y = TxtBY.Text

                ptD.X = TxtDX.Text
                ptD.Y = TxtDY.Text

                'ベクトル計算
                ptC = vectorC(ptA, ptB, ptD)
                '戻り値設定
                TxtCX.Text = ptC.X
                TxtCY.Text = ptC.Y

                '線と文字の描画メモリ割り当て
                Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
                Dim g As Graphics = Graphics.FromImage(canvas)
                Dim fnt As New Font("MS UI Gothic", 10)
                '文字列描画
                g.DrawString("A", fnt, Brushes.Black, ptA.X, ptA.Y)
                g.DrawString("B", fnt, Brushes.Black, ptB.X, ptB.Y)
                g.DrawString("C", fnt, Brushes.Red, ptC.X, ptC.Y)
                g.DrawString("D", fnt, Brushes.Black, ptD.X, ptD.Y)
                '線を描画
                g.DrawLine(Pens.Black, ptA.X, ptA.Y, ptB.X, ptB.Y)
                g.DrawLine(Pens.Red, ptB.X, ptB.Y, ptC.X, ptC.Y)
                g.DrawLine(Pens.Red, ptC.X, ptC.Y, ptD.X, ptD.Y)
                g.DrawLine(Pens.Black, ptD.X, ptD.Y, ptA.X, ptA.Y)
                'メモリ解放
                fnt.Dispose()
                g.Dispose()

                'PictureBox1に表示する
                PictureBox1.Image = canvas
            End If
        Else
            MsgBox("数値を入力してください", MsgBoxStyle.Exclamation)
        End If
    End Sub
End Class

実行結果

ボタンを押したら、Cの座標を取得して、PictureBoxに結果を表示します。

ついでにCの座標の結果をTextBoxに表示してます。

ABCDの並びの矛盾があると、ただの棒になったりしますので、汎用的にしたい場合など、独自にいろいろとカスタマイズしてみてお試しください。

計算式関連の関数を作る場合は、いきなりVisualStudioでコーディングするのではなく、手書きやExcel表計算などで、法則を定めてからのコーディングしていくのをオススメします。

それにして、平行四辺形のベクトル計算なんて、数学の授業でやったらしいのですが・・・、そんな記憶がまったくありませんね^^;

最後まで見てくれてありがとう。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA