|
|
|
|
|
#pragma once
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include <list>
|
|
|
|
|
|
#include <fstream>
|
|
|
|
|
|
using std::string;
|
|
|
|
|
|
using std::fstream;
|
|
|
|
|
|
using std::vector;
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ͼԪ
|
|
|
|
|
|
|
|
|
|
|
|
enum ElementType
|
|
|
|
|
|
{
|
|
|
|
|
|
eNull = -1,
|
|
|
|
|
|
ePoint = 0,
|
|
|
|
|
|
eRect = 1,
|
|
|
|
|
|
eLine = 2,
|
|
|
|
|
|
eDfg = 3
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AFX_EXT_CLASS GBaseObj
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
GBaseObj();
|
|
|
|
|
|
virtual ~GBaseObj();
|
|
|
|
|
|
GBaseObj& operator=(const GBaseObj& other);
|
|
|
|
|
|
void SetName(string strName);
|
|
|
|
|
|
void SetName(char* strname);
|
|
|
|
|
|
void SetName(const char* strname);
|
|
|
|
|
|
void SetLayer(const char* strLayer);
|
|
|
|
|
|
void SetLayer(string strLayer);
|
|
|
|
|
|
void SetColor(COLORREF clr);
|
|
|
|
|
|
string GetName(void);
|
|
|
|
|
|
string GetLayer(void);
|
|
|
|
|
|
COLORREF GetColor(void);
|
|
|
|
|
|
ElementType GetType(void);
|
|
|
|
|
|
|
|
|
|
|
|
void SetPosition(const char* strname);
|
|
|
|
|
|
string GetPosition(void);
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
void SetType(ElementType type);
|
|
|
|
|
|
string m_strName; //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
string m_strLayer; //<2F><>λ
|
|
|
|
|
|
COLORREF m_color; //<2F><>ɫ
|
|
|
|
|
|
ElementType m_type; //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
string m_strPosition; // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
class AFX_EXT_CLASS GPoint3D:public GBaseObj
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
GPoint3D(void);
|
|
|
|
|
|
GPoint3D(double x, double y, double z);
|
|
|
|
|
|
bool operator<(const GPoint3D& other) const;
|
|
|
|
|
|
bool operator==(const GPoint3D& other) const;
|
|
|
|
|
|
GPoint3D& operator=(const GPoint3D& other);
|
|
|
|
|
|
void Write(FILE* fw);
|
|
|
|
|
|
double Distance2D(const GPoint3D& other) const;
|
|
|
|
|
|
void Rotate(double xs, double ys, double radian);
|
|
|
|
|
|
void Rotate(double xs, double ys, double cosa, double sina);
|
|
|
|
|
|
~GPoint3D(void);
|
|
|
|
|
|
double x0;
|
|
|
|
|
|
double y0;
|
|
|
|
|
|
double z0;
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
class AFX_EXT_CLASS GRect8 :public GBaseObj
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
GRect8(void);
|
|
|
|
|
|
GRect8(double l, double r, double b, double t);
|
|
|
|
|
|
bool IsIntersected(const GRect8& other) const;
|
|
|
|
|
|
void GetCenter(double& x, double& y);
|
|
|
|
|
|
double Width(void);
|
|
|
|
|
|
double Height(void);
|
|
|
|
|
|
void Create(double x0, double y0, double width, double height);
|
|
|
|
|
|
double left;
|
|
|
|
|
|
double right;
|
|
|
|
|
|
double bottom;
|
|
|
|
|
|
double top;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
class AFX_EXT_CLASS GPline :public GBaseObj
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
GPline(void);
|
|
|
|
|
|
~GPline(void);
|
|
|
|
|
|
|
|
|
|
|
|
void operator+=(double t);
|
|
|
|
|
|
|
|
|
|
|
|
void Clear(void);
|
|
|
|
|
|
int ReadFile(std::ifstream& ifs); //<2F><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD> x,y,z
|
|
|
|
|
|
void AddPoint(const GPoint3D& pt);
|
|
|
|
|
|
void SetPoint(int idx, double xx, double yy, double zz = 0);
|
|
|
|
|
|
void SetPoint(int idx, const GPoint3D& pt);
|
|
|
|
|
|
void SetPoints(const std::list<GPoint3D>& ptlst); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
int GetCount(void) const;//<2F><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
GRect8 GetRect(void) const;//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD>
|
|
|
|
|
|
////<2F><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>other<65>Ľ<EFBFBD><C4BD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD>list<CPoint3D>,cxpIndexs<78><73><EFBFBD><EFBFBD><EFBFBD>㷨<EFBFBD><E3B7A8><EFBFBD>ϸ<CFB8><F1A3ACBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뽻<EFBFBD>㲻<EFBFBD><E3B2BB>Ӧ
|
|
|
|
|
|
int GetCrossPoints(const GPline& other, std::list<GPoint3D>& cxpts, std::list<int>& cxpIndexs);
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> istartΪ<74><CEAA>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>factorΪ<72><CEAA><EFBFBD><EFBFBD><EFBFBD>߶α<DFB6><CEB1><EFBFBD>
|
|
|
|
|
|
int GetLocation(double x0, double y0, double& factor);
|
|
|
|
|
|
bool GetCoordinate(double l0, double & x, double& y, double& z, int& locationIndex);
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void GetGravityCenter(double& x0, double& y0);
|
|
|
|
|
|
//<2F>жϵ<D0B6>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>other<65>Ƿ<EFBFBD><C7B7>ཻ
|
|
|
|
|
|
bool IsIntersected(const GPline& other) const;
|
|
|
|
|
|
//<2F>ж<EFBFBD>other<65>Ƿ<EFBFBD><C7B7>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>0<EFBFBD><30> <20><><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2>ڷ<EFBFBD><DAB7><EFBFBD>2
|
|
|
|
|
|
int IsInside(const GPline& other) const;
|
|
|
|
|
|
//<2F>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>0 <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>2
|
|
|
|
|
|
int IsInside(double x0, double y0) const;
|
|
|
|
|
|
//<2F>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>0 <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>2
|
|
|
|
|
|
int IsInside(const GRect8& rect) const;
|
|
|
|
|
|
void FromRect(const GRect8& rect);
|
|
|
|
|
|
bool IsClosed(double esp); //<2F>Ƿ<EFBFBD><C7B7>պ<EFBFBD>
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5>ཻ<EFBFBD><E0BDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>solution<6F><6E><EFBFBD><EFBFBD><EFBFBD>ཻ<EFBFBD><E0BDBB><EFBFBD><EFBFBD>false
|
|
|
|
|
|
bool GetIntersectedPolygon(const GPline& other, GPline& solution);
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
double Area(void) const;
|
|
|
|
|
|
double X(int i)const;
|
|
|
|
|
|
double Y(int i) const;
|
|
|
|
|
|
double Z(int i) const;
|
|
|
|
|
|
double L(int i) const;
|
|
|
|
|
|
void Write(FILE* fw);
|
|
|
|
|
|
GPoint3D GetPoint(int idx) const;
|
|
|
|
|
|
double GetLength(void);
|
|
|
|
|
|
void GetLocation(void); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><D7AE>
|
|
|
|
|
|
//<2F><>ȡƽ<C8A1><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(-PI/2,PI/2]
|
|
|
|
|
|
double GetAverageDirection(void);
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(x0,y0)Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>תradian<61><6E><EFBFBD><EFBFBD>
|
|
|
|
|
|
void Rotate(double xs, double ys, double radian);
|
|
|
|
|
|
void Rotate(double xs, double ys, double cosa, double sina);
|
|
|
|
|
|
void Reverse();
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<GPoint3D> m_points;
|
|
|
|
|
|
std::vector<double> m_locations;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//x0,y0Ϊ<30><CEAA><EFBFBD>ĵ㣬б<E3A3AC><D0B1>k <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>Ϊlen
|
|
|
|
|
|
AFX_EXT_CLASS GPline* CreateLine(double x0, double y0, double sina, double cosa, double len);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> xs ,ys<79><73><EFBFBD>㣬 xe ye <20>յ<EFBFBD> <20>Ƕ<EFBFBD>lndirect, lenΪ<6E><CEAA>1/2<><32><EFBFBD><EFBFBD>
|
|
|
|
|
|
AFX_EXT_CLASS int CreateLines(vector<GPline*>& dstLines, double xs, double ys, double xe, double ye,
|
|
|
|
|
|
double dx, double dy, double lndirect, double len);
|
|
|
|
|
|
|
|
|
|
|
|
|