给定边和中心的矩形内的点

Point inside rectangle given sides and center

我得到了矩形的高度(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");
}

提前致谢。

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是矩形检查,

如果 APAB 上的投影长度大于零但小于 AB 的长度。检查 BCBP 是否相同,并检查长度是否大于零且小于 BC

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