我按照它的高度( 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");
}
提前致谢。
答案 0 :(得分:1)
矩形的边与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没有提到与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
。
这两个条件确保你的点位于矩形内。