65,210
社区成员
发帖
与我相关
我的任务
分享我又改进了一下:
bool CObject::CheckSelectLine(const POINT &pt1)
{
if (P->empty()) return false;
vector< POINT >::iterator Head=P->begin();
vector< POINT >::iterator Tail=P->end()-1;
long sx=(*Head).x;//start x
long sy=(*Head).y;//start y
long ex=(*Tail).x;//end x
long ey=(*Tail).y;//end y
long px=pt1.x;
long py=pt1.y;
//判断是否在矩形区域以外
if (px<min(ex,sx)||px>max(ex,sx))return false;
if (py<min(ey,sy)||py>max(ey,sy))return false;
if (abs(ex-sx)>=abs(ey-sy))//近x轴
{
if ((*(Head+abs(px-sx))).y==py)return true;
}
else//近Y轴
{
if ((*(Head+abs(py-sy))).x==px)return true;
}
return false;
}bool CObject::CheckSelectLine(const POINT &pt1)
{
if (P->empty()) return false;
vector < POINT >::iterator Head=P->begin();
vector < POINT >::iterator Tail=P->end()-1;
long sx=(*Head).x;//start x
long sy=(*Head).y;//start y
long ex=(*Tail).x;//end x
long ey=(*Tail).y;//end y
long px=pt1.x;
long py=pt1.y;
long vx=abs(ex-sx);//x轴矢量
long vy=abs(ey-sy);//y轴矢量
long vpx=abs(px-sx);
long vpy=abs(py-sy);
if (sx <=ex)//开始点在左边
{
if (px <sx||px>ex)return false;//在区域以外
goto level2;
}
else//if (sx>ex)//开始点在右边
{
if (px <ex||px>sx)return false;//在区域以外
goto level2;
}
level2:
if (sy <=ey)//开始点在上边
{
if (py <sy||py>ey)return false;//在区域以外
goto level3;
}
else//if (sy>ey)开始点在下边
{
if (py <ey||py>sy)return false;//在区域以外
goto level3;
}
level3:
if (vx>=vy)//近x轴
{
if ((*(Head+vpx)).y==py)return true;
}
else//if(vx <vy)近Y轴
{
if ((*(Head+vpy)).x==px)return true;
}
return false;
} bool CObject::CheckSelectLine(const POINT &pt1)
{
if (P->empty()) return false;
vector < POINT >::iterator it=P->begin();
for (; it!=P->end();++it)
{
if ((*it).x==pt1.x||(*it).y==pt1.y)
return true;
}
return false;
} #include <windows.h>
#include <math.h>
#include <vector
using namespace std;
typedef vector< POINT > VECPT;
typedef vector< POINT >::iterator ITEPT;
const int SELECTOBJECT=0;
const int DRAWLINE =1;
const int DRAWCIRCLE =2;
const int DRAWRECT =3;
class CObject
{
public:
CObject();
virtual ~CObject();
VECPT *P;
private:
bool m_bSelect;
DWORD m_dwColor;
public:
DWORD GetColor(){return m_dwColor;}
void StoreLine( POINT pt1,POINT pt2);
void StoreCircle(POINT pt1,POINT pt2);
void StoreRect( POINT pt1,POINT pt2);
bool CheckSelectLine(const POINT&);
static void DrawtempRect( POINT,POINT,DWORD color,BYTE * memory,DWORD lpitch);
static void Drawtempline( POINT,POINT,DWORD color,BYTE * memory,DWORD lpitch);
static void DrawtempCircle(POINT,POINT,DWORD color,BYTE * memory,DWORD lpitch);
};