tcston2.h

来自「并行TIN生成算法, 基于DeWall算法理论实现」· C头文件 代码 · 共 124 行

H
124
字号
/* -*- C++ -*- */

//=============================================================================
/**
 *  @文件    TcsTon2.h
 *
 *  TcsTon2.h, 版本 0.10 2008/11/17
 *
 *  @作者 邓雪清 <xueqingdeng@sohu.com>
 *  2维TIN构建公共函数
 */
//=============================================================================

#ifndef _TCS_TON2_H_
#define _TCS_TON2_H_

#include "..\Tcs_Gen\TcsHL.h"
#include "..\Tcs_Gen\TcsBL.h"
#include "..\Tcs_Gen\TcsSL.h"
#include "..\Tcs_Inc\TcsBase.h"

// 网格索引结构
typedef struct tagTIN_C {
	TCS_S32	 num;	// 数组容量
	TCS_S32	*pid;	// 点号数组
	TCS_S32	 sum;	// 有效点数
	TCS_S32	 ocn;	// 剩余点数
} TIN_C;

// 统一网格结构
typedef struct tagTIN_G {
	TCS_F64	 dup;		// 坐标精度
	TCS_F64	 bnd[4];	// 坐标边界
	TCS_F64	 spn[2];	// 网格间距
	TCS_S32	 num[2];	// 矩阵大小
	TCS_S32	 vpn;		// 进度计数
	TCS_S32	*pid;		// 回转计数
	TIN_C	*idx;		// 单元数组
} TIN_G;

// 三角形边结构
typedef struct tagTIN_S {
	TCS_S32	 sid[2];	// 起点([0]:pid, [1]:cid)
	TCS_S32	 eid[2];	// 末点([0]:pid, [1]:cid)
	TCS_S32	 pid[2];	// 对面点
} TIN_S;

// 三角形结构
typedef struct tagTIN_T {
	TCS_S32	 pid[3];
} TIN_T;

// 隔离区结构
typedef struct tagTIN_R {
	TCS_S32	 SCO[2];	// 左下单元位
	TCS_F64	 AXV;		// 分隔线轴值
	TCS_S32	 AXI;		// 下次分隔轴(0:X, 1:Y)
	CTcsBL	*ATL;		// 三角形链表
	CTcsHL	*ASL;		// 活动边链表
	CTcsHL	*BSL;		// 静止边链表
	TIN_G	*G;			// 局部化索引
	TIN_S	*S;			// 下次扩展边
} TIN_R;

// 点标结构
typedef struct tagTIN_X {
	TCS_S32	pid;
	TCS_S32	cid;
} TIN_X;

// 哈希函数
TCS_S32 SIDE_EQLH(void *s1, void *s2);
TCS_U32 SIDE_HASH(void *s1);

// 计算坐标边界
extern TCS_V00 ComBnd2(TIN_G *G, TCS_F64 *P, TCS_S32 N);
// 计算网格单元
extern TCS_S32 ComIdx2(TIN_G *G, TCS_F64 *p);
extern TCS_V00 ComIdx2(TIN_G *G, TCS_F64 *p, TCS_S32 *o);
// 单元移去点号
// 基于位置
extern TCS_V00 RmxPid(TIN_C *C, TCS_S32 pos);
// 基于点号
extern TCS_V00 RmvPid(TIN_C *C, TCS_S32 pid);
// 建立网格索引
extern TCS_V00 CnsIdx2(TIN_G *G, TCS_F64 *P, TCS_S32 N, TCS_S32 av);

// 欧拉距离平方
extern TCS_F64 EuLen2D(TCS_F64 *p1, TCS_F64 *p2);
// 判断是否共线
extern TCS_S32 IsLine2(TCS_F64 *p1, TCS_F64 *p2, TCS_F64 *p3);
// 计算同侧符号
extern TCS_S32 IsSide2(TCS_F64 *p1, TCS_F64 *p2, TCS_F64 *p3);
// 计算外接圆心
extern TCS_V00 ComCen2(TCS_F64 *p1, TCS_F64 *p2, TCS_F64 *p3, TCS_F64 *ce);

// 共圆点弧位排序
extern TCS_V00 ArcPos2(CTcsBL *L, TCS_F64 *P, TCS_F64 *ce, TCS_F64 d2);
// 构造三角形:最大最小角原则
extern TCS_V00 ConTen2(TIN_G *G, TCS_F64 *P, TCS_S32 sid[2], TCS_S32 eid[2], CTcsBL *APL, CTcsBL *ATL, CTcsHL *ASL, CTcsHL *BSL, CTcsSL *SSL);
extern TCS_V00 ConTen2(TIN_G *G, TCS_F64 *P, TCS_S32 sid[2], TCS_S32 eid[2], CTcsBL *APL, CTcsBL *ATL, CTcsHL *ASL, CTcsHL *BSL);
extern TCS_V00 IniSide(TIN_S *S, TCS_S32 sip, TCS_S32 eip, TCS_S32 sic, TCS_S32 eic, TCS_S32 pid);
// 计算搜索边界
extern TCS_V00 ComBnd2(TIN_G *G, TCS_F64 *p, TCS_F64 d, TCS_S32 &c1, TCS_S32 &c2, TCS_S32 &r1, TCS_S32 &r2);
// 构造三角形墙:用于围绕X分隔线
extern TCS_V00 ConTxn2(TIN_G *G, TIN_S *S, TCS_F64 *P, TCS_F64 X, CTcsBL *ATL, CTcsHL *ASL, CTcsHL *BSL);
// 构造三角形墙:用于围绕Y分隔线
extern TCS_V00 ConTyn2(TIN_G *G, TIN_S *S, TCS_F64 *P, TCS_F64 Y, CTcsBL *ATL, CTcsHL *ASL, CTcsHL *BSL);
// 判断边与X分隔线相交
extern TCS_S32 LxSide2(TCS_F64 X, TCS_F64 *P, TIN_S *S);
// 判断边与Y分隔线相交
extern TCS_S32 LySide2(TCS_F64 Y, TCS_F64 *P, TIN_S *S);
// 构造隔离区:用于左右隔离
extern TCS_V00 ConRxn2(TIN_G *G, TIN_R *L, TIN_R *R, CTcsHL *H, TCS_F64 *P, TCS_F64 X, TCS_F64 Y);
// 构造隔离区:用于上下隔离
extern TCS_V00 ConRyn2(TIN_G *G, TIN_R *U, TIN_R *D, CTcsHL *H, TCS_F64 *P, TCS_F64 X, TCS_F64 Y);
// 单元编号逆变换
extern TCS_S32 InvCid2(TCS_S32 cid, TCS_S32 co1, TCS_S32 co2, TCS_S32 sc, TCS_S32 sr);
// 搜索第3点:空圆法则
extern TCS_V00 FndEmp2(TIN_G *G, TIN_S *S, TCS_F64 *P, TCS_F64 *ce, TCS_F64 &d2, CTcsBL *L);
// 隔离区构造三角形
DLLEXPORT TCS_V00 ConTen2(TIN_R *R, TCS_F64 *P, TCS_S32 *TE);

#endif // _TCS_TON2_H_

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?