点が2D三角形に含まれるか含まれないかの判定プログラム(32/64bit)

icon 項目のみ表示/展開表示の切り替え

概要

本プログラムは、点が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"));      //      三角形に点が含まれない
        }
}