查找点位于矩形对角线分割的矩形内的哪个扇区

问题描述

我有一个程序,该程序需要一个函数,该函数根据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,2) << std::endl; //should return 1,returns 1
    std::cout << liesIn(0.5,0.75,1) << std::endl; //should return 2,returns 3
    std::cout << liesIn(0.5,0.25,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,1)    1 
 liesIn(1,0.8,1)      2
 liesIn(0.5,1)    3
 liesIn(1,1)      4

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...