给定边和中心的矩形内的点
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
是矩形检查,
如果 AP
在 AB
上的投影长度大于零但小于 AB
的长度。检查 BC
和 BP
是否相同,并检查长度是否大于零且小于 BC
。
这两个条件确保您的点位于矩形内。
我得到了矩形的高度(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
是矩形检查,
如果 AP
在 AB
上的投影长度大于零但小于 AB
的长度。检查 BC
和 BP
是否相同,并检查长度是否大于零且小于 BC
。
这两个条件确保您的点位于矩形内。