如何判断一个点在一个矩形里边,一直点和矩形的坐标点位置。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断一个点在一个矩形里边,一直点和矩形的坐标点位置。相关的知识,希望对你有一定的参考价值。

参考技术A 设矩形的左上角的点坐标为(x1, y1),右下角的点坐标为(x2,y2),需要判断的点坐标为(x0, y0).
判断点(x0, y0)是否在矩形内,只需要做如下判断:
if(x0 > x1 && x0 < x2 && y0 > y1 && y0 < y2)

// 满足,则表示点在矩形范围内
追问

在直角坐标系中,如果矩形是斜着放呢,那这个语句是那这个语句是不严密的,你可以画着试试,有一部分区域是不能判断的,请你考虑一下,再帮我回答一下,谢谢。

追答

恩,对于这个问题,我现在能想到的就是根据四个点的坐标,计算出四条直线的直线方程。然后依次与你计算出来的直线方程进行比较,这样就能判断是否在矩形内了。这个逻辑不复杂,代码页不多,你可以试着写一下。如果你不会的话,等我有空了,帮你写一个吧!

追问

那有空你帮我写一下吧,谢谢,我完了给你加分。

追答

#include

typedef struct

float x;
float y;
Point;

typedef struct

float nK;
float nB;
LineF;

void LineFound(Point s1, Point s2, LineF *pLineF)

if(s1.x == s2.x)
pLineF->nK = 0;

else
pLineF->nK = (s1.y - s2.y) / (s1.x - s2.x);


pLineF->nB = s1.y - pLineF->nK * s1.x;


LineF sLineF[4];

float jisuan(Point s, LineF sLineF)

return sLineF.nK * s.x + sLineF.nB;


int Cmp(Point s)

if( ((s.y >= jisuan(s, sLineF[0]) && s.y = jisuan(s, sLineF[2])))
&&((s.y >= jisuan(s, sLineF[1]) && s.y = jisuan(s, sLineF[3]))) )

return 1;

return 0;


void main()

Point sPoint[4];
Point sInput;
int i;
printf("请先按照顺时针的顺序输入四边形的四个点的坐标!\n");
for(i = 0; i < 4; i++)
printf("请先输入矩形的第%d个点的坐标!\n", i);
printf("X = ");
scanf("%f", &sPoint[i].x);
printf("Y = ");
scanf("%f", &sPoint[i].y);

for(i = 0; i < 4; i++)
LineFound(sPoint[i], sPoint[i + 1], &sLineF[i]);

printf("输入要判断的点!\nX = ");
scanf("%f", &sInput.x);
printf("Y = ");
scanf("%f", &sInput.y);
if(Cmp(sInput) == 1)
printf("点(%f, %f)在四边形内\n", sInput.x, sInput.y);

else
printf("点(%f, %f)不在四边形内\n", sInput.x, sInput.y);


getchar();
scanf("%d", &i);


我没仔细测试,你试试吧!

本回答被提问者采纳

平面中判断线段与矩形是否相交

1. 原理

这个问题的算法思路挺简单的。分成两步来判断:

  1. 判断线段的两个端点是否在矩形内,如果两个端点至少有一个在矩形内,说明线段与矩形相交。
  2. 如果两个端点都不在矩形内,那么需要再判断线段是否与矩形的对角线是否相交。因为两个端点都不在矩形内的线段有可能会切割矩形的角,这时会与矩形的对角线相交。

那么关键就在于两个子算法:判断点在矩形内和判断线段相交。判断点在矩形内非常简单,就是比较点是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。

2. 实现

关键的C++实现代码如下:

//空间直线
template <class T>
class LineSegment
{
public:
    Vec3<T> startPoint;
    Vec3<T> endPoint;
    Vec3<T> direction;

    Vec3<T> min;
    Vec3<T> max;

    LineSegment()
    {
    }

    LineSegment(Vec3<T> start, Vec3<T> end)
    {
        startPoint = start;
        endPoint = end;
        direction = end - start;      
    }

    inline void Set(Vec3<T> start, Vec3<T> end)
    {
        startPoint = start;
        endPoint = end;
        direction = end - start;      
    }

    //两条线段相交
    inline static bool Intersection2D(LineSegment & line1, LineSegment & line2, Vec3<T>& insPoint)
    {
        double D = -line1.direction.x() * line2.direction.y() + line1.direction.y() * line2.direction.x();
        if(D == 0.0)
        {
            return false;
        }

        auto O12 = line2.startPoint - line1.startPoint;
        T D1 = -O12.x() * line2.direction.y() + O12.y() * line2.direction.x();
        T D2 = line1.direction.x() * O12.y() - line1.direction.y() * O12.x();

        T t1 = D1 / D;
        if(t1<0 || t1 > 1)
        {
            return false;
        }

        T t2 = D2 / D;
        if(t2<0 || t2 > 1)
        {
            return false;
        }

        insPoint = line1.startPoint + line1.direction * t1;     //这样计算得到的Z值是不准确的

        return true;
    }

    //线段与矩形相交
    inline bool static IsIntersectsOrthogon2D(LineSegment & line, Orthogon<T> orthogon)
    {
        if (orthogon.IsContainsPoint(line.startPoint.x(), line.startPoint.y()) ||
                orthogon.IsContainsPoint(line.endPoint.x(), line.endPoint.y()))
        {
            return true;
        }

        LineSegment diagonal1(Vec3<T>(orthogon.minX(), orthogon.minY(), 0),
                              Vec3<T>(orthogon.maxX(), orthogon.maxY(), 0));
        LineSegment diagonal2(Vec3<T>(orthogon.minX(), orthogon.maxY(), 0),
                              Vec3<T>(orthogon.maxX(), orthogon.minY(), 0));

        Vec3<T> point(0,0,0);
        return Intersection2D(line, diagonal1, point) || Intersection2D(line, diagonal2, point);
    }
};

3. 参考

  1. 如何判断一条线段和一个矩形或者圆相交? - 叶飞影的回答 - 知乎

以上是关于如何判断一个点在一个矩形里边,一直点和矩形的坐标点位置。的主要内容,如果未能解决你的问题,请参考以下文章

如何判断一个点在旋转后的矩形中

平面坐标系中 如何判断某一点在一矩形区域内?

急急!!! 输入四组坐标判断是不是组成为矩形 C++

如何判断一个点在矩形范围内 unity

计算几何

平面中判断线段与矩形是否相交