山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他点が2D三角形に含まれるか含まれないかの判定プログラム(32/64bit)
概要
本プログラムは、点が2D三角形に含まれるか含まれないかの判定するプログラムです。コマンドライン上で動作します。
詳しい計算方法は、点が2D三角形に含まれるか含まれないかの判定を参照してください。
ソースコード・プログラムのダウンロード griangle_hit.zip
ソースコードの説明
入力座標
三角形座標は、配列tpで定義しています。
調べたい点は、構造体oで定義しています。
VEC2クラス
ベクトルを扱うクラスです。
set
ベクトルのx,yを設定します。
corss
ベクトルの外積を計算します。
TRIANGLEクラス
三角形を扱います。
set
三角形の頂点座標を定義します。
hit
引数で指定される点が三角形に含まれるか調べます。含まれる場合trueを返します。
コンパイル方法
Win32コンソールアプリケーションで空のプロジェクトをつくり、riangle_hit.cppをプロジェクトに追加します。
ソースコード(spline1.cpp)
// 点が2D三角形に含まれるか含まれないかの判定
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <tchar.h>
struct POINT2{ // 二次元座標
double x,y;
};
// 三角形の頂点座標を定義
POINT2 tp[]={
{ 1604.4, 1641.83 },
{ 2548.96, 2105.31 },
{ 3092.93, 1325.82 }};
// 調べたい点の座標
POINT2 o={ 2384.52, 1708.61 };
// ベクトルクラス
class VEC2{
double x,y;
public:
void set(double a,double b){
x=a;
y=b;
}
double cross(VEC2& b){ // 外積の計算
double r;
r= x * b.y - y * b.x;
return r;
}
};
// 三角形クラス
struct TRIANGLE{ // 三角形
POINT2* p; // 三角形の座標
void set(POINT2* ap){ // 座標の設定
p=ap;
}
void put(void){
_tprintf(_TEXT("%g,%g,%g,%g,%g,%g\n"),p[0].x, p[0].y ,p[1].x, p[1].y,p[2].x, p[2].y);
}
bool hit(POINT2& o){ // 三角形内に座標oが含むか調べる
VEC2 vec[6];
double f[3];
vec[1].set( p[0].x - p[2].x , p[0].y - p[2].y );
vec[3].set( o.x - p[2].x , o.y - p[2].y );
f[0]=vec[1].cross(vec[3]);
vec[2].set( p[1].x - p[0].x , p[1].y - p[0].y );
vec[4].set( o.x - p[1].x , o.y - p[1].y );
f[1]=vec[2].cross(vec[4]);
vec[0].set( p[2].x - p[1].x , p[2].y - p[1].y );
vec[5].set( o.x - p[1].x , o.y - p[1].y );
f[2]=vec[0].cross(vec[5]);
if(f[0]<0 && f[1]<0 && f[2]<0)
return true;
if(f[0]>0 && f[1]>0 && f[2]>0)
return true;
return false;
}
};
void main(void){
TRIANGLE t;
t.set(tp);
if(t.hit(o)){
_tprintf(_TEXT("hit !!\n")); // 三角形に点が含まれる
}else{
_tprintf(_TEXT("non hit !!\n")); // 三角形に点が含まれない
}
}
Copyright (C) 2012 山本ワールド All Rights Reserved.