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=u
,r=m^(-2 u /pi)
。因此,在u
,r=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