Files
envi-code/SourceCode/Code2026/tg_shs/inc/subgeo/TPGeCurve2D.h
T
2026-09-28 15:28:50 +08:00

155 lines
3.9 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TPGeCurve2D.h
// = Version : ver2.0
// = Author : xlc
// = CreateDate : 2002-09-09
// = Description: 类的声明 ,平面有向连续参数曲线
// 参数延曲线方向增长,如果有起点,起点参数0,如果有终点,终点参数为1
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#ifndef _TPGECURVE2D_H_
#define _TPGECURVE2D_H_
#ifndef _TGOBJECT2D_H_
#include "TGObject2D.h"
#endif
#ifndef _TGPOINT_H_
#include "TGPoint.h"
#endif
#ifndef _TTABLE_H_
#include "TTable.h"
#endif
#ifndef _TWFLAG_H_
#include "TWFlag.h"
#endif
#ifndef _TGOBJECT_H_
#include "TGObject.h"
#endif
#ifndef _TPGELINE2D_H_
#include "TPGeLine2D.h"
#endif
#ifndef _TGOBJECTLIST_H_
#include "TGObjectList.h"
#endif
class TGMLine2D;
class TGObject3D;
class GEOAPI TPGeCurve2D : public TGObject2D
{
DECLARE_RUN_TIME_CLASS(TPGeCurve2D)
public:
virtual ~TPGeCurve2D();
virtual void GetStartPoint(TGPoint& pt) const;
virtual void GetEndPoint(TGPoint& pt) const;
//是否封闭曲线,封闭曲线一定是有限曲线
virtual bool IsClosed() const;
//非曲线段必须重载!
//是否有起点或终点
virtual bool IsFinite(bool bStart) const;
//存在重复子集
virtual bool IsSelfCross() const;
//用于封闭不自交曲线!
virtual bool IsClockwise() const;
//由曲线参数得到点
virtual void Pa2Pt(double pa,TGPoint& pt) const;
//由点得到曲线参数,适用于非自交时!
virtual void Pt2Pa(const TGPoint& pt,double& pa) const;
//取正切线,返回单位向量
virtual void GetTangent(double pa,TPGeLine2D& line) const;
//对[pa0,pa1]进行面积积分
virtual double Integration(double pa0,double pa1) const;
//用于封闭不自交曲线!
virtual double Area() const;
//用于有限曲线
//此处实现了求复合曲线的长度,基本曲线类要重载
virtual double Length() const;
//反向
virtual void Reverse();
//用于有限曲线,如果paDist<=0,则使用该实体默认精度
//此处实现了曲线段的线性化,有限曲线但不是曲线段时,或为了提高效率子类可能需要重载
virtual TGMLine2D* MLinearize(double paDist = 0) const;
//,尽量转化为TGPLine2D,其余同上
virtual TGMLine2D* PLinearize(double paDist = 0) const;
//取线型化的默认精度
virtual double GetMLinePrec() const;
//取延伸曲线,外部析构
virtual TPGeCurve2D* GetExtendCurve() const;
//取子曲线段,外部析构
//取同曲线方向的子曲线,pa0,pa1必须有效,不封闭时必须pa1>pa0,封闭时pa0==pa1表示一点切割
virtual TPGeCurve2D* GetSubCurve(double pa0,double pa1) const;
//按参数表分解曲线,paTable为有序表,参数表中参数必须有效!允许冗余参数
//此处实现了曲线段的Split,无性能要求曲线段子类可不重载
virtual void Split(const TTable<double> & paTable,TGObjectList& res) const;
//取样测试点,不取端点、节点之类的不光滑点!
virtual TGPoint GetSamplePoint() const;
//不能是自交曲线!!不能切割三维实体!
//封闭曲线切割结果为左为内,右为外,不考虑曲线方向!
//不封闭的有限曲线段切割时,要求其可以正确进行结果分发时的左右测试!!
//切割曲线时交点处全要打断,子类如重载,也应满足此要求!
//不完全适用于切割自交曲线,即切割在自交处一般会出错!!
//子类需要加速才需要重载
virtual void Cut(const TGObject& obj,TGObjectList& left,TGObjectList& right,TGObjectList& mid) const;
//左偏移为负,右偏移为正,失败返回false且不改变数据
virtual bool Offset(double offset);
//默认是转化为TGPCurve3D
virtual TGObject3D* Convert3D() const;
//此处实现了任意曲线的点测试(封闭时测试GR_OUTSIDE/GR_INSIDE),曲线封闭时不能自交!!
//子类无特别速度要求时不需重载
virtual GRelation HitTest(const TGPoint& pt) const;
//在TGObject2D基础上过滤了TGRegion2D
virtual bool IsInclude(const TGObject& obj) const;
void GetMidPoint(TGPoint&pt)const;
//两段曲线是否可以连接,终点与seg的起点相同
bool IsConnect(const TPGeCurve2D&seg)const;
//是否有两端点
bool IsCurveSeg()const;
//ok有限曲线(封闭或是曲线段)
bool IsFinite()const;
//完全无限曲线
bool IsInfinite()const;
//有限曲线的面积积分
double AllIntegration()const;
};
#endif