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.

248 lines
5.3 KiB
C

1 month ago
#pragma once
#include "MLPlNode.h"
#include "MLPoint.h"
#include "MLRect.h"
#define MLDPline MLPline
class MLPointAry;
class MLRect;
class MLMICROSTRUCTURE_EXPORT MLPline
{
public:
MLPline(void);
MLPline(const QPolygonF& polygonf);
MLPline(const QVector<MLPlNode>& nodeAry);
~MLPline(void);
// Ԫ<><D4AA><EFBFBD><EFBFBD>
__declspec(property(get=getName, put = setName)) char* name;
__declspec(property(get=getNodeAry, put = setNodeAry)) QVector<MLPlNode> nodeAry;
public:
const char* getName() const;
void setName(const char* name);
QVector<MLPlNode>& getNodeAry();
void setNodeAry(const QVector<MLPlNode>& nodeAry);
void setNodeAry(const QPolygonF& polygon);
// <20>õ<EFBFBD><C3B5>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
int getCount() const;
// <20>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
bool isEmpty();
// <20>Ƿ<EFBFBD>Ϊ<EFBFBD>պ<EFBFBD><D5BA><EFBFBD>
bool isClose(double dis = 20.0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
void addHeadPt(const MLPlNode& node);
void addHeadPt(const MLPoint& point);
void addHeadPt(double x, double y, double z=0);
void addHeadPt(const MLPline& pline);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><><D4AD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD>)
void addHeadPtRev(const MLPline& pline);
void addHeadPtRev(const MLPointAry& pointAry);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
void addTailPt(const MLPlNode& node);
void addTailPt(const MLPoint& point);
void addTailPt(double x,double y,double z=0);
void addTailPt(const MLPline& pline);
void addTailPt(const QPoint& point);
void addTailPt(const QPointF& point);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><><D4AD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD>)
void addTailPtRev(const MLPline& pline);
void addTailPtRev(const MLPointAry& pointAry);
// <20>е<EFBFBD>ͷ<EFBFBD><CDB7>
const MLPlNode& getHeadPt() const;
MLPlNode& getHeadPt();
// <20>õ<EFBFBD>β<EFBFBD><CEB2>
const MLPlNode& getTailPt() const;
MLPlNode& getTailPt();
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>
const MLPlNode& getAtPt(int index) const;
// <20><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>
void setAtPt(int index, const MLPlNode& node);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
void insertAfter(int index, const MLPlNode& node);
void insertBefore(int index, const MLPlNode& node);
// <20>Ƴ<EFBFBD>ͷ<EFBFBD><CDB7>
void removeHead();
// <20>Ƴ<EFBFBD>β<EFBFBD><CEB2>
void removeTail();
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
void removeAt(int index);
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
void removeRt(const MLRect& dRect);
// <20>Ƴ<EFBFBD>С<EFBFBD>ڽǶȵ㣨<C8B5><E3A3A8><EFBFBD>ȣ<EFBFBD>
void removeAtFrAngle(double angle);
// <20>Ƴ<EFBFBD>С<EFBFBD>ڽǶȵ㣨<C8B5>Ƕȣ<C7B6>
void removeAtFrAngle2(double angle);
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
void removeAll();
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
void resize(int count);
// <20><><EFBFBD>߽ڵ㷴<DAB5><E3B7B4>
void reversePt();
MLPlNode& operator[]( int index );
const MLPlNode& operator[]( int index ) const;
const MLPlNode* getData() const;
MLPline* clone();
// <20><><EFBFBD><EFBFBD>
void copy(const MLPline& pline);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>
void copyPt(const QVector<MLPlNode>& noteAry);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>
void copyPt(const MLPline& pline);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ӱպϵ<D5BA>
void closeHeadPt();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ӱպϵ<D5BA>
void closeTailPt();
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MLPointAry getPointAry(int beginIndex ,int endIndex);
MLPline getPline(int beginIndex ,int endIndex);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>
MLRect calculateBox();
void resetBox();
MLRect getBox();
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>
double getLength();
double getLength(int index);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double getArea();
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>
void calculateLength();
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>
void calculateArea() ;
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>Ƕ<EFBFBD>
void calculateAngle();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>
MLPoint calculateCentroid();
// <20><><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD>
void redundant(double error=1.0);
// <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int findIndex(const MLPoint& point, double delt=0.1);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool contains(const MLPoint& point);
bool contains(const MLPlNode& node);
bool contains(double x, double y);
// <20>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool containsWhole(const MLPline& other);
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool read(const QString& Path);
bool read(QFile& fr); //
void read(QDataStream &in);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void write(const QString& Path);
void write(QFile& fw);
void write(QDataStream &out);
void write(QTextStream& out);
// תָ<D7AA><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void toXyData(double*& pX, double*& pY, int& count);
// תΪQt <20><>ʽ
void toQPolygonF(QPolygonF&);
QPolygonF toQPolygonF()const;
// <20><><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>
void sampling(MLPline &curve, double step);
// <20>õ<EFBFBD><C3B5><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>
double getHeadTailDistance() const;
// <20>õ<EFBFBD><C3B5><EFBFBD><E3B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶δ<DFB6>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>
double getNearest(const MLPlNode& node, int& index, MLPlNode& dptDest);
// <20><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double getDistance(const MLPlNode& node1, const MLPlNode& node2) const;
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
double getDistance(int index1, int index2);
// <20><><EFBFBD>㴹ֱ<E3B4B9><D6B1>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double getVerticalDistance(const MLPlNode& dPoint1, const MLPlNode& dPoint2);
// <20><><EFBFBD>㴹ֱ<E3B4B9><D6B1>֮<EFBFBD><EFBFBD><E4B7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double getReverseDistance(const MLPlNode& dPoint1, const MLPlNode& dPoint2);
// <20><><EFBFBD>Ƕ<EFBFBD>תΪ<D7AA><CEAA><EFBFBD><EFBFBD>
void toSinglePline(QList<MLPline *>& singleCurveList, double Angle);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void createEllipse(const MLPoint& point, double radius);
private:
char m_name[64]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QVector<MLPlNode> m_nodeAry;// <20><><EFBFBD>߽ڵ<DFBD><DAB5>б<EFBFBD>
double m_dLength;
double m_dArea;
MLRect m_box;
};
//////////////////////////////////////////////////////////////////////////
class MLMICROSTRUCTURE_EXPORT MLDPlineRedundant
{
public:
MLDPlineRedundant(void);
MLDPlineRedundant(double *oldx, double *oldy, double *oldz, double *oldl, int oldnum, int *mark);
MLDPlineRedundant(double *oldx, double *oldy, int oldnum, int *mark);
~MLDPlineRedundant(void);
public:
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0B4A6>
void execute(double dbError = -1.0);
// <20><><EFBFBD><EFBFBD><E0B4A6><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>
int getMarkNum();
private:
void getNewPoint(int n1,int n2);
int m_nMarkNum;
int *m_pMark;
double m_dbMinDistance; //<2F><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
int num;
double *x,*y,*z,*l;
};