计算坐标的问题,我数据太差计算不出来求帮助

已知两个点(x1,y1)(x2,y2), 求出这个射线为指定值的一个点;
是我没有说清楚,我是已知两个点startPoint、endPoint, 然后求一个计算距离startPoint距离为distance的点,且此点在startPoint->endPoint上,当超出endPoint取endPoint

interface IPoint {
    x: number;
    y: number;
}
function getExpectPoint(startPoint: IPoint, endPoint: IPoint, distance: number = 50) {
    let y = endPoint.y - startPoint.y;
    let x = endPoint.x - startPoint.x;
    if (x === 0) {
        if(startPoint.y > endPoint.y) {
            return { x: endPoint.x, y: startPoint.y - distance };
        }
        return { x: endPoint.x, y: startPoint.y + distance };
    }
    if(y === 0) {
        if(startPoint.x > endPoint.x) {
            return { x: endPoint.x - distance, y: startPoint.y }
        }
        return { x: endPoint.x + distance, y: startPoint.y }
    }
    const result = Math.atan(y / x);
    const cos = Math.cos(result) * distance;
    const sin = Math.sin(result) * distance;
    let point = { x: 0, y: 0 };
    if (x > 0 && y > 0) {
        point = { x: startPoint.x + cos, y: startPoint.y + sin }
    }
    if (x < 0 && y > 0) {
        point = { x: startPoint.x - cos, y: startPoint.y - sin }
    }
    if (x > 0 && y < 0) {
        point = { x: startPoint.x + cos, y: startPoint.y + sin }
    }
    if (x < 0 && y < 0) {
        return { x: startPoint.x - cos, y: startPoint.y - sin }
    }
    const len = (point.x - startPoint.x)**2 + (point.y - startPoint.y)**2;
    const originLen = (endPoint.x - startPoint.x)**2 + (endPoint.y - startPoint.y)**2;
    if(len >= originLen) {
        return endPoint;
    }
    return point;
}

image.png
就是为了计算方块下面的原点绘制的距离(已完成了)
image.png

阅读 2.6k
3 个回答
✓ 已被采纳新手上路,请多包涵
function getExpectPoint(startPoint: IPoint, endPoint: IPoint, distance: number = 50) {
    let y = endPoint.y - startPoint.y;
    let x = endPoint.x - startPoint.x;
    if (x === 0) {
        return { x: endPoint.x, y: startPoint.y + distance }
    }
    if(y === 0) {
        return { x: endPoint.x + distance, y: startPoint.y }
    }
    const result = Math.atan(y / x);
    let cos = Math.cos(result) * distance;
    let sin = Math.sin(result) * distance;
    let point = { x: 0, y: 0 };
    if (x > 0 && y > 0) {
        point = { x: startPoint.x + cos, y: startPoint.y + sin }
    }
    if (x < 0 && y > 0) {
        point = { x: startPoint.x - cos, y: startPoint.y - sin }
    }
    if (x > 0 && y < 0) {
        point = { x: startPoint.x + cos, y: startPoint.y + sin }
    }
    if (x < 0 && y < 0) {
        return { x: startPoint.x - cos, y: startPoint.y - sin }
    }
    let len = (point.x - startPoint.x)**2 + (point.y - startPoint.y)**2;
    let originLen = (endPoint.x - startPoint.x)**2 + (endPoint.y - startPoint.y)**2;
    if(len >= originLen) {
        return endPoint;
    }
    return point;
}

两点成线,然后可以无线延长,给定任意x或y,求出在线上一点?

p1 = {x:1,y:1};
p2 = {x:2,y:2};
getP = ({x,y})=>{
    if(x!=undefined){
        return [x,(x-p1.x)*(p1.y-p2.y)/(p1.x-p2.x)+p1.y]
    }
}
console.log(getP({x:3}),getP({x:4}))

image.png

解法在下面,你自己补一下传y的

https://zhidao.baidu.com/ques...

image.png

image.png

在平面正交坐标系中,已知不重合的两点,一定能由这两点确定一个直线方程。得出这样的方程后,就可以确定直线上任意电啦。

需要注意的是对于确定的直线,可能存在x受限(对应直线上的点集为(x0,y),即直线x=x0)或者y受限(对应直线上的点集为(x,y0),即直线y=y0)

此外的,才能由(x-x1)/(x1-x2)=(y-y1)/(y1-y2),作为直线方程,在该方程下,

x=(x1-x2)(y-y1)/(y1-y2)+x1
y=(x-x1)(y1-y2)/(x1-x2)+y1

这样分别在根据yx或者根据xy

所以整个要求可以转换为:

  1. 得出直线方程
  2. 在直线上(依据得出的直线方程)进行根据xy或者根据yx
    2.1. 判断x或者y 是否可能在直线上,对不存在的给出提示
    2.2. 对点在直线上的,依据直线方程得出点的坐标
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题