?? tincore1.h
字號(hào):
/* -*- C++ -*- */
//=============================================================================
/**
* @文件 TinCore.h
*
* TinCore.h, 版本 0.10 2007/09/27
*
* @作者 鄧雪清 <xueqingdeng@sohu.com>
* 基于Incremental Construction算法的單線程實(shí)現(xiàn)
*/
//=============================================================================
#ifndef _TIN_CORE_H_
#define _TIN_CORE_H_
#include <windows.h>
#include "..\Tss_Inc\Point2D.h"
#include "..\Tss_Inc\Point3D.h"
#include "..\Tss_Inc\TssTset.h"
#include "..\Tss_API\TssHash.h"
#include "..\Tss_API\TssList.h"
typedef struct _timeb TSS_TIMEB;
// 網(wǎng)格索引結(jié)構(gòu)
typedef struct tagIDX_CELL {
TSS_SNT32 num; // 容量
TSS_SNT32 cnt; // 計(jì)數(shù)
TSS_SNT32 *pid; // 數(shù)組
TSS_SNT32 sum; // 總數(shù)
} IDX_CELL;
// 統(tǒng)一網(wǎng)格結(jié)構(gòu)
typedef struct tagIDX_GRID {
TSS_FLT64 bnd[4]; // 坐標(biāo)邊界
TSS_FLT64 spn[2]; // 網(wǎng)格間距
TSS_SNT32 num[2]; // 矩陣大小
TSS_FLT32 dup; // 坐標(biāo)精度
IDX_CELL *idx; // 單元數(shù)組
} IDX_GRID;
// 邊(面)結(jié)構(gòu)
typedef struct tagTIN_FACE {
TSS_SNT32 sid[2]; // 起點(diǎn)(0:pid, 1:cid)
TSS_SNT32 eid[2]; // 末點(diǎn)(0:pid, 1:cid)
TSS_SNT32 pid; // 對(duì)面點(diǎn)
TSS_SNT32 tid; // 鄰接三角形
} TIN_FACE;
// 三角形結(jié)構(gòu)
typedef struct tagTIN_TGON {
TSS_SNT32 pid[3];
TSS_SNT32 tid[3];
} TIN_TGON;
long GridToTin2D(POINT2D *ppts, TSS_SNT32 *pnum, TSS_SNT32 *stop,
TSS_SNT32 *vnum, TSS_SNT32 **vidx, TSS_TIMEB *betm, TSS_TIMEB *entm);
long DelaunayTriangulation2D(POINT3D *ppts, TSS_SNT32 *pnum, TSS_FLT32 ddup, TSS_SNT32 *stop,
TSS_SNT32 *tnum, TSS_SNT32 **tset, TSS_TIMEB *betm, TSS_TIMEB *entm);
// 哈希函數(shù)
TSS_SNT32 FACE_EQLH(void const *f1, void const *f2);
TSS_UNT32 FACE_HASH(void const *f1);
// 計(jì)算網(wǎng)格矩陣大小
void CalcGridSize(IDX_GRID *uidx, TSS_SNT32 num, TSS_SNT32 avg);
// 計(jì)算點(diǎn)所處單元-數(shù)組偏移
long CalcGridCell(IDX_GRID *uidx, TSS_FLT64 *pnt);
// 計(jì)算點(diǎn)所處單元-坐標(biāo)位置
void CalcGridCell(IDX_GRID *uidx, TSS_FLT64 *pnt, TSS_SNT32 *pos);
// 增加點(diǎn)到單元
void AddPid(IDX_CELL *cell, TSS_SNT32 pid);
// 從單元?jiǎng)h除點(diǎn)
void DelPid(IDX_CELL *cell, TSS_SNT32 pos);
void DelPidEx(IDX_CELL *cell, TSS_SNT32 pid);
// 判斷單元中是否有重合點(diǎn)
long IsHaveDup(IDX_CELL *cell, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_FLT32 dup,
TSS_FLT64 *pt, TSS_SNT32 s);
// 消除重合點(diǎn)
void RemoveDupA(IDX_GRID *uidx, TSS_SNT32 *pnum, TSS_SNT32 ddim, TSS_FLT64 *ppts,
TSS_SNT32 *ppid, TSS_SNT32 *stop);
// 按列處理重合點(diǎn)
void RemoveDupC(IDX_GRID *uidx, TSS_SNT32 *pnum, TSS_SNT32 ddim, TSS_FLT64 *ppts,
TSS_SNT32 *ppid, TSS_SNT32 c, TSS_SNT32 r1, TSS_SNT32 r2);
// 按行處理重合點(diǎn)
void RemoveDupR(IDX_GRID *uidx, TSS_SNT32 *pnum, TSS_SNT32 ddim, TSS_FLT64 *ppts,
TSS_SNT32 *ppid, TSS_SNT32 r, TSS_SNT32 c1, TSS_SNT32 c2);
// 處理邊界重合點(diǎn)
void RemoveDupS(IDX_GRID *uidx, TSS_SNT32 *pnum, TSS_SNT32 ddim, TSS_FLT64 *ppts,
TSS_SNT32 *ppid);
// 按矩陣處理重合點(diǎn)
void RemoveDupM(IDX_GRID *uidx, TSS_SNT32 *pnum, TSS_SNT32 ddim, TSS_FLT64 *ppts,
TSS_SNT32 *ppid, TSS_SNT32 *stop, TSS_SNT32 c1, TSS_SNT32 c2,
TSS_SNT32 r1, TSS_SNT32 r2);
// 設(shè)置邊參數(shù)
void SetFace(TIN_FACE *face, TSS_SNT32 sid, TSS_SNT32 eid, TSS_SNT32 pid,
TSS_SNT32 tid, TSS_SNT32 sic, TSS_SNT32 eic);
// 釋放CELL索引
void FreeCell(IDX_CELL *cidx, TSS_SNT32 num);
// 構(gòu)建初始三角形
long MakeFirstSimplex(IDX_GRID *uidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_SNT32 *stop,
TSS_FLT64 dm2, TSS_SNT32 *pid, TSS_SNT32 *cid);
// 構(gòu)建三角形網(wǎng)絡(luò)
long MakeSimplex(IDX_GRID *uidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_SNT32 *ppid,
TSS_SNT32 *pnum, TSS_SNT32 *tnum, TSS_SNT32 *stop, TSS_SNT32 *pid,
TSS_SNT32 *cid, CTssList *ATL);
// 單元搜索最近點(diǎn)
// 同單元搜索
void SearchCellNPS(IDX_CELL *cell, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_FLT64 *pnt,
TSS_SNT32 cin, TSS_SNT32 &pid, TSS_SNT32 &cid, TSS_FLT64 &dnp);
// 異單元搜索
void SearchCellNPD(IDX_CELL *cell, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_FLT64 *pnt,
TSS_SNT32 cin, TSS_SNT32 &pid, TSS_SNT32 &cid, TSS_FLT64 &dnp);
// 批量異單元搜索
void SearchCellNPD(IDX_CELL *cidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_FLT64 *pnt,
TSS_SNT32 &pid, TSS_SNT32 &cid, TSS_FLT64 &dnp, TSS_SNT32 col,
TSS_SNT32 *c, TSS_SNT32 *r);
// 計(jì)算搜索邊界
void CalcSearchBound(TSS_FLT64 *bnd, TSS_FLT64 *spn, TSS_SNT32 col, TSS_SNT32 row,
TSS_FLT64 *pnt, TSS_FLT64 rad, TSS_SNT32 &c1, TSS_SNT32 &c2,
TSS_SNT32 &r1, TSS_SNT32 &r2);
// 搜索第3點(diǎn):空?qǐng)A法則
long SearchCellEMR(IDX_GRID *uidx, IDX_CELL *cell, TSS_FLT64 *ppts, TSS_SNT32 ddim,
TSS_FLT64 *pt1, TSS_FLT64 *pt2, TSS_SNT32 cin, TSS_SNT32 &pid,
TSS_SNT32 &cid, TSS_FLT64 *cen);
// 檢查圓內(nèi)是否存在點(diǎn)
void SearchCellEMR(IDX_GRID *uidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_FLT64 *pt1,
TSS_FLT64 *pt2, TSS_FLT64 *pt3, TSS_FLT64 rad, TSS_SNT32 &pid,
TSS_SNT32 &cid, TSS_FLT64 *cen);
// 批量異單元搜索
long SearchCellEMR(IDX_GRID *uidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_FLT64 *pt1,
TSS_FLT64 *pt2, TSS_SNT32 &pid, TSS_SNT32 &cid, TSS_FLT64 *cen,
TSS_SNT32 col, TSS_SNT32 *c, TSS_SNT32 *r);
// 插入邊
long PutHash(CTssHash *AFH, CTssHash *BFH, IDX_CELL *cidx, TSS_SNT32 *ppid, TIN_FACE *face);
// 搜索第3點(diǎn):空?qǐng)A法則
long SearchCell(CTssHash *BFH, IDX_GRID *uidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_SNT32 *stop,
TSS_FLT64 *pt1, TSS_FLT64 *pt2, TSS_FLT64 *opt, TSS_SNT32 *pid,
TSS_SNT32 &cid);
// 方向約束搜索
long SearchCellEMR(CTssHash *BFH, IDX_GRID *uidx, IDX_CELL *cell, TSS_FLT64 *ppts, TSS_SNT32 ddim,
TSS_FLT64 *pt1, TSS_FLT64 *pt2, TSS_FLT64 *opt, TSS_SNT32 orn,
TSS_SNT32 cin, TSS_SNT32 *pid, TSS_SNT32 &cid, TSS_FLT64 *cen);
long SearchCellDON(CTssHash *BFH, IDX_GRID *uidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_SNT32 *pid,
TSS_FLT64 *cen, TSS_FLT64 rad);
// 批量單元方向約束搜索
long SearchCellEMR(CTssHash *BFH, IDX_GRID *uidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_FLT64 *pt1,
TSS_FLT64 *pt2, TSS_FLT64 *opt, TSS_SNT32 orn, TSS_SNT32 *pid,
TSS_SNT32 &cid, TSS_FLT64 *cen, TSS_SNT32 col, TSS_SNT32 *c,
TSS_SNT32 *r);
// 方向約束搜索
void SearchCellEMR(IDX_GRID *uidx, TSS_FLT64 *ppts, TSS_SNT32 ddim, TSS_FLT64 *pt1,
TSS_FLT64 *pt2, TSS_FLT64 *pt3, TSS_SNT32 orn, TSS_FLT64 rad,
TSS_SNT32 *pid, TSS_SNT32 &cid, TSS_FLT64 *cen);
// 歐拉距離平方
double EuLen2D(TSS_FLT64 *pt1, TSS_FLT64 *pt2);
// 計(jì)算外接圓
void CalcCircum(TSS_FLT64 *pt1, TSS_FLT64 *pt2, TSS_FLT64 *pt3, TSS_FLT64 *cen);
// 判斷是否共線
long IsLine(TSS_FLT64 *pt1, TSS_FLT64 *pt2, TSS_FLT64 *pt3);
// 計(jì)算同側(cè)符號(hào)
long IsSide(TSS_FLT64 *pt1, TSS_FLT64 *pt2, TSS_FLT64 *pt3);
#endif // _TIN_CORE_H_
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -