获取旋转的GraphicsPath中的最左侧点

时间:2017-08-14 13:39:54

标签: c# graphicspath

我创建一个GraphicsPath对象,添加一个椭圆,旋转GraphicsPath对象,然后绘制它。现在我想得到例如graphicsPath最左边的Point,这样我就可以检查它是否在某些边界内(用户可以用鼠标移动graphicsPath)。

我目前正在使用GraphicsPath中的GetBounds()方法,但只会产生以下结果

image

蓝色是来自GetBounds()的矩形,所以你可以看出我从这个方法获得的最左边的Point与我想要的Point之间有一些空间。我怎样才能得到我想要的点?

1 个答案:

答案 0 :(得分:1)

如果实际旋转GraphicsPath,可以使用Flatten功能获取大量路径点。然后,您可以选择最小x值,并从中选择相应的y值。

这将有效,因为你有一个椭圆,所以只有一个点可以是最左边的..

enter image description here

private void panel1_Paint(object sender, PaintEventArgs e)
{
    GraphicsPath gp = new GraphicsPath();
    gp.AddEllipse(77, 55, 222, 77);

    Rectangle r = Rectangle.Round(gp.GetBounds());
    e.Graphics.DrawRectangle(Pens.LightPink, r);
    e.Graphics.DrawPath(Pens.CadetBlue, gp);

    Matrix m = new Matrix();
    m.Rotate(25);
    gp.Transform(m);
    e.Graphics.DrawPath(Pens.DarkSeaGreen, gp);
    Rectangle rr = Rectangle.Round(gp.GetBounds());
    e.Graphics.DrawRectangle(Pens.Fuchsia, rr);

    GraphicsPath gpf = (GraphicsPath)gp.Clone();
    gpf.Flatten();
    float mix = gpf.PathPoints.Select(x => x.X).Min();
    float miy = gpf.PathPoints.Where(x => x.X == mix).Select(x => x.Y).First();
    e.Graphics.DrawEllipse(Pens.Red, mix - 2, miy - 2, 4, 4);
}

请不要问我为什么旋转边界如此宽 - 我真的不知道!

如果您在绘制之前旋转Graphics对象,则可能仍然使用相同的技巧..