Mugichoko's blog

Mugichoko’s blog

プログラミングを中心としたメモ書き.

ドロネー三角形分割:三角形に所属する各点のIDを取得

目標

前回ランダムに生成した2次元点を入力として,ドロネー三角形分割を行い,結果を描画した. 今回は,そこで用いたFade2Dを利用して,各三角形にどの2次元点が使われたかを特定する方法を実装する.

mugichoko.hatenablog.com

実装環境

プログラム

決め手は,「Point2::setCustomIndex()」によって各点にあらかじめIDを割り振っておき,ドロネー三角形分割の後に「Point2::getCustomIndex()」で,各三角形のIDを取得するということ.

#include <iostream>
using namespace std;
#include <random>
#include <Fade_2D.h>
namespace fade = GEOM_FADE2D;

// Constants
const int PTS_NUM(100);
const int PTS_RANGE(600);
const string WND_NAME("Delaunay Fade 2D");


int main()
{
    // ----- Generate 2D points
    // Mersenne twister (random value generator)
    mt19937 mt;
    uniform_int_distribution<int> distribution(0, ::PTS_RANGE - 1);
    
    vector<fade::Point2> pts;
    for (int i = 0; i < ::PTS_NUM; ++i)
    {
        int x = distribution(mt);
        int y = distribution(mt);
        fade::Point2 p(x, y);
        p.setCustomIndex(i);
        pts.push_back(p);
    }

    // ----- Initialize Fade 2D
    fade::Fade_2D dt((unsigned int)pts.size());
    vector<fade::Point2 *> vDtVertPtr;
    dt.insert(pts, vDtVertPtr);

    // ----- Draw Delaunay triangles
    cv::Mat img = cv::Mat::zeros(::PTS_RANGE, ::PTS_RANGE, CV_8UC3);

    vector<fade::Triangle2 *> vDtTri;
    dt.getTrianglePointers(vDtTri);
    for (auto tri = vDtTri.begin(); tri != vDtTri.end(); ++tri)
    {
        fade::Point2 *pt[3] = { (*tri)->getCorner(0), (*tri)->getCorner(1), (*tri)->getCorner(2) };
        cout << "Point ID: " << pt[0]->getCustomIndex() << ", " << pt[1]->getCustomIndex() << ", " << pt[2]->getCustomIndex() << ", " << endl;
    }

    return 0;
}

実行結果

コマンドプロンプトに各三角形に含まれる点のIDが表示された.

f:id:Mugichoko:20170606120102j:plain