2017-08-25 279 views
0

我在路径(x1,y1)和(x2,y2)上有2个点。两个点都有一个度数角度值(分别为a1和a2)。当它与相关的(x,y)值相交时,这些点与这些点相交的曲线必须与y轴形成的角度。例如,与点(x1,y1)和(x2,y2)相交的曲线必须具有在点(x1,y1)处的a1度的轨迹,并且还具有在点处的a2度的轨迹(x2,y2)。如何计算两点之间的平滑曲线,其中曲线的轨迹必须以两个给定角度开始和结束

我希望编写一个函数来找到符合上述场景的曲线,但不知道从哪里开始。任何帮助都将不胜感激。

+1

这是一个没有代码的数学问题,你试过了。 –

+1

[Bézier曲线](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) – ASDFGerte

+0

可以从直线段和圆弧中制作这样一条曲线,直线与它们的弧相切加入。 – dmuir

回答

0

您可以使用bezier创建您想要的曲线。控制点定义了起点和终点处的曲线切线。因此,要设置开始和结束的角度,只需将控制点定义为沿着角度。

数据

var x1 = ?; // in pixels 
var y1 = ?; 
var x2 = ? 
var y2 = ?; 
var ang1 = ?; // in radians 
var ang2 = ? 

获取线

var len = Math.hypot(x2-x1,y2-y1); 

的长度获取角度的矢量,并延伸到约1/3日len

var ax1 = Math.cos(ang1) * len * (1/3); 
var ay1 = Math.sin(ang1) * len * (1/3); 

var ax2 = Math.cos(ang2) * len * (1/3); 
var ay2 = Math.sin(ang2) * len * (1/3); 

然后画

ctx.beginPath(); 
ctx.moveTo(x1,y1); 
ctx.bezierCurveTo(
    x1 + ax1, y1 + ay1, 
    x2 - ax1, y2 - ay2, 
    x2, y2 
); 
ctx.stroke(); 

请注意,角度必须在大致相同的方向。如果不是,曲线将会越过终点,然后回来。

+0

谢谢,这很有帮助。你为什么选择1/3的长度? – Jailan

+0

@Jailan没有理由的价值是任意的,可以是任何长度,只要它是> 0 – Blindman67