#ifndef VECTORSQRT_H #define VECTORSQRT_H #include #include #include "config/config.h" #include "comm/datadef.h" class VSqrtItem : public QObject { Q_OBJECT public: explicit VSqrtItem(QObject *parent = NULL); VSqrtItem(const VSqrtItem & item); public: VSqrtItem& operator=(const VSqrtItem & item); private: void CopyData(const VSqrtItem & item); public: void InitVSItem(); public: int m_sqrttype; // 图形类型, 1, 直线, 2, 圆弧; 3, 三次贝塞尔 double m_begx; double m_begy; // 起点 double m_midx; double m_midy; // 中间点1 double m_midx2; double m_midy2; // 中间点2 double m_endx; double m_endy; // 终点 public: u32 m_code; // 数据类型 public: int m_ownsteplock; // 专有步长和回针标志, != 0, 使用一下的步长和锁针参数. 否则,使用公共的参数 u32 m_stepSize; // 步长 u32 m_blockNum; // 起始锁针针数 u32 m_blockTimes; // 起始锁针次数 u32 m_blockjumps; // 起始跳过针数 u32 m_elockNum; // 结束锁针针数 u32 m_elockTimes; // 结束锁针次数 u32 m_elockjumps; // 结束跳过针数 }; class VectorSqrt : public QObject { Q_OBJECT public: DataFileHead m_fileHead; // 数据文件头描述 explicit VectorSqrt(QObject *parent = NULL); ~VectorSqrt(); VectorSqrt(const VectorSqrt & item); public: VectorSqrt& operator=(const VectorSqrt & item); private: void CopyData(const VectorSqrt & item); public: void InitVSqrt(QString name = QString()); public: QString m_filename; // 名称 int m_anchorSel; // 定位点选择; 0, 和起点重合; 1,图形的左下角; 2, 图形的右下角; 3, 图形的右上角; 4, 图形的左上角; 5, 图形的中心 public: QList m_vSqitItemList; // 图形列表 public: // 针步和回针参数 u32 m_para_stepSize ; // 步长 u32 m_para_blockNum ; // 起始锁针针数 u32 m_para_blockTimes ; // 起始锁针次数 u32 m_para_blockjumps ; // 起始跳过针数 u32 m_para_elockNum ; // 结束锁针针数 u32 m_para_elockTimes ; // 结束锁针次数 u32 m_para_elockjumps ; // 结束跳过针数 public: //这个过程应该放在不同的文件实现中而不是放在 VectorSqrt 这里生成数据中应该分离开 int CreateDs16FromSqrt(QByteArray & ds16Ary); int CreateDs8FromDs16(const QByteArray & ds16Ary, QByteArray & ds8Ary); int CreateDs4FromSqrt(QByteArray & ds4Ary); int CreateDs2FromDs4(const QByteArray & ds4Ary, QByteArray & ds2Ary); public: void SetAnchor(int nX,int nY); void SetBegin(int nX,int nY); private: int m_anchorX;//定位点X int m_anchorY;//定位点Y int m_beginX;//数据起点坐标X int m_beginY;//数据起点坐标Y signals: public slots: }; int GetDataMinMax(DataItem * pData, int nums, s32 & minx, s32 & miny, s32 & maxx, s32 & maxy); // 图形算法 // 直线 int CalcLine(double x0, double y0, double x1, double y1, int * pactx, int * pacty, int stepSize, DataItem * pData, u8 type, s16 dr); // 三点圆弧 int CalcCurve(double threex[], double threey[], int * pactx, int * pacty, int * pActAng, int stepSize, DataItem * pData, u8 type); void Rotatec(double xin, double yin, double * px, double * py, double angle); int ArcDir(const double x[], const double y[]); int IsThreePointOnALine(const double threex[], const double threey[]); int GetArcCenter(const double x[], const double y[], double * pxc, double * pyc, double * pr); int GetArcRectAndAngle(const double x[], const double y[], double * minx, double * maxx, double * miny, double * maxy, double * startangle, double * endangle); int GetArcMinMax(const double x[], const double y[], double * pminx, double * pmaxx, double * pminy, double * pmaxy); s16 GetAngle(const double bx, const double by, const double ex, const double ey, int * pActAng); // 三次贝塞尔 int GetBezierMinMax(const double x[], const double y[], double * pminx, double * pmaxx, double * pminy, double * pmaxy); #endif // VECTORSQRT_H