スポンサードリンク
今回はサンプルプログラムの解説になります。
平行四辺形の3点が分かっている状態で、4点目を計算する関数をC++で作ってみました。画面はVB.NETのサンプルを作ってみましたので是非ご参考までに。
やりたいこと
インプットデータ
- 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表計算などで、法則を定めてからのコーディングしていくのをオススメします。
それにして、平行四辺形のベクトル計算なんて、数学の授業でやったらしいのですが・・・、そんな記憶がまったくありませんね^^;
最後まで見てくれてありがとう。
スポンサードリンク