Superformular(Supershapes)

转载 2016年08月30日 18:37:37

转自:

维基百科 

另外可参看:Supershapes (Superformula)


The superformula is a generalization of the superellipse and was first proposed by Johan Gielis.

Gielis suggested that the formula can be used to describe many complex shapes and curves that are found in nature.

In polar coordinates, with r the radius and \varphi the angle, the superformula is:


The formula appeared in a work by Gielis. It was obtained by generalizing the superellipse, named and popularized by Piet Hein, a Danish mathematician.

Extension to higher dimensions[edit]

It is possible to extend the formula to 3, 4, or n dimensions, by means of the spherical product of superformulas. For example, the 3D parametric surface is obtained by multiplying two superformulas r1and r2. The coordinates are defined by the relations:

x \,=\, r_1(\theta)\cos(\theta)r_2(\phi)\cos(\phi)
y \,=\, r_1(\theta)\sin(\theta)r_2(\phi)\cos(\phi)
z \,=\, r_2(\phi)\sin(\phi)

where \phi varies between -π/2 and π/2 (latitude) and θ between  and π (longitude).

Plots[edit]


GNU Octave program for generating these figures:

  function sf2d(n,a)
    u=[0:.001:2*pi];
    raux=abs(1/a(1).*abs(cos(n(1)*u/4))).^n(3)+abs(1/a(2).*abs(sin(n(1)*u/4))).^n(4);
    r=abs(raux).^(-1/n(2));
    x=r.*cos(u);
    y=r.*sin(u);
    plot(x,y);
  end




3d Superformula: a=b=1; m, n1, n2 and n3 are shown in the pictures.

GNU Octave program for generating these figures:

 function sf3d(n, a)
  u=[-pi:.05:pi];
  v=[-pi/2:.05:pi/2];
  nu=length(u);
  nv=length(v);
    for i=1:nu
    for j=1:nv
      raux1=abs(1/a(1)*abs(cos(n(1).*u(i)/4))).^n(3)+abs(1/a(2)*abs(sin(n(1)*u(i)/4))).^n(4);
      r1=abs(raux1).^(-1/n(2));
      raux2=abs(1/a(1)*abs(cos(n(1)*v(j)/4))).^n(3)+abs(1/a(2)*abs(sin(n(1)*v(j)/4))).^n(4);
      r2=abs(raux2).^(-1/n(2));
      x(i,j)=r1*cos(u(i))*r2*cos(v(j));
      y(i,j)=r1*sin(u(i))*r2*cos(v(j));
      z(i,j)=r2*sin(v(j));
    endfor;
  endfor;
  mesh(x,y,z);
 endfunction;
int segments = 800;
float scale = 20.0;


float a  = 1.0;
float b  = 0.80;
float m  = 15.0;
float n1 = -8.0;
float n2 = 12.0;
float n3 = 10.0;


float tau = 6.28318530718;
float step = tau / segments;


float phi = 0.0;


for (float o=0.0; o<0.5; o+=0.01) {


    for (int i=0; i<segments; i++) {
        float mp4 = (m * phi) / 4.0;
        float term_a = pow(abs((cos(mp4) / a)), n2);
        float term_b = pow(abs((sin(mp4) / b)), n3);
        float r = pow((term_a + term_b), -(1 / n1));
        addpoint( geoself(), set(cos(phi)*scale*r, sin(phi)*scale*r, 0) );
        phi += step;
    }


    a += o;
    b += o/25;
}

References[edit]

External links[edit]


《OpenGL ES 2.0 Programming Guide》第11章“最简单的MSAA”示例代码【C语言版】

由于《OpenGL ES 2.0 Programming Guide》原书第11章的MultiSample示例代码是错误的,遂自己实现了一份C语言版本的,希望能够帮助到同样喜欢OpenGL ES 2....

Shader特效——“Distance Estimation 距离估计”的实现 【GLSL】

在片元着色器中渲染程序图形时常常会遇到一种特别的现象,比如从渲染一个圆变为渲染一个椭圆,像素到图形等值面的距离无法被保存,因此它的厚度不是一个常数,如下图左上角所示。 所以需要通过“距离估计”——通过...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Superformular(Supershapes)
举报原因:
原因补充:

(最多只允许输入30个字)