我用如下语句画了一条带箭头的直线,现在的问题是我如何判断Mouse位于该条直线及其箭头线帽内.
graphics.SmoothingMode = SmoothingMode.AntiAlias;
AdjustableArrowCap lineCap = new AdjustableArrowCap(3.0F, 3.0F, true);
Pen pen = new Pen(Selected ? skin.SelectedColor : skin.ForeColor, skin.LineWidth);
pen.CustomEndCap = lineCap;
graphics.DrawLine(pen, FromPoint, ToPoint);比如说如果画的是矩形,那很简单就判断,如下:public bool Contains(Point point)
{
      return new Rectangle(Location, Size).Contains(point);
}我现在想达到的效果就是像矩形一样判断该点是否在该条直线及其箭头线帽内.
我曾尝试过用以下方法来判断         public bool Contains(Point point)
        {
            GraphicsPath path = new GraphicsPath();
            path.AddLine(FromPoint, ToPoint);
            path.CloseFigure();
            foreach (PointF floatPoint in path.PathPoints)
            {
                Point intPoint = new Point((int)floatPoint.X, (int)floatPoint.Y);
                if (intPoint == point)
                {
                    return true;
                }
            }
            return false;
        }但是没有达到效果,因为path.PathPoints只包含2个点,即使这样的办法行得通,也无法判断箭头

解决方案 »

  1.   


     GraphicsPath path = new GraphicsPath();
                path.AddLine(FromPoint, ToPoint);
                path.CloseFigure();   Region r = new Region(path);
    return  r.IsVisible(point);
      

  2.   

    感谢楼上的,线确实可以通过直线方程来判断,但是箭头线帽的计算比较麻烦,因为这个箭头不一定是水平或垂直的,如果线是斜的,这个箭头也是斜的,恰好我的数字太差了,这类问题有点头大啊
    不知道有没有相关的Api来解决这个问题
      

  3.   

    感谢2楼给我的启发,这个问题已经解决,具体如下:
     public bool Contains(Point point, Skin skin)
            {
                GraphicsPath path = new GraphicsPath();
                path.AddLine(FromPoint, ToPoint);
                path.CloseFigure();
                AdjustableArrowCap lineCap = new AdjustableArrowCap(3.0F, 3.0F, true);
                Pen pen = new Pen(Selected ? skin.SelectedColor : skin.ForeColor, skin.LineWidth);
                pen.CustomEndCap = lineCap;
                return path.IsOutlineVisible(point, pen);
            }