Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取平面中直线交点的坐标_Javascript_Algorithm - Fatal编程技术网

Javascript 获取平面中直线交点的坐标

Javascript 获取平面中直线交点的坐标,javascript,algorithm,Javascript,Algorithm,我有一个带有以下参数的画布: 宽度=400,高度=400 并且有一条线以Q(度)的角度穿过点光标[x1,y1] 我需要得到平面上直线交点的所有坐标,并将其写入数组。现在我使用这个方程:y-y1=k*(x-x1) 要检查所有点,我使用以下代码: var rad=Q*Math.PI/180 for (ctrY = 0; ctrY < 400; ctrY += 1) { for (ctrX = 0; ctrX < 400; ctrX += 1) { if ( (c

我有一个带有以下参数的画布:
宽度=400
高度=400

并且有一条线以
Q
(度)的角度穿过点
光标[x1,y1]

我需要得到平面上直线交点的所有坐标,并将其写入数组。现在我使用这个方程:
y-y1=k*(x-x1)

要检查所有点,我使用以下代码:

var rad=Q*Math.PI/180

for (ctrY = 0; ctrY < 400; ctrY += 1) {
    for (ctrX = 0; ctrX < 400; ctrX += 1) {

        if ( (ctrY - cursor.y) ===
              ~~(Math.tan(rad) * (ctrX - cursor.x)) ) {

            z.push([ctrX, ctrY]);
        }

    }
}
for(ctrY=0;ctrY<400;ctrY+=1){
对于(ctrX=0;ctrX<400;ctrX+=1){
如果((ctrY-cursor.y)===
~~(Math.tan(rad)*(ctrX-cursor.x))){
z、 推送([ctrX,ctrY]);
}
}
}
例如,当0 我错在哪里?也许有更方便的算法


顺便说一句,对不起我的英语

我想象一个这样的算法。(仅考虑0<q<90)。首先,我想计算线与Ox和Oy轴相交的点,考虑原点(0,0)位于左上角,如果我们假设负x和y值分别位于该点的左侧和顶部。设
x2
y2
为线与Ox和Oy相交的值。我们要计算这些值。我们现在有一个有两个未知变量(x2和y2)的系统:
Math.tan(rad)=(y1-y2)/x1
Math.tan(rad)=y1/(x1-x2)
。我们可以通过在坐标系上画一条线并稍加分析来推导这些方程。如果我们解方程组,我们会发现这样的东西:
x2=(x1*y1-x1*x1*Math.tan(rad)/(2*y1-x1))
y2=y1-x1*Math.tan(rad)
(这些需要验证,我没有仔细检查我的演算)。线性方程可以通过公式
y=A*x+b
来定义,在我们的例子中
A=x2
b=y2
。然后我们可以这样计算点:

for (xIdx = 0; xIdx < 400; xIdx += 1) {
    var ctrX = xIdx;
    var ctrY = x2 * ctrX + y2 //todo: replace with the respective calculated variables x2 and y2(we could also define two functions in js) and proper rounding
    z.push([ctrX, ctrY]);
}
for(xIdx=0;xIdx<400;xIdx+=1){
var-ctrX=xIdx;
var ctrY=x2*ctrX+y2//todo:替换为相应的计算变量x2和y2(我们也可以在js中定义两个函数),并进行适当的舍入
z、 推送([ctrX,ctrY]);
}

我不确定我是否100%准确,但我希望你理解我的想法。

似乎你需要线光栅算法。考虑一下,


您还可以查看DDA算法

直线与坐标平面的交点。哪些点位于400*400的平面上。如果直线位于该平面内,则它不能与该平面相交。但也许我理解了你的需要,并给出了答案。如果你用另一个var
x(t)=cos(Q)*t+x0来表示x和y参数,那么问题就更容易、更稳健了;y(t)=sin(Q)*t+y0
。例如,将更好地处理垂直线的情况,其中y=a*x+b将严重失效