如何计算旧矩形内点在新矩形中的对应位置?
计算旧矩形内点在新矩形中的对应相对位置问题
问题场景
我有三类坐标数据:旧矩形rectangleOld、新矩形rectangleNew以及旧矩形内的点pointIntoRectangleOld,具体数据如下:
rectangleOld = [ [-23374.69715123405, 6706811.7857385], [-23516.832747730223, 6706811.7857385], [-23516.832747730223, 6706948.18295946], [-23374.69715123405, 6706948.18295946], [-23374.69715123405, 6706811.7857385] ]; pointIntoRectangleOld = [-23440.522912441458,6706879.939226517]; rectangleNew = [ [-22869.755094112752, 6706693.921604385], [-23011.890690608925, 6706693.921604385], [-23011.890690608925, 6706830.318825345], [-22869.755094112752, 6706830.318825345], [-22869.755094112752, 6706693.921604385], ]
我需要计算该点在新矩形中对应的位置,使其与在旧矩形中的相对位置完全一致。我用Java开发,尝试了以下代码但没成功:
double lat1=Double.parseDouble(coordinateOldx); double lat2=Double.parseDouble(plantPosX); double xPosPlant=lat1-lat2; double long1=Double.parseDouble(coordinateOldy); double long2=Double.parseDouble(plantPosY); double yPosPlant=long1-long2; System.out.println(xPosPlant); System.out.println(yPosPlant); double latnew=Double.parseDouble(coordinateNewx); latnew=latnew + xPosPlant; double longNew=Double.parseDouble(coordinateNewy); longNew=longNew + yPosPlant;
latNew和longNew应该是目标点的x/y坐标,但这种基于单个顶点的偏移计算方式无效。
解决方案
核心逻辑是计算点在旧矩形内的相对比例,再将该比例映射到新矩形的边界上,具体步骤如下:
1. 确定旧矩形的边界范围
先提取旧矩形的x、y轴极值:
- x轴:最小值
oldMinX = -23516.832747730223,最大值oldMaxX = -23374.69715123405 - y轴:最小值
oldMinY = 6706811.7857385,最大值oldMaxY = 6706948.18295946
2. 计算点在旧矩形内的相对比例
分别计算x、y方向上的比例值(范围0~1,0对应边界最小值,1对应边界最大值):
// 旧点坐标 double oldPointX = -23440.522912441458; double oldPointY = 6706879.939226517; // 旧矩形边界 double oldMinX = -23516.832747730223; double oldMaxX = -23374.69715123405; double oldMinY = 6706811.7857385; double oldMaxY = 6706948.18295946; // 计算相对比例 double xRatio = (oldPointX - oldMinX) / (oldMaxX - oldMinX); double yRatio = (oldPointY - oldMinY) / (oldMaxY - oldMinY);
3. 确定新矩形的边界范围
同理提取新矩形的x、y轴极值:
- x轴:最小值
newMinX = -23011.890690608925,最大值newMaxX = -22869.755094112752 - y轴:最小值
newMinY = 6706693.921604385,最大值newMaxY = 6706830.318825345
4. 映射得到新点坐标
用新矩形的边界和计算出的相对比例,推导目标点坐标:
// 新矩形边界 double newMinX = -23011.890690608925; double newMaxX = -22869.755094112752; double newMinY = 6706693.921604385; double newMaxY = 6706830.318825345; // 计算新点坐标 double newPointX = newMinX + xRatio * (newMaxX - newMinX); double newPointY = newMinY + yRatio * (newMaxY - newMinY);
结果验证
代入数值计算可得:
- xRatio ≈ 0.537,yRatio = 0.5
- 新点坐标:
newPointX ≈ -22935.56,newPointY ≈ 6706762.12
该结果能保证点在新矩形中的相对位置与旧矩形完全一致。
内容的提问来源于stack exchange,提问作者DarioS
相关产品推荐
相关产品推荐

