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.

155 lines
4.2 KiB
C

1 month ago
#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);