使用给定角度在点(x,y)的边界内绘制一条线

时间:2017-10-16 07:36:31

标签: javascript math canvas trigonometry angle

我想在JavaScript画布上画一条线。我有两个点A和B(如图所示)。

Points A and B

我使用此代码查找这两点之间的角度:

// p1 is point A and p2 is point B    
var theta = Math.atan2(p2.y - p1.y, p2.x - p1.x);

现在我想从A点到画布的末尾画一条线,我也想得到线的终点(图中的C点)。

enter image description here

可以使用画布的角度和大小(宽度和高度)来实现吗?

2 个答案:

答案 0 :(得分:0)

你的例子计算极角(不是两点之间的角度 - 这是不可能的)。要计算扩展线接触画布的位置,计算P1和画布底部之间的Y差值(dY),请使用角度的atan来计算dX。如果P1.x + dX小于画布宽度,则该行在cut.X = P1.x + dX处击中底部。如果它更大,它会击中右侧。要获得Y值所在的位置,可以考虑一个小的三角形,由画布右侧部分形成的点,在延伸线切割右侧的点和线将切割(水平延伸)底部的点画布。 Y部分被剪切.X -canvas.width * atan(90度角)。

可能你必须确定扩展线的扩展方向。

更简单的解决方案: 由于JavaScript会自动在画布边框处绘制剪辑,因此您可以将线条延长很长(即按画布对角线长度的大小)并完成。

答案 1 :(得分:0)

可以在没有三角函数的情况下解决此问题。首先构造给定AB射线的参数表示:

 x = A.X + dx * t
 y = A.Y + dy * t
   where
 dx = B.X - A.X
 dy = B.Y - A.Y

检查首先与哪个边相交(t值较小):

//potential border positions    
if dx > 0 then
   ex = width
else
   ex = 0

if dy > 0 then
   ey = height
else
   ey = 0

//check for horizontal/vertical lines 
if dx = 0 then
    return cx = A.X,  cy = ey

if dy = 0 then
    return cy = A.Y,  cx = ex


//in general case find parameters of intersection with horizontal and vertical edge
tx = (ex - A.X) / dx
ty = (ey - A.Y) / dy

//and get intersection for smaller parameter value
if tx <= ty then
   cx = ex
   cy = A.Y + tx * dy
else
   cy = ey
   cx = A.X + ty * dx

return cx, cy

宽度= 400,高度= 300,固定A点和各种B点的结果:

100:100 - 150:100   400: 100
100:100 - 150:150   300: 300
100:100 - 100:150   100: 300
100:100 - 50:150     0: 200
100:100 - 50:100     0: 100
100:100 - 50:50     0:   0
100:100 - 100:50   100:   0
100:100 - 150:50   200:   0