Javascript 使螺旋线穿过任意点的最简单方法?
Javascript 使螺旋线穿过任意点的最简单方法?,javascript,html5-canvas,Javascript,Html5 Canvas,const canvas=document.querySelector('canvas'); const ctx=canvas.getContext('2d'); ctx.strokeStyle=“黑色”; ctx.lineWidth=1; ctx.beginPath(); 让last=1 让我们开始=1 设i=0 让原点=[250250] for(设i2=0;i20和b>0的值都将导致斐波那契螺旋。很抱歉,我没有理解你评论中的任何内容。@je3rdty应该道歉的是我。对不起,我已经更新了答案,
const canvas=document.querySelector('canvas');
const ctx=canvas.getContext('2d');
ctx.strokeStyle=“黑色”;
ctx.lineWidth=1;
ctx.beginPath();
让last=1
让我们开始=1
设i=0
让原点=[250250]
for(设i2=0;i2<20;i2++){
椭圆(…原点,起点,起点,Math.PI/2*i,0,Math.PI/2);
我++
i%=4
如果(i==1)原点[1]=last
如果(i==2)原点[0]+=last,则为else
else如果(i==3)原点[1]+=last
如果(i==0)原点[0]-=last;
[最后,开始]=[开始,开始+最后]
}
ctx.stroke();
ctx.beginPath()
ctx.lineCap='圆形'
ctx.lineWidth=7
ctx.strokeStyle=“红色”;
ctx.lineTo(400400)
ctx.stroke()
我不确定您希望螺旋线如何截取该点。有twp选项
Ax^p+C
,其中x是角度,p
是螺旋度(缺少更好的术语),a
是刻度(同样缺少更好的术语),而C
是起始角度
C
如果你想使螺旋的步进角成为一个设定的长度,例如1px将是angle+=1/(Ax^p+C)
如果C为0,那么1/0
将导致无限循环
画螺旋线
如上所述,可以渲染多种类型的缓和曲线,因此应该有一种接近现有缓和曲线的缓和曲线
螺旋上的任意点如下所示
x = cos(angle) * f(angle) + origin.x
y = sin(angle) * f(angle) + origin.y
其中f是多边形f(x)=Ax^p+C
下面的函数绘制一条基本的线性缓和曲线f(x)=1*x^1+0.1
function drawSpiral(origin) {
ctx.strokeStyle = "black";
ctx.lineWidth = 3;
ctx.beginPath();
let i = 0;
while (i < 5) {
const r = i + 0.1; // f(x) = 1*x^1+0.1
ctx.lineTo(
Math.cos(i) * r + origin.x,
Math.sin(i) * r + origin.y
);
i += 0.1
}
ctx.stroke();
}
canvas{位置:绝对;顶部:0px;左侧:0px;背景:黑色}
我不确定您希望螺旋线如何截取该点。有twp选项
Ax^p+C
,其中x是角度,p
是螺旋度(缺少更好的术语),a
是刻度(同样缺少更好的术语),而C
是起始角度
C
如果你想使螺旋的步进角成为一个设定的长度,例如1px将是angle+=1/(Ax^p+C)
如果C为0,那么1/0
将导致无限循环
画螺旋线
如上所述,可以渲染多种类型的缓和曲线,因此应该有一种接近现有缓和曲线的缓和曲线
螺旋上的任意点如下所示
x = cos(angle) * f(angle) + origin.x
y = sin(angle) * f(angle) + origin.y
其中f是多边形f(x)=Ax^p+C
下面的函数绘制一条基本的线性缓和曲线f(x)=1*x^1+0.1
function drawSpiral(origin) {
ctx.strokeStyle = "black";
ctx.lineWidth = 3;
ctx.beginPath();
let i = 0;
while (i < 5) {
const r = i + 0.1; // f(x) = 1*x^1+0.1
ctx.lineTo(
Math.cos(i) * r + origin.x,
Math.sin(i) * r + origin.y
);
i += 0.1
}
ctx.stroke();
}
canvas{位置:绝对;顶部:0px;左侧:0px;背景:黑色}
既然您没有提到初始点的约束,为什么不将任意点设置为起始点既然您没有提到初始点的约束,为什么不将任意点设置为起始点螺旋()的参数是什么
函数是否为斐波那契螺旋?@je3rdty该螺旋不是多项式,而是对数螺旋,函数为r=ae^(bx)
其中r
是半径,b
是增长,e
是欧拉数(JSMath.e
),x
是角度,a
是起始半径(与答案中的C相同)。您需要根据xx=(1/b)*ln(r/a)-pointDist(原点,点)求解ae**(bx)=pointDist(原点,点)
其中ln
是自然对数函数Math.log
任何a>0
和b>0
的值都将导致斐波那契螺旋。很抱歉,我没有理解你评论中的任何内容。@je3rdty应该道歉的是我。对不起,我已经更新了答案,将斐波那契螺旋包含在exa中简单来说,它基本上是相同的,只是一个新的半径和startAngle函数radiusF
和startAngleF
的参数是什么spiral()
函数的参数是斐波那契螺线?@je3rdty螺旋线不是多项式