如何判断一个点在一个矩形里边,一直点和矩形的坐标点位置。
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. 原理
这个问题的算法思路挺简单的。分成两步来判断:
- 判断线段的两个端点是否在矩形内,如果两个端点至少有一个在矩形内,说明线段与矩形相交。
- 如果两个端点都不在矩形内,那么需要再判断线段是否与矩形的对角线是否相交。因为两个端点都不在矩形内的线段有可能会切割矩形的角,这时会与矩形的对角线相交。
那么关键就在于两个子算法:判断点在矩形内和判断线段相交。判断点在矩形内非常简单,就是比较点是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。
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. 参考
以上是关于如何判断一个点在一个矩形里边,一直点和矩形的坐标点位置。的主要内容,如果未能解决你的问题,请参考以下文章