19,469
社区成员
发帖
与我相关
我的任务
分享
BOOL CGDIPLine::IsHitLine( PointF ptStart,PointF ptEnd, CPoint ptMouse )
{
PointF ptOppositeLineEnd; //对边的结束点 注意:OppositeLine的方向和Line的方向是相反的
PointF ptOppositeLineStart; //对边的起始点
POINT ptTempRng[4];
float fWidth = 3* m_DrawPen.GetWidth();
float fAdjacent=ptEnd.X-ptStart.X; //邻边
float fOpposite=ptEnd.Y-ptStart.Y; //对边
double dHeight=pow(pow((double)(ptStart.X-ptEnd.X),2)+pow((double)(ptStart.Y-ptEnd.Y),2),0.5);
ptOppositeLineStart.X=(REAL)(ptEnd.X-fWidth*fOpposite/dHeight);
ptOppositeLineStart.Y=(REAL)(ptEnd.Y+fWidth*fAdjacent/dHeight);
ptOppositeLineEnd.X=(REAL)(ptStart.X-fWidth*fOpposite/dHeight);
ptOppositeLineEnd.Y=(REAL)(ptStart.Y+fWidth*fAdjacent/dHeight);
float fOffsetX=(ptOppositeLineEnd.X-ptStart.X)/2; //求两点的中间点坐标
float fOffsetY=(ptOppositeLineEnd.Y-ptStart.Y)/2;
//RectOffset
ptStart.X-=fOffsetX;
ptStart.Y-=fOffsetY;
ptEnd.X-=fOffsetX;
ptEnd.Y-=fOffsetY;
ptOppositeLineStart.X-=fOffsetX;
ptOppositeLineStart.Y-=fOffsetY;
ptOppositeLineEnd.X-=fOffsetX;
ptOppositeLineEnd.Y-=fOffsetY;
//按顺时针方向储存矩形四个点
ptTempRng[UR].x=(LONG)ROUND(ptStart.X);
ptTempRng[UR].y=(LONG)ROUND(ptStart.Y);
ptTempRng[BR].x=(LONG)ROUND(ptEnd.X);
ptTempRng[BR].y=(LONG)ROUND(ptEnd.Y);
ptTempRng[BL].x=(LONG)ROUND(ptOppositeLineStart.X);
ptTempRng[BL].y=(LONG)ROUND(ptOppositeLineStart.Y);
ptTempRng[UL].x=(LONG)ROUND(ptOppositeLineEnd.X);
ptTempRng[UL].y=(LONG)ROUND(ptOppositeLineEnd.Y);
HRGN hLienRgn = CreatePolygonRgn(ptTempRng,4,WINDING);
return PtInRegion(hLienRgn,ptMouse.x,ptMouse.y);
}