概要

本プログラムは、点が2D三角形に含まれるか含まれないかの判定するプログラムです。本プログラムは、係数a,b,c,dを算出します。コマンドライン上で動作します。
詳しい計算方法は、点が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"));	//	三角形に点が含まれない
	}
}