【问题标题】:Get the leftmost point in a rotated GraphicsPath获取旋转的 GraphicsPath 中最左边的点
【发布时间】:2017-08-14 13:39:54
【问题描述】:

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

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

.

蓝色是来自 GetBounds() 的矩形,因此您可以看出,与我想要的点相比,我从该方法获得的最左边的点之间有一些空间。我怎样才能获得我正在寻找的积分?

【问题讨论】:

  • 您需要了解bezier curves 以及如何求解方程组以找到最外点。或者您对每个像素上的特定像素颜色进行命中测试(慢得要命)
  • 如何旋转?您可以旋转 Graphics 对象或 GraphicsPath?
  • @Psi Well...

标签: c# graphicspath


【解决方案1】:

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

这会起作用,因为你有一个椭圆,所以只有一个点可以是最左边的..

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 对象,您仍然可以使用相同的技巧..

【讨论】:

  • 谢谢你,这很完美!我确实像上面一样旋转了 GraphicsPath,而 Flatten 函数正是我所缺少的。似乎边界太大了,因为它们还包括曲线的控制点,
  • 边界似乎太大了,因为它们还包括曲线的控制点 嗯听起来很合理。但是:对于应该只包含线条的扁平路径来说,它仍然很宽。稍后我会进行一些测试..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2013-11-01
相关资源
最近更新 更多