155 lines
3.9 KiB
C++
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 |