js获取图片的坐标

废话不多说,上代码

	<img src="toImage.action" name="npcImg" id="npcImg" width="512" height="512" οnclick="vControl('GETMOUSEPOSINPIC',this)"/> 
下面是javascript部分
//点击图片 , 获取图片上对应的坐标,这个坐标y轴是反着的,应该是负y,但显示出来是正y
var JPos = {};
(function($){
$.$getAbsPos = function(p){
var _x = 0;
var _y = 0;
while(p.offsetParent){
_x += p.offsetLeft;
_y += p.offsetTop;
p = p.offsetParent;
}

_x += p.offsetLeft;
_y += p.offsetTop;

return {x:_x,y:_y};
};

$.$getMousePos = function(evt){
var _x,_y;
evt = evt || window.event;
if(evt.pageX || evt.pageY){
_x = evt.pageX;
_y = evt.pageY;
}else if(evt.clientX || evt.clientY){
_x = evt.clientX + document.body.scrollLeft - document.body.clientLeft;
_y = evt.clientY + document.body.scrollTop - document.body.clientTop;
}else{
return $.$getAbsPos(evt.target);

}
return {x:_x,y:_y};
}
})(JPos);


function vControl(pChoice){
switch(pChoice){
case "GETMOUSEPOSINPIC":
var mPos = JPos.$getMousePos();
var iPos = JPos.$getAbsPos(arguments[1]);
window.status = (mPos.x - iPos.x) + " " + (mPos.y - iPos.y);
alert(window.status);
window.location.href="convertToActualCoordinate.action?status="+window.status;
break;
}
}

注意:此时获取的坐标中y轴的正负号是反着的,具体的不记得了,貌似y轴一直是正的,但如果将图片左上角作为原点的话,y轴应该为负,所以以下double y取值的时候加了个负号

//根据前台图片显示坐标换算出实际坐标点
	@RequestMapping("/convertToActualCoordinate")
	public String convertToActualCoordinate(String status,Model model) {
		//TODO
		System.out.println("当前的坐标是:"+status);
		String[] coordinate = status.split(" ");
		double x = Double.parseDouble(coordinate[0]);
		double y = -Double.parseDouble(coordinate[1]);
		
		System.out.println("换算实际坐标前的x:"+x);
		System.out.println("换算实际坐标前的y:"+y);
		//slam发过来的地图大小像素是1024*1024,而网页显示的图片大小暂定是512*512,先转换成实际的地图大小
		System.out.println("width:"+width);
		System.out.println("height:"+height);
		float x1 =  (float) (width*x/512);
		float y1 =  (float) (height*y/512);
		//地图物理坐标与像素坐标变换 
		/*地图像素坐标以地图左上角端点为原点;物理坐标原点为地图中心点; 
		对于 1024*1024 的地图,地图中心点的像素坐标为(512,512),机器人在地图上物理坐标到像素坐标变
		换的解析为: 
		行:  512+x(m)/0.05  像素(pix) 
		列:  512-y(m)/0.05  像素(pix) 
		其中物理坐标(x,y)表示机器人的实际坐标,单位是  米(m)。 
		即:物理坐标(0,0.05)(米),地图上像素坐标为(512,513)(pix)。 */
		//现在换算的是物理坐标
		x1=(float) ((x1-width/2)*0.05);
		y1=(float) ((y1+height/2)*0.05);
		float yaw = (float) (y1/x1/3.14*180);
		System.out.println("换算成实际坐标后的x1:"+x1);
		System.out.println("换算成实际坐标后的y1:"+y1);
		System.out.println("换算成实际坐标后的yaw:"+yaw);
		model.addAttribute("x", x1);
		model.addAttribute("y", y1);
		model.addAttribute("yaw", yaw);
		return "WEB-INF/pages/SlamNavigation/SlamNavigation";
	}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是示例代码,其中假设图片id为"myImage",并且需要获取四个坐标点的id分别为"point1"、"point2"、"point3"、"point4": ```javascript // 获取图片坐标 const image = document.getElementById("myImage"); const imageRect = image.getBoundingClientRect(); const imageX = imageRect.x; const imageY = imageRect.y; // 获取四个坐标点的坐标 const point1 = document.getElementById("point1"); const point2 = document.getElementById("point2"); const point3 = document.getElementById("point3"); const point4 = document.getElementById("point4"); const point1Rect = point1.getBoundingClientRect(); const point2Rect = point2.getBoundingClientRect(); const point3Rect = point3.getBoundingClientRect(); const point4Rect = point4.getBoundingClientRect(); // 计算前两个坐标向量和后两个坐标向量的夹角 const vector1X = point2Rect.x - point1Rect.x; const vector1Y = point2Rect.y - point1Rect.y; const vector2X = point4Rect.x - point3Rect.x; const vector2Y = point4Rect.y - point3Rect.y; const dotProduct = vector1X * vector2X + vector1Y * vector2Y; const magnitude1 = Math.sqrt(vector1X * vector1X + vector1Y * vector1Y); const magnitude2 = Math.sqrt(vector2X * vector2X + vector2Y * vector2Y); const cosAngle = dotProduct / (magnitude1 * magnitude2); const angle = Math.acos(cosAngle) * 180 / Math.PI; // 保存坐标等操作 // ... ``` 需要注意的是,以上代码中计算夹角的方式是基于向量的点积计算,因此需要先计算出前两个坐标向量和后两个坐标向量,然后再进行计算。如果需要计算的是直接连线的夹角,则需要使用三角函数计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值