指向侧边和中心的矩形内部

时间:2017-12-09 08:53:31

标签: c++ geometry rectangles

我按照它的高度( h )和宽度( w )给出了矩形,它的中心是 O(X0,Y0)。我需要计算给定点A(x,y)是否在该矩形内。它与x和y轴平行。所有价值观都是真实的。

我提出了以下测试,但出于某种原因,我测试代码的网站并不适用于所有示例。有人能指出我正确的方向。

#include <iostream>
#include <cmath>
using namespace std;
int main(){
    long x,y,x0,y0,r,h,w;
    scanf("%ld",&x);
    scanf("%ld",&y);
    scanf("%ld",&x0);
    scanf("%ld",&y0);
    scanf("%ld",&h);
    scanf("%ld",&w);
    if((x0+w/2.0>=x)&&(x0-w/2.0<=x)&&(y0+h/2.0>=y)&&(y0-h/2.0<=y))
        printf("inside a rectangle");
    else
        printf("outside a rectangle");
}

提前致谢。

1 个答案:

答案 0 :(得分:1)

OP的编辑后:

矩形的边与x轴和y轴平行。然后也可以得到坐标并应用下面提到的算法。

Centre -- (x0,y0)
A -- (x0-w/2,y0-h/2)
B -- (x0-w/2.y0+h/2)
C -- (x0+w/2,y0+h/2)
D -- (x0+w/2,y0-h/2)

所以你要做的就是应用下面提供的算法。

更简单地说,我们可以做到这一点,

if( 2*x <= 2*x0+w && 2*x >= 2*x0-w && 2*y <= 2*y0+h && 2*y >= 2*y0-h)
// it's inside

在OP编辑之前

你的逻辑错了。它可能会说矩形内部的一个点在它之外。 (对于任何矩形,这是错误的 - OP没有提到与x-y轴平行的边的条件)

对于矩形,有一种简单的方法和更简洁的方法。找到矩形的区域。

假设它是A

现在,如果点P位于ABCD内,那么

area of PAB+PBC+PCD+PDA = A

为了更好的事情,请执行此操作,

AB.Bc+BC.CD+CD.DA+DA.AB = 2*AB*BC

甚至更好地制作双方的正方形

LHS^2 = 4*AB^2*BC^2

现在你将繁殖并检查它。此解决方案的一个缺点是,side length的大值可能会溢出。

另一种方法是考虑预测。

如果点在矩形内部,那么矩形角的投影指向其两侧必须小于相应的边。您可以使用点积检查投影长度。

例如,如果P是点,ABCD是矩形检查,

如果AP上的AB投影长度大于零但小于AB的长度。使用BCBP检查相同内容,检查长度是否大于零且小于BC

这两个条件确保你的点位于矩形内。