c++ - 找出一个点位于沿对角线分割的矩形内的哪个扇区

标签 c++ geometry rectangles

我有一个程序,它需要一个基于 x 和 y 输入返回 int (0 - 3) 的函数。返回 int 应该基于该点位于已沿对角线切割的矩形内部的“扇区”。 enter image description here

这是我当前的代码

int liesIn(double x, double y, double w, double h){
    //x and y are relitive, so the top left corner can be thought of as the origin (0,0)
    double rectAspect = w / h;
    double pointAspect = x / y;
    if(rectAspect > pointAspect)//top of the topLeft-BottomRight line
    {
        if(y > x * rectAspect)
        {
            return 3;
        }else if(y < x * rectAspect){
            return 0;
        }
        return 4;
    }else if(rectAspect < pointAspect)
    {
        if(y > x * rectAspect)
        {
            return 2;
        }else if(y < x * rectAspect){
            return 1;
        }
        return 4;
    }else{
        return 4;//4 is the "false" condition, if the point lies on one of the 
    }
};

    std::cout << liesIn(0.25, 0.5, 1, 1) << std::endl; //should return 3, returns 3
    std::cout << liesIn(0.75, 0.1, 1, 2) << std::endl; //should return 1, returns 1
    std::cout << liesIn(0.5, 0.75, 1, 1) << std::endl; //should return 2, returns 3
    std::cout << liesIn(0.5, 0.25, 1, 1) << std::endl; //should return 0, returns 1

这给出了几乎随机的结果,这是不正确的。我需要修复什么?

最佳答案

一条对角线(从 0,0 开始)有方程

y * w - x * h = 0

另一条对角线有方程

y * w + x * h - h * w = 0

将点 x,y 代入这些方程得出象限(结果符号告诉我们点位于对角线的哪一侧)。

int liesIn(double x, double y, double w, double h){

    if (y < 0 ||  y >= h || x < 0 || x >= w)
        return 5;  //outside result if needed

    if (y * w - x * h == 0 ||  y * w + x * h  - h * w  == 0)
        return 4;  //lies on diagonal 
                   //note possible issues due to float precision limitations
                   //better to compare fabs() with small epsylon value 

    int code = 0;

    if (y * w + x * h  - h * w > 0)
        code += 1;  //above second diagonal

    if (y * w - x * h > 0) {
        code += 2;    //above main diagonal
        code = 5 - code;    //flip 2/3 values to get your numbering
    }
    return code;
};

对于您的示例,给出 3 0 2 0 - 请注意您关于 (0.75, 0.1, 1, 2) << std::endl; //should return 1, 的假设错误,0为正确结果

以及清晰的示例:

 liesIn(1, 0.2, 2, 1)      0
 liesIn(1.5, 0.5, 2, 1)    1 
 liesIn(1, 0.8, 2, 1)      2
 liesIn(0.5, 0.5, 2, 1)    3
 liesIn(1, 0.5, 2, 1)      4

关于c++ - 找出一个点位于沿对角线分割的矩形内的哪个扇区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63460249/

相关文章:

c++ - 使用状态机进行 Xml 解析

java - 简单的 Java 按钮显示一个圆圈

java - 实现类,等腰三角形

java - 检查一个点是否在指定的矩形内

c++ - 我想创建一个函数来读取输入的每一行并生成其总和并使用 C++ 将其保存为 sum.txt

c++ - 标记粘贴运算符 (##) 正在占用我的 C++ 宏中的空格

c++ - 在 Designer 的 Qt 5 中隐藏/显示 DockWidgets

r - 在椭圆和矩形内生成数据

html - 在下拉菜单选项中添加 CSS 矩形

c# - 为 Canvas 上重叠的矩形触发 MouseDown 事件