基于起始坐标和预定义角度在javascript中获取结束线坐标

基于起始坐标和预定义角度在javascript中获取结束线坐标,javascript,math,svg,coordinates,angle,Javascript,Math,Svg,Coordinates,Angle,我有一个问题,每次单击时都会绘制SVG线,我需要做的是只绘制水平/垂直线(90度)或45度。线路。 我已经解决的水平/垂直问题,我被卡住的地方是45度。线,如果我知道以下信息:StartCordx,StartCordy,endCoordX,endCoordY,angle(正45度或负-45度)。基本上我只需要调整End坐标,使它们与起始坐标形成一条+-45度的角度线。 到目前为止,我正在计算两点之间的角度,如下所示: angle(startx, starty, endx, endy) {

我有一个问题,每次单击时都会绘制SVG线,我需要做的是只绘制水平/垂直线(90度)或45度。线路。 我已经解决的水平/垂直问题,我被卡住的地方是45度。线,如果我知道以下信息:StartCordx,StartCordy,endCoordX,endCoordY,angle(正45度或负-45度)。基本上我只需要调整End坐标,使它们与起始坐标形成一条+-45度的角度线。 到目前为止,我正在计算两点之间的角度,如下所示:

angle(startx, starty, endx, endy) {
        var dy = endy - starty;
        var dx = endx - startx;
        var theta = Math.atan2(dy, dx); // range (-PI, PI]
        theta *= 180 / Math.PI; // rads to degs, range (-180, 180]
        //if (theta < 0) theta = 360 + theta; // range [0, 360)
        return Math.abs(theta) > 90 ? theta % 90 : theta;
}
角度(startx、starty、endx、endy){
var dy=endy-starty;
var dx=endx-startx;
var theta=Math.atan2(dy,dx);//范围(-PI,PI]
θ*=180/Math.PI;//rads到degs,范围(-180,180]
//如果(θ<0)θ=360+θ;//范围[0360)
返回数学.abs(θ)>90?θ%90:θ;
}
我需要另一个函数,它将返回结束的X和Y坐标,以便绘制线…

请参见以下答案:

有了它,你可以用45作为第四个参数,即:

const pos = polarToCartesian(startx, starty, radius, 45)
这要求您知道要绘制的半径。也可以从函数中获取,如:

angle(startx, starty, endx, endy) {
        const dy = endy - starty;
        const dx = endx - startx;
        const radius = Math.sqrt(dy**2 + dx**2);
        const pos = polarToCartesian(startx, starty, radius, 45);
        let theta = Math.atan2(dy, dx); // range (-PI, PI]
        theta *= 180 / Math.PI; // rads to degs, range (-180, 180]
        //if (theta < 0) theta = 360 + theta; // range [0, 360)
        return Math.abs(theta) > 90 ? theta % 90 : theta;
}
角度(startx、starty、endx、endy){
常数dy=endy-starty;
常数dx=endx-startx;
常数半径=数学sqrt(dy**2+dx**2);
const pos=极笛卡尔坐标(startx,starty,半径,45);
设θ=Math.atan2(dy,dx);//范围(-PI,PI]
θ*=180/Math.PI;//rads到degs,范围(-180,180]
//如果(θ<0)θ=360+θ;//范围[0360)
返回数学.abs(θ)>90?θ%90:θ;
}
重要的行是
const radius=Math.sqrt(dy**2+dx**2);
后接
const pos=polarToCartesian(startx,starty,radius,45)

我假设你想改变你的最终返回值,检查当前θ是否接近45,而不是0或90?,如果是这样,画一条45度线


有任何问题,或者如果我对你的目标理解不正确,请告诉我。

画一条水平(或垂直)线,并对其应用旋转(45)变换可能吗?好主意,我将再次需要对线的长度进行某种投影,但听起来很有希望
angle(startx, starty, endx, endy) {
        const dy = endy - starty;
        const dx = endx - startx;
        const radius = Math.sqrt(dy**2 + dx**2);
        const pos = polarToCartesian(startx, starty, radius, 45);
        let theta = Math.atan2(dy, dx); // range (-PI, PI]
        theta *= 180 / Math.PI; // rads to degs, range (-180, 180]
        //if (theta < 0) theta = 360 + theta; // range [0, 360)
        return Math.abs(theta) > 90 ? theta % 90 : theta;
}