JPanel坐标象限判断异常:点的左右上下区域识别问题求助
问题分析与解决方案
首先,你的代码核心问题出在整数除法导致的斜率精度丢失,这直接让"LEFT"分支从未被触发,同时可能伴随坐标系与区域判断的匹配偏差。
核心问题拆解
整数除法的精度截断:
你用int m = destHeight/destWidth;做整数除法,当destHeight和destWidth不是整数倍关系时,斜率会被强行截断(比如高5宽2,实际斜率是2.5,但整数除法只会得到2)。错误的斜率会让两条对角线的计算完全偏离预期,导致区域判断逻辑彻底失效。逻辑触发条件失效:
从你提到的仅在TOP和BOTTOM间切换的现象来看,错误的斜率让"LEFT"的触发条件永远无法满足——相当于两条对角线的位置被扭曲,把LEFT区域的所有点都归到了BOTTOM或其他区域。
修正后的代码
Point A = t.src; // 源点 Point B = t.dest; // 目标矩形的中心点 int destHeight = t.destDim.height; int destWidth = t.destDim.width; // 改用浮点数计算斜率,避免整数截断导致的精度丢失 double m = (double) destHeight / destWidth; // 基于矩形中心点计算两条对角线延长线的截距 double b = B.y - m * B.x; // 左下→右上的对角线延长线:y = m*x + b double d = B.y + m * B.x; // 左上→右下的对角线延长线:y = -m*x + d if (A.y >= m * A.x + b) { // 点在左下-右上对角线的上方(对应y值更大的一侧,即屏幕坐标系的下方方向) if (A.y >= -m * A.x + d) { System.err.println("2 - Source on BOTTOM"); } else { // 落入左上-右下对角线的下方,触发LEFT分支 System.err.println("2 - Source on LEFT"); } } else { // 点在左下-右上对角线的下方(对应y值更小的一侧,即屏幕坐标系的上方方向) if (A.y >= -m * A.x + d) { System.err.println("2 - Source on RIGHT"); } else { System.err.println("2 - Source on TOP"); } }
关键修正说明
- 浮点数斜率计算:将
m改为double类型,并强制转换为浮点数除法,保证斜率的精确性,这是让LEFT分支正常触发的核心。 - 保持逻辑结构:原有判断逻辑的框架是正确的,仅修正了斜率精度问题,就能让四个区域的判断回归预期。
- 坐标系适配:如果你的坐标系是数学坐标系(y轴向上),只需要把判断中的
>=替换为<=即可,根据实际场景微调。
快速测试建议
可以用明确的测试点验证:
假设矩形中心B(100,100),宽40,高60,那么m=1.5。取点A(50,150):代入计算,150 >= 1.5*50 -50 =25成立,150 >= -1.5*50 +250=175不成立,此时应该输出"LEFT",可以快速验证修正效果。
内容的提问来源于stack exchange,提问作者Michele Fattoruso
相关产品推荐
相关产品推荐

