检查点是在旋转矩形(C#)(Check if a point is in a rotated rec

2019-06-28 08:02发布

我在C#(Windows窗体)一个程序,它利用了一个PictureBox一些矩形。 他们可以在太(旋转)的角度得出。

我知道每个矩形起始点(左上角),它们的尺寸(宽度+高度)和它们的角度。 由于旋转,起点是不是necessarely的左上角,但是这并不此处所。 然后,当我点击PictureBox的,我需要检查其中的矩形(如果有的话)我点击了。

所以,我需要检查,如果一个点在一个长方形的一些方式,但我还需要考虑到每个矩形的旋转。 有谁知道的方式在C#这样做吗?

Answer 1:

是否有可能将施加到矩形反向点相同的旋转?

例如,矩形A从它的起源(左上角)顺时针旋转45度,你会那么就绕同一产地逆时针45度B点,然后检查,看它是否落入矩形中的预先旋转



Answer 2:

你可以保持一秒钟,未显示的图像您画矩形的副本,每个颜色独特。 当用户点击该PictureBox的,找到第二图像中的对应像素,其将识别被点击该矩形的颜色。



Answer 3:

编辑:回头看后,我使用MonoGame和OP使用的是Windows窗体。 以下是MonoGame。

我一直在搞乱这一段时间,并已发现一对夫妇的答案,只是他们没有实际工作。 下面是不完全一样OP描述,如果不是因为OP然后其他人谷歌搜索,好像我是一个C#的功能。

这是一个让人头疼的数字了这一点。 很多典型的猜测。

    bool PointIsInRotatedRectangle(Vector2 P, Rectangle rect, float rotation)
    {
        Matrix rotMat = Matrix.CreateRotationZ(-rotation);
        Vector2 Localpoint = P - (rect.Location).ToVector2();
        Localpoint = Vector2.Transform(Localpoint, rotMat);
        Localpoint += (rect.Location).ToVector2();

        if (rect.Contains(Localpoint)) { return true; }
        return false;
    }

在这里,它是在一个单一的代码行。 可能更快地使用。

    bool PointIsInRotatedRectangle(Vector2 P, Rectangle rect, float rotation)
    {
        if (
            rect.Contains(Vector2.Transform(P - (rect.Location).ToVector2(), Matrix.CreateRotationZ(-rotation)) + (rect.Location).ToVector2())
            ) { return true; }
        return false;
    }


Answer 4:

我知道这已经回答了,但我必须做同样的事情前一阵子。 我创建了System.Windows.Point类,帮助做什么尼尔提出的扩展方法:

    public static double GetAngle(this Point pt)
    {
        return Math.Atan2(pt.X, -pt.Y) * 180 / Math.PI;
    }

    public static Point SetAngle(this Point pt, double angle)
    {
        var rads = angle * (Math.PI / 180);
        var dist = Math.Sqrt(pt.X * pt.X + pt.Y * pt.Y);
        pt.X = Math.Sin(rads) * dist;
        pt.Y = -(Math.Cos(rads) * dist);
        return pt;
    }

这将让我配点的角度在0附近上班,0。所以,如果你知道你正在测试你会被这个值的负偏移点(例如矩形的中心:pt.X - = 32 ; pt.Y - = 32),然后您将适用矩形的负旋转(如由Neil建议:-45 pt.SetAngle();)...

现在,如果点中64,64,你知道你打的矩形。 更具体地讲,我检查旋转的图像的像素,以确保我打了一个特定颜色的像素。



Answer 5:

请问矩形被允许重叠? 如果是这样,你想在一个点所有的矩形,或只是一个在顶层?



Answer 6:

如果你知道矩形的角的坐标,这是仅涉及几个点,并标产品的快速,优雅的解决方案: https://math.stackexchange.com/a/190373/178768



文章来源: Check if a point is in a rotated rectangle (C#)