#pragma once #include "MLVector.h" #define MLDPoint MLPoint class MLPlNode; class MLPoint : public MLVector { public: MLPoint(void); MLPoint(double vx, double vy); MLPoint(double vx, double vy, double vz); MLPoint(double vx, double vy, double vz, double vcz); MLPoint(double vx, double vy, double vz, double vcz, double vl); MLPoint(double vx, double vy, char* name); MLPoint(double vx, double vy, double vz, char* name); MLPoint(const MLPoint& dPoint); MLPoint(const MLPlNode& node); explicit MLPoint(const QPointF& point); ~MLPoint(void); // 元素数 __declspec(property(get=getName, put = setName)) char* name; __declspec(property(get=getCZ, put = setCZ)) double cz; __declspec(property(get=getL, put = setL)) double l; __declspec(property(get=getType, put = setType)) int type; __declspec(property(get=getIndex, put = setIndex)) int index; public: const char* getName() const; void setName(const char* name); void setName(const QString& name); QString getNameQStr(); void setCZ(double cz); double getCZ() const; double& getCZ(); double getL() const; void setL(double l); int getType() const; void setType(int type); int getIndex() const; int& getIndex(); void setIndex(int idx); // 设置点坐标 void setPoint(double dbx,double dby,double dbz); void setPoint(const MLPoint& dPoint); void setPoint(const MLPlNode& node); void setPoint(const QPointF& point); MLPoint& operator = (const MLPoint& point) throw(); MLPoint& operator = (const QPoint& point) throw(); // 点偏移 void offset(double offsetx, double offsety); // 相等 bool Equ(const MLPoint& other, int dot=6); // 转点坐标 MLPlNode toPlNode() const; QPoint toQPoint() const; QPointF toQPointF() const; // 读取点数据 void readPoint(QDataStream& in); void readPoint(FILE* fr); // 输出点数据 void writePoint(QDataStream& out); void writePoint(FILE* fw); private: char m_name[32]; double m_cz; double m_l; // 长度 int m_type; int m_index; // 索引 }; MLMICROSTRUCTURE_EXPORT QDataStream &operator<<(QDataStream &stream, const MLPoint &point); MLMICROSTRUCTURE_EXPORT QDataStream &operator>>(QDataStream &stream, MLPoint &point); ////////////////////////////////////////////////////////////////////////// class MLMICROSTRUCTURE_EXPORT MLPointAry { public: MLPointAry(); ~MLPointAry(); public: // 清空点数组 void clear(); // 个数 int count() const; // 重设置数组个数 void resetCount(int count); // 添加点数据 void append(const MLPoint& dPoint); void append(const MLPlNode& node); void append(double x, double y, double z=0); const MLPoint& at(int index) const; // 设置点数据 void setAt(int index, const MLPoint& dPoint); const MLPoint& getAt(int index) const; void removeAt(int index); void insertAt(int index, const MLPoint& dPoint); MLPoint* getData(); const MLPoint* getData() const; MLPoint& operator[]( int index ); const MLPoint& operator[]( int index ) const; void operator = (const MLPointAry& point) throw(); // 创建数据 void createPoint(int nNum); // 按长度插入点数据 void insertPt(double dl, const MLPoint& dPoint); void copy(const MLPointAry& pointAry); void append(const MLPointAry& pointAry); void read(QDataStream& in); void write(QDataStream& out); // 计算点所在数组长度位置 void calPointPos(); // 使用之前要计算 double getDistance(); // 获得数组最大边框 void calculateBox(); MLBox getBoundingBox() const; // 获得数组X最大值 double getXMax(); // 获得数组X最小值 double getXMin(); // 得到中心点 MLPoint getCenterPt(); // 按 X 排序 double getYAscX(double x); double getYDescX(double x); //MLPline toPline(); private: // 二分法查找(假设数据已按升序排序) void sort(const MLPointAry& pointAry); int bs(double dl, const MLPointAry& pointAry); int findIndex(double x); private: QVector m_PointAry; bool m_bCalPos; // 是否计算过位置 };