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
为线与Ox和Oy相交的值。我们要计算这些值。我们现在有一个有两个未知变量(x2和y2)的系统: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。例如,将更好地处理垂直线的情况,其中y=a*x+b将严重失效x(t)=cos(Q)*t+x0来表示x和y参数,那么问题就更容易、更稳健了;y(t)=sin(Q)*t+y0