JavaScript - 旋转基于 SVG 的线的角度
JavaScript - rotate SVG based line's angle
我在 Canvas 上画了线,想根据它的位置在线合并 svg 图像。如何找到画线起点和终点之间的角度?
编辑
此函数用于获取线的角度
public angleOfWall(p1,p2){
var angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;
return angleDeg;
}
var angleOfWall = this.angleOfWall(closestWall.getStart(), closestWall.getEnd());
找到角度后,我想合并img到上面
for (let i = 0; i < this.model.floorplan.items.length; i++) {
item = this.model.floorplan.items[i];
var hover = item===this.viewmodel.activeItem;
var itemWidth = item.width|32;
var itemHeight = item.height|32;
if (!item.el) {
item.el = document.createElement('img');
// draw door line on that position
item.el.src = this.model.floorplan.items[i].model_url_2d;
item.el.onload = (( /** image **/ ) => {
this.context.drawImage(item.el,
this.viewmodel.convertX(item.xpos * item.scale_x) - itemWidth/2.,
this.viewmodel.convertY(item.zpos * item.scale_z) - itemHeight/2.,
itemWidth, itemHeight);
}
.("model_url2d" 是 SVG 图像的 url )
private rotateSVG(rotateSVG) {
var innerArrow = document.getElementById("#add-items");
innerArrow.setAttribute("transform", rotateSVG);
}
跟随线旋转位置的方法正确吗?我只是 JS 方面的新手,所以需要一些帮助。谢谢
here What I have now
但想将 img 角度旋转为线的角度
重要提示:此答案解决了修订版 1 中的问题
这是我回答的问题内容:
"我在 Canvas 上画线,想根据它的位置在线上合并 svg 图像。如何找到画线起点和终点之间的角度?"
给定 2 个点 p1 和 p2,您可以使用 atan2 方法计算从 p1 到 p2 绘制的线的起点和终点之间的角度。
如果您将直线视为斜边,将 x (dx) 和 y (dy) 中的距离视为直角,则可以写成:let angle = Math.atan2(dy, dx);
。这将为您提供以弧度为单位的角度。如果你需要以度为单位的角度,你必须:let angleInDegrees = angle*180/Math.PI
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");
let cw = canvas.width = 300,
cx = cw / 2;
let ch = canvas.height = 300,
cy = ch / 2;
// given 2 points: p1 and p2
let p1 = {x:50, y:200},
p2= {x:200, y:50}
ctx.beginPath();
ctx.moveTo(p1.x, p1.y);
ctx.lineTo(p2.x, p2.y);
ctx.stroke();
//the distance in x & y between the 2 points
let dx = p2.x - p1.x;
let dy = p2.y - p1.y;
// the angle in radians
let angle = Math.atan2(dy, dx);
// the angle in degrees
console.log(angle*180/Math.PI)
canvas{border:1px solid #d9d9d9;}
<canvas></canvas>
希望对您有所帮助。
我在 Canvas 上画了线,想根据它的位置在线合并 svg 图像。如何找到画线起点和终点之间的角度?
编辑
此函数用于获取线的角度
public angleOfWall(p1,p2){
var angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;
return angleDeg;
}
var angleOfWall = this.angleOfWall(closestWall.getStart(), closestWall.getEnd());
找到角度后,我想合并img到上面
for (let i = 0; i < this.model.floorplan.items.length; i++) {
item = this.model.floorplan.items[i];
var hover = item===this.viewmodel.activeItem;
var itemWidth = item.width|32;
var itemHeight = item.height|32;
if (!item.el) {
item.el = document.createElement('img');
// draw door line on that position
item.el.src = this.model.floorplan.items[i].model_url_2d;
item.el.onload = (( /** image **/ ) => {
this.context.drawImage(item.el,
this.viewmodel.convertX(item.xpos * item.scale_x) - itemWidth/2.,
this.viewmodel.convertY(item.zpos * item.scale_z) - itemHeight/2.,
itemWidth, itemHeight);
} .("model_url2d" 是 SVG 图像的 url )
private rotateSVG(rotateSVG) {
var innerArrow = document.getElementById("#add-items");
innerArrow.setAttribute("transform", rotateSVG);
}
跟随线旋转位置的方法正确吗?我只是 JS 方面的新手,所以需要一些帮助。谢谢
here What I have now 但想将 img 角度旋转为线的角度
重要提示:此答案解决了修订版 1 中的问题 这是我回答的问题内容:
"我在 Canvas 上画线,想根据它的位置在线上合并 svg 图像。如何找到画线起点和终点之间的角度?"
给定 2 个点 p1 和 p2,您可以使用 atan2 方法计算从 p1 到 p2 绘制的线的起点和终点之间的角度。
如果您将直线视为斜边,将 x (dx) 和 y (dy) 中的距离视为直角,则可以写成:let angle = Math.atan2(dy, dx);
。这将为您提供以弧度为单位的角度。如果你需要以度为单位的角度,你必须:let angleInDegrees = angle*180/Math.PI
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");
let cw = canvas.width = 300,
cx = cw / 2;
let ch = canvas.height = 300,
cy = ch / 2;
// given 2 points: p1 and p2
let p1 = {x:50, y:200},
p2= {x:200, y:50}
ctx.beginPath();
ctx.moveTo(p1.x, p1.y);
ctx.lineTo(p2.x, p2.y);
ctx.stroke();
//the distance in x & y between the 2 points
let dx = p2.x - p1.x;
let dy = p2.y - p1.y;
// the angle in radians
let angle = Math.atan2(dy, dx);
// the angle in degrees
console.log(angle*180/Math.PI)
canvas{border:1px solid #d9d9d9;}
<canvas></canvas>
希望对您有所帮助。