简体   繁体   English

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

[英]Find which sector a point lies in inside a rectangle split along it's diagonals

I have a program, which needs a function that returns an int (0 - 3) based on an x and y input.我有一个程序,它需要一个 function,它根据 x 和 y 输入返回一个 int (0 - 3)。 The return int should be based on the 'sector' that the point lies inside of a rectangle that has been cut on its diagonals.返回 int 应该基于该点位于已沿对角线切割的矩形内部的“扇区”。 在此处输入图像描述

This is my current code这是我当前的代码

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

This is giving almost random results, which are not correct.这给出了几乎随机的结果,这是不正确的。 What do I need to fix?我需要修复什么?

One diagonal (from 0,0) has equation一条对角线(从 0,0 开始)有等式

y * w - x * h = 0

Another diagonal has equation另一个对角线有方程

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

Substitution of point x,y into these equations gives quadrant (result sign tells us at what side of diagonal point does lie).将点 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;
};

For your example gives 3 0 2 0 - note that your supposition about (0.75, 0.1, 1, 2) << std::endl; //should return 1,对于您的示例给出 3 0 2 0 - 请注意您关于(0.75, 0.1, 1, 2) << std::endl; //should return 1,的假设(0.75, 0.1, 1, 2) << std::endl; //should return 1, is wrong, 0 is correct result (0.75, 0.1, 1, 2) << std::endl; //should return 1,是错误的,0是正确的结果

and clear examples:和明确的例子:

 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM