【问题标题】:Point inside rectangle given sides and center点在给定边和中心的矩形内
【发布时间】:2017-12-09 08:53:31
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 3/2 == 1 使用 long,而不是 1.5,尝试使用 double(和 %lf
  • @RingØ OP 的代码中没有浮点除法
  • 它是 C/C++。谢谢环我会试试的
  • 这里面几乎没有C++,几乎只有C。去掉scanf,改用std::cin
  • @ChristianHackl.:是的,我会说同样的话。你有没有看过他们写的代码——我的意思是更不用说可读性了——那些只是检查算法的意义。并且所有 c++ 编码器都添加了标题bits/stdc++.h。然后他们总是得到一个快乐的路径输入——所以不需要错误检查。这与编写一个好的软件或防弹代码完全不同。你说的对。

标签: c++ geometry rectangles


【解决方案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 是矩形检查,

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

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

【讨论】:

  • 我不确定这是否会让我的生活更轻松。我只知道矩形的中心和它的边长。我不确定如何用这些数据来实现它。
  • @ĐumićBranislav.: 但是如果有一个中心和两个边长,你可以有多个矩形。你如何确定它是哪个矩形?
  • 多个是什么意思?是一个长方形。中心是对角线交点。
  • @ĐumićBranislav.;如果我错了,请纠正我,但你总是可以得到具有相同对角线交点的不同矩形。这样想,你已经决定了一组相交的对角线。现在将对角线旋转 30 度并连接边。您将得到另一个具有相同边长和对角线交点的矩形。
  • 矩形平行于 x 和 y 轴。它也有 2 h 和 2 w 边。平行边的长度相同。这不就是矩形吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2021-05-10
  • 2017-06-13
相关资源
最近更新 更多