You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

321 lines
8.6 KiB
C

1 month ago
#pragma once
#include "TriAdapter.h"
#include "PolygonCreatorBoundary.h"
class CScatteredTrace;
class CScatteredPoint;
class CScatteredEdge;
class CScatteredTriangle;
class CPolygonCreatorLine;
struct SCATTEREDDATAINDEX;
class FACIESPOINT;
void CalculateBorderPosition(int iPointIndex0,int iPointIndex1,double& dPosition);
void CalculateBorderPosition(int iPointIndex0,int iPointIndex1,double& dPosition,double& dIndex0,double& dIndex1);
class CContourPolygon
{
public:
CContourPolygon(CScatteredTrace* pScatteredData);
~CContourPolygon();
//Attributes
private:
CScatteredTrace* m_pScatteredData;
CString m_strName;
CTypedPtrArray<CPtrArray,CPolygonCreatorLine*> m_PolygonCreatorLineArray;
//Operations
public:
void SetScatteredData(CScatteredTrace* pScatteredData);
CScatteredTrace* GetScatteredData();
void SetName(LPCTSTR strName);
CString GetName();
virtual void Clear();
int GetPolygonCreatorLineCount();
CPolygonCreatorLine* GetPolygonCreatorLine(int index);
void AddPolygonCreatorLine(CPolygonCreatorLine* pPolygonCreatorLine);
void DeletePolygonCreatorLine(int index);
};
class CContourPolygonGroup//һ<><D2BB><EFBFBD>ߴ<EFBFBD>
{
public:
CContourPolygonGroup(CScatteredTrace* pScatteredData);
~CContourPolygonGroup();
//Attributes
private:
CScatteredTrace* m_pScatteredData;
CString m_strName;
double m_dValue;
CTypedPtrArray<CPtrArray,CContourPolygon*> m_PolygonArray;
GDFLOGPEN m_LogPen;
GDFLOGBRUSH m_LogBrush;
//Operations
public:
void SetScatteredData(CScatteredTrace* pScatteredData);
CScatteredTrace* GetScatteredData();
void SetName(LPCTSTR strName);
CString GetName();
void SetValue(double dValue);
double GetValue();
void Clear();
int GetPolygonCount();
CContourPolygon* GetPolygon(int index);
void AddPolygon(CContourPolygon* pPolygon);
void GetLogPen(GDFLOGPEN* pLogPen);
void SetLogPen(GDFLOGPEN* pLogPen);
void GetLogBrush(GDFLOGBRUSH* pLogBrush);
void SetLogBrush(GDFLOGBRUSH* pLogBrush);
};
class CFaciesRgnTracer;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>зָ<D0B7><D6B8><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ԫ,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
class CContourUnit
{
public:
CContourUnit();
~CContourUnit();
//Attributes
private:
CFaciesRgnTracer* m_pScatteredTracer;
int m_iNextCellIndex;
POLYGONCREATORSEGMENT m_SegmentArray[9]; // 0<><30>1<EFBFBD><31>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD>
BYTE m_byteFlag;
double m_dValue;//ֵ<><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Operations
public:
void SetScatteredTracer(CFaciesRgnTracer* pScatteredTracer);
CFaciesRgnTracer* GetScatteredTracer();
int GetNextCellIndex();
void SetNextCellIndex(int iCellIndex);
int SegmentHitTest(double dBorderPosition0,double dPosition0,double dBorderPosition1,double dPosition1);
int SegmentHitTest(double dBorderPosition,double dPosition0,double dPosition1);
POLYGONCREATORSEGMENT* GetSegmentArray();
void GetSegmentArray(POLYGONCREATORSEGMENT* pSegmentArray);
void SetSegmentArray(POLYGONCREATORSEGMENT* pSegmentArray);
BOOL CutOff(double dBorderPosition,double dPosition0,double dBorderPosition1,double dPosition1,CGDFObjectLine* pObject,double dPointIndex0,double dPointIndex1);
BOOL GetFlag();
void SetFlag();
void ClearFlag();
double GetValue();
void SetValue(double dValue);
void operator=(CContourUnit& cell);
CPolygonCreatorLine* GetPolygonCreatorLine();
private:
BOOL BuildBorderSegment(CScatteredEdge* pBorder,double dRelativeIndex0,double dRelativeIndex1,CPolygonCreatorSegment* pSegment);
};
struct SCATTEREDSEGMENT
{
int iTriangleIndex;
BYTE byteBorderIndex;
BYTE byteHeadStep;
BYTE byteEndStep;
int iHeadPointIndex;
int iEndPointIndex;
double dHeadDistance;
double dEndDistance;
};
class CONTOURSTEPVALUE
{
public:
CONTOURSTEPVALUE(){dValue=0.0;strValue[0]=0;LogPen.m_dWidth=0.0;byteEnhanceConnection=0;byteLabel=0;byteLineColorCal=1;byteFillColorCal=1;LogPen.m_dWidth=5.0f;};
double dValue;
TCHAR strValue[128];
GDFLOGPEN LogPen;
GDFLOGBRUSH LogBrush;
BYTE byteEnhanceConnection;
BYTE byteLineColorCal;
BYTE byteLabel;
BYTE byteFillColorCal;
void operator=(CONTOURSTEPVALUE& value);
};
#include "FaciesTypeManager.h"
/*<2A>Ա߽<D4B1><DFBD>Ĵ<EFBFBD><C4B4><EFBFBD>*/
/*<2A><><EFBFBD><EFBFBD>û<EFBFBD>б߽<D0B1>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>߽<EFBFBD>*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ñ߽<C3B1>,<2C><>Ҫͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD>ڱ߽缰<DFBD><E7BCB0><EFBFBD>߽<EFBFBD>,<2C>ڱ߽<DAB1><DFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>,ͬʱ<CDAC><CAB1><EFBFBD>߽<EFBFBD><DFBD>ϵĵ<CFB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD>ֵͬ<CDAC><D6B5><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ûֵ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>*/
/*<2A>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ڱ߽<DAB1><DFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD>µĵ<C2B5>,<2C><>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EBB5BD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD>*/
/*/<2F><>׷<EFBFBD>ٵ<EFBFBD>ֵ<EFBFBD>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰҪ<C7B0><D2AA><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD>еı߽<C4B1><DFBD><EFBFBD><EFBFBD><EFBFBD>ȱʧ<C8B1><CAA7>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>*/
class CFaciesRgnTracer
{
public:
CFaciesRgnTracer(CScatteredTrace* pScatteredData=NULL);
~CFaciesRgnTracer();
//Attributes
protected:
struct BUILDDISTANCEBORDER
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int iTriangleIndex;
BYTE byteBorderIndex;
double dDistance;
int iPointIndex;
BOOL bCanExtend;
};
CFaciesTypeMgr* m_pFaciesTypeManager;
BOOL m_bLabel;
GDFLOGFONT m_LabelFont;
double m_dLabelDistance;
CTypedPtrArray<CPtrArray,CArray<FACIESPOINT,FACIESPOINT>* > m_BorderArray;
CArray<int,int> m_BorderTypeArray;//0--<2D><><EFBFBD>߽<EFBFBD> 1--<2D>ڱ߽粻<DFBD>պϡ<D5BA>2--<2D>ڱ߽<DAB1><DFBD>պ<EFBFBD>
CScatteredTrace* m_pScatteredData;
CTypedPtrArray<CPtrArray,CContourPolygonGroup*> m_PolygonGroupArray;
CArray<int,int> m_FirstCellIndexArray;//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ֵ
CArray<CContourUnit,CContourUnit> m_CellArray;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ηָ<CEB7><D6B8><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ԫ
BYTE m_byteEnhanceConnection;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD><D7B7>ʱ<EFBFBD><CAB1>ǿ<EFBFBD><C7BF>ͨ<EFBFBD><CDA8> 0--<2D><><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>ͨ 1--<2D><><EFBFBD><EFBFBD>ͨ 2--<2D><><EFBFBD><EFBFBD>ͨ 3--ǿ<><C7BF>ͨ 255--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ
double m_dCurrentTraceValue;
int m_iStartTriangleIndex;//<2F><><EFBFBD><EFBFBD>׷<EFBFBD>ٱ߽<D9B1><DFBD><EFBFBD>
BYTE m_byteStartBorderIndex;//<2F><><EFBFBD><EFBFBD>׷<EFBFBD>ٱ߽<D9B1><DFBD><EFBFBD>
int m_iSearchStartStep;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>
double m_dStartValue;
double m_dStopValue;
double m_dStepInterval;
CArray<CONTOURSTEPVALUE,CONTOURSTEPVALUE> m_StepValueArray;
int m_iCurrentDataType;
CGDFLayer* m_pContourLineLayer;
CGDFLayer* m_pContourPolygonLayer;
CArray<CScatteredTriangle,CScatteredTriangle> m_TriangleArray;
BOOL m_bProcessBar;
//Operations
public:
void SetScatteredData(CScatteredTrace* pScatteredData);
CScatteredTrace* GetScatteredData();
virtual void Clear();
void SetContourLineLayer(CGDFLayer* pLayer);
void SetContourPolygonLayer(CGDFLayer* pLayer);
CContourPolygonGroup* GetPolygonGroup(int index);
int GetCurrentDataType();
void SetCurrentDataType(int iType);
void AddOutBorder(FACIESPOINT* pPointArray,int count,BOOL bClose);
void AddInnerBorder(FACIESPOINT* pPointArray,int count,BOOL bClose);
int GetTriangleCount();
CScatteredTriangle* GetTriangleArray();
void GetStepValueArray(CArray<CONTOURSTEPVALUE,CONTOURSTEPVALUE>& ValueArray);
int SetStepValueArray(CArray<CONTOURSTEPVALUE,CONTOURSTEPVALUE>& ValueArray);
/*<2A><><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>εĶ<CEB5><C4B6><EFBFBD>*/
void AddDataValueToTriangle();
/*<2A><><EFBFBD>µĹ<C2B5><C4B9><EFBFBD><EFBFBD>ӿڹ<D3BF><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
virtual void CreateTriangle(int iPrecision);//0--<2D>;<EFBFBD><CDBE><EFBFBD> 1--<2D>о<EFBFBD><D0BE><EFBFBD> 2--<2D>߾<EFBFBD><DFBE><EFBFBD>
/*<2A><>ǿ<EFBFBD><C7BF>ͨ<EFBFBD><CDA8>,<2C><><EFBFBD>ǽϳ<C7BD><CFB3><EFBFBD>ͨ<EFBFBD><CDA8>*/
void EnhanceConnection();
/*<2A><>ǿ<EFBFBD><C7BF>ͨ<EFBFBD><CDA8><><D6BB><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void SimpleEnhanceConnection();
BOOL TryConnectTwoRegion(CArray<int,int>& PointIndexArray0,CArray<int,int>& PointIndexArray1);
BOOL TryConnectTwoRegion(int iPointIndex0,int iPointIndex1);
void EnhanceConnectionSplitTriangleA(int iTriangleIndex,BYTE byteBorderIndex);
void EnhanceConnectionSplitTriangleB(int iTriangleIndex,BYTE byteBorderIndexA,BYTE byteBorderIndexB);
void EnhanceConnectionSplitTriangleC(int iTriangleIndex,BYTE byteBorderIndex);
BOOL GetProcessBar();
void SetProcessBar(BOOL bValue);
protected:
int GetCellCount(int iTriangleIndex);
CContourUnit* NewCell(int iTriangleIndex);
CContourUnit* GetCell(int iTriangleIndex,double dBorderPosition0,double dPosition0,double dBorderPosition1,double dPosition1);
CContourUnit* GetCell(int iTriangleIndex,double dBorderPosition,double dPosition0,double dPosition1);
void CheckLineCloseOrNot();
void BuildPolygon();
CContourPolygonGroup* GetPolygonGroupByValue(double dValue);
int CheckBorderPointArray(FACIESPOINT* pPointArray,int count,BOOL bClose,FACIESPOINT* pNewPointArray);
void ClearContour();
void AddCellNodeToPointArray();//<2F><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int PointInRegion(double x,double y);//<2F><><EFBFBD>Ƿ<EFBFBD><C7B7>ڱ߽<DAB1><DFBD><EFBFBD>
BOOL PointCrossBorder(double x0,double y0,double x1,double y1);
void TraceNoneValueBoundary();
void ClearTriangleBorderFlag();
void CreateFill();
void BuildTriangleNeighbor();
void CheckTriangleNeighbor();
void CheckPointInRegion();
void CreateTriangleOfPolygon(CArray<CScatteredEdge,CScatteredEdge>& BorderArray);
double CalculateCellWidth();
void CalculateArea();
void CreateColorMark();
//<2F><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void BuildDistanceIndex(double x,double y,SCATTEREDDATAINDEX* pIndexArray,int iInterpolatePointCount);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α߽<CEB1><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual void BuildDistanceIndex(int iTriangleIndex,BYTE byteNodeIndex,SCATTEREDDATAINDEX* pIndexArray,int iInterpolatePointCount);
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SetTriangleValue(int iTriangleIndex,BYTE byteNodeIndex,double dValue);
void CreateBorderLine();
};