Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查矩形是否与三个点之间的区域重叠?(C#和XNA)_C#_Xna_Point_Intersect - Fatal编程技术网

如何检查矩形是否与三个点之间的区域重叠?(C#和XNA)

如何检查矩形是否与三个点之间的区域重叠?(C#和XNA),c#,xna,point,intersect,C#,Xna,Point,Intersect,我正在用C#和XNA做一个游戏,我用三个点来代表一个敌人目标的命中率。矩形变量用于表示玩家的点击框。我使用三个点来表示敌人,而不是矩形,因为敌人的形状像三角形 //Example coordinates Point pointOne = new Point(0, 50); Point pointTwo = new Point(50, 50); Point pointThree = new Point(25, 0); Rectangle rect = new Rectangle(0, 0, 10,

我正在用C#和XNA做一个游戏,我用三个点来代表一个敌人目标的命中率。矩形变量用于表示玩家的点击框。我使用三个点来表示敌人,而不是矩形,因为敌人的形状像三角形

//Example coordinates
Point pointOne = new Point(0, 50);
Point pointTwo = new Point(50, 50);
Point pointThree = new Point(25, 0);
Rectangle rect = new Rectangle(0, 0, 10, 10);
我需要一种方法来确定矩形是否与所有点之间的区域重叠,如下图所示。有人能给我展示一种方法或某种代码来帮助我完成这个任务吗


以下是一种替代实现:

class Triangle
{
    Vector2 topPoint, rightPoint, leftPoint;


    public Triangle(Vector2 p1, Vector2 p2, Vector2 p3)
    {
        topPoint = p1;
        rightPoint = p2;
        leftPoint = p3;
    }



    public bool IsRectIntersecting(List<Vector2> corners)//corners are the corners of the polygon being tested
    {


        if (AreAnyOfTheCornesInsideTriangleLineSegment(topPoint, rightPoint, corners) && 
            AreAnyOfTheCornesInsideTriangleLineSegment(rightPoint, leftPoint, corners) && 
            AreAnyOfTheCornesInsideTriangleLineSegment(leftPoint, topPoint, corners))
        {
            return true;
        }

        return false;
    }

    private bool AreAnyOfTheCornesInsideTriangleLineSegment(Vector2 pointA, Vector2 pointB, List<Vector2> corners)
    {
        Vector2 lineSegment = pointA - pointB;
        Vector3 lineSegment3D = new Vector3(lineSegment, 0);
        Vector3 normal3D = Vector3.Cross(lineSegment3D, Vector3.UnitZ);
        Vector2 normal = new Vector2(normal3D.X, normal3D.Y);

        foreach (Vector2 corner in corners)
        {
            if (Vector2.Dot(normal, corner - pointB) < 0)
            {
                return true;
            }
        }

        return false;
    }
}
类三角形
{
向量2顶点、右点、左点;
公共三角形(向量2 p1、向量2 p2、向量2 p3)
{
顶点=p1;
右点=p2;
左点=p3;
}
public bool isrectintercsecting(列出角点)//角点是正在测试的多边形的角点
{
if(三角形线段(顶点、右点、角点)和
三角形线段(右点、左点、角点)和
三角形线段(左侧点、顶部点、角点)边角的面积
{
返回true;
}
返回false;
}
三角形线段(矢量2点A、矢量2点B、列表角点)边角的专用边界面积
{
矢量2线段=点A-点B;
Vector3 lineSegment3D=新的Vector3(线段,0);
Vector3 normal3D=Vector3.Cross(lineSegment3D,Vector3.UnitZ);
Vector2 normal=新的Vector2(normal3D.X,normal3D.Y);
foreach(矢量2角点在角点中)
{
if(向量2.点(法线,角点B)<0)
{
返回true;
}
}
返回false;
}
}

请参见此答案:您需要多边形碰撞检测尼斯解决方案。比我的详细得多。我注意到的一个差异是,你的解决方案不考虑相交交叉点(如果只有矩形和三角形的角接触,它们被认为是不重叠的)。只是指出,因为有时对边的情况有不同的要求。对于位于三角形边上的矩形角(或与三角形角位于同一位置的矩形角),可以将点条件更改为:
if(Vector2.Dot(normal,corner-pointB)但是,对于矩形边上的三角形角,我们必须使用矩形线段通过相同的钻孔来运行三角形角,就像我们对三角形线段执行矩形角一样…很好。如果OP需要该标准,我愿意添加该功能。这正是我需要的。比ks.:)