我怎样才能获得接近黄金螺旋的近似值?

我怎样才能获得接近黄金螺旋的近似值?
size(400);

pair A=(0,0),C=(1,1),M=(A+(C.x,A.y))/2;
filldraw(box(A,C),pink);
draw(M--C,blue);

real tmax=degrees(C-M)-degrees((C.x,A.y)-M);
pair K=rotate(-tmax,M)*C;
draw(C--(K.x,C.y)--(K.x,A.y)--(C.x,A.y));

draw((A.x,C.y)--(K.x,A.y),blue);
draw((K.x,C.y)--(C.x,A.y),blue);
pair Inter=intersectionpoint((A.x,C.y)--(K.x,A.y),(K.x,C.y)--(C.x,A.y));
path rightangle=Inter--Inter+0.1*unit((A.x,C.y)-Inter)--
                               rotate(-90,Inter+0.1*unit((A.x,C.y)-Inter))*Inter--
                               Inter+0.1*unit((C.x,A.y)-Inter)--cycle;
filldraw(rightangle,magenta,blue);

real m=1/(1+abs((K.x,C.y)-C)); 
// write(m); // 0.618033988749895

int N=100;
pair Z[];
for (int i=0; i<=N;++i)
{
 real t= i/10;
  Z.push(rotate(-t*90,Inter)*(Inter+m^t*(A-Inter)));
}
draw(operator .. (... Z),red);
shipout(bbox(2mm,invisible));

在此处输入图片描述

在此处输入图片描述 问题:

从上面的代码来看,它是否非常接近黄金螺旋?(如果不是,我该如何改进它?)

额外的:

我看过https://en.wikipedia.org/wiki/Logarithmic_spiral并尝试检查近似值如下:

import graph;
picture Pic;
size(Pic,400);

pair A=(0,0),C=(1,1),M=(A+(C.x,A.y))/2;
real tmax=degrees(C-M)-degrees((C.x,A.y)-M);
pair K=rotate(-tmax,M)*C;

pair Inter=intersectionpoint((A.x,C.y)--(K.x,A.y),(K.x,C.y)--(C.x,A.y));
real m=1/(1+abs((K.x,C.y)-C)); 
// write(m); // 0.618033988749895

int N=100;
pair Z[];
for (int i=0; i<=N;++i)
{
 real t= i/10;
  Z.push(rotate(-t*90,Inter)*(Inter+m^t*(A-Inter)));
}
draw(Pic,shift(A-Inter)*(operator .. (... Z)),red);
add(Pic.fit());

picture pic;
size(pic,400);
pair A=(0,0),C=(1,1),M=(A+(C.x,A.y))/2;
real tmax=degrees(C-M)-degrees((C.x,A.y)-M);
pair K=rotate(-tmax,M)*C;
pair Inter=intersectionpoint((A.x,C.y)--(K.x,A.y),(K.x,C.y)--(C.x,A.y));
real a=1, k=Tan(17.03239);
real f(real t) {return a*exp(k*t);}

path g=polargraph(f,0,6pi,500,operator ..);
draw(pic,rotate(180)*g,lightblue+white);
add(pic.fit());

shipout(bbox(2mm,invisible));

在此处输入图片描述

但是,我不知道哪个是正确的,或者我的代码是否失败了?请帮忙!

此外,剧情不完整。

答案1

这两个对象是相同的,也是黄金螺旋。我认为这更像是一个数学问题,而不是渐近线问题。这是一个变量问题,也是描述螺旋的方式(朝向中心或不朝向中心)。

为了进行比较,最好使用相同的缩放比例,因此请避免pic.fit。然后您必须进行一些计算。

在第一种情况下(直到平移和旋转),方程在极坐标中phi=-pi t/2 r=m^t。如果u=-pi/2 t我们在变量中有u,极坐标中有phi=ur=m^(-2 u /pi)。因此,在ur=exp(-u *2log(m)/pi)和中-2log(m)/pi=tan(17.03239)。直到缩放、旋转和间隔的选择,两个例子都是相同的:黄金螺旋。你可以在以下示例中观察到

import graph;
size(400);
pair A=(0,0),C=(1,1),M=(A+(C.x,A.y))/2;
real tmax=degrees(C-M)-degrees((C.x,A.y)-M);
pair K=rotate(-tmax,M)*C;

pair Inter=intersectionpoint((A.x,C.y)--(K.x,A.y),(K.x,C.y)--(C.x,A.y));
real m=1/(1+abs((K.x,C.y)-C));
// write(m); // 0.618033988749895

int N=100;
pair Z[];
for (int i=0; i<=N;++i)
{
 real t= i/10;
  Z.push(rotate(-t*90,Inter)*(Inter+m^t*(A-Inter)));
}
draw(shift(A-Inter)*(operator .. (... Z)),red);
pair A=(0,0),C=(1,1),M=(A+(C.x,A.y))/2;
real tmax=degrees(C-M)-degrees((C.x,A.y)-M);
pair K=rotate(-tmax,M)*C;
real a=abs(Inter), k=Tan(17.03239);
k=log(1+m)/(pi/2);
real f(real t) {return a*exp(k*(t-pi-angle(Inter)));}
path g=polargraph(f,-6pi+angle(Inter),angle(Inter)+pi,500,operator ..);
draw(rotate(0)*g,lightblue+white);

shipout(bbox(2mm,invisible));

和图片

在此处输入图片描述

一个有趣的图像应该是用四分之一圆来近似斐波那契数列。

答案2

如果你有 Matlab(或 Octave,两者功能相同,但免费),你可以定义参数函数,例如

在此处输入图片描述

在此处输入图片描述

选择值 a 和 b 将改变螺旋的形状,(请参阅维基百科了解如何选择正确的值)

现在,您需要做的就是将 matlab 图转换为 tikz 代码,您可以通过名为 matlab2tikz 的包来完成:https://github.com/matlab2tikz/matlab2tikz

相关内容