如何解决查找点位于矩形对角线分割的矩形内的哪个扇区
我有一个程序,该程序需要一个函数,该函数根据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,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。