簡體   English   中英

找到一個點位於沿對角線分割的矩形內的哪個扇區

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

我有一個程序,它需要一個 function,它根據 x 和 y 輸入返回一個 int (0 - 3)。 返回 int 應該基於該點位於已沿對角線切割的矩形內部的“扇區”。 在此處輸入圖像描述

這是我當前的代碼

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.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM