Author Topic: Fun with superellipsoids  (Read 6327 times)

0 Members and 1 Guest are viewing this topic.

Offline GrahamK

  • Atari ST
  • ***
  • Posts: 118
  • Karma: 17
    • View Profile
Fun with superellipsoids
« on: January 11, 2007 »
Here is a quicky demo for you, generally plots out a super-ellipsoid.. Don't know what one of those is ? well its a maths function which can be used to generate a range of shapes, from stars to spheres, and cubes with rounded corners, cylinders etc all from one funky function.
Plotted them out using voxel like points for effect...

You will need to download the 'experimental' patch to get it to work as there are a couple of new commands in there (quad specifically).


Code: [Select]
program
  uses pure2d,keyset         
               
 
procedure EvalSuperEllipse(t1,t2,p1,p2:real,byref pX,pY,pZ:real)
var
      tmp:real
      ct1,ct2,st1,st2:real
begin
        ct1 := cos(t1*(180.0/Pi));
        ct2 := cos(t2*(180.0/Pi));
        st1 := sin(t1*(180.0/Pi));
        st2 := sin(t2*(180.0/Pi));

        tmp := (abs(ct1)^p1)*SGN(ct1)
        px := tmp  * (abs(ct2)^p2) * SGN(ct2)
        py :=  (abs(st1)^p1) *SGN(st1)
        pz := tmp  * (abs(st2)^p2)* SGN(st2)
end
 
procedure Voxel(x,y,s,col:integer)
begin
    if s < 3 then s = 3
    Quad(x,y-s, x+s,y-s/2, x,y, x-s, y-s/2,col,true)
    Quad(x-s,y-s/2, x,y, x,y+s,x-s,y+s/2,ToRGBA(0.75*Red(col),0.75*Green(col),0.75*Blue(col)),true)
    Quad(x,y,x+s,y-s/2,x+s,y+s/2,x,y+s,ToRGBA(0.5*Red(col),0.5*Green(col),0.5*Blue(col)),true)
end

 
procedure Plot3d(x,y,z:real)
var
    px,py:real;
    zc:real
    col:integer;
begin
    px = ((x*256)/z)+400
    py = ((y*256)/z)+300
    zc = z-minz
    zc = zc * (200.0/(maxz-minz))
   
    // calculation for effect, as no depth checkin means stuff gets overdrawn
    col = ToRGBA(255-zc,zc,zc)
    //Rect(px-1,py-1,zc/10,zc/10,col,true)
    voxel(px,py,8,col)
end

procedure calc3d(x,y,z,ax,ay:real)
var
    xr,yr,zr:real
begin
    zr=(z*Cos(ax))-(y*Sin(ax))
    yr=(y*Cos(ax))+(z*Sin(ax))
    xr=(x*Cos(ay))-(zr*Sin(ay))
    zr=(zr*Cos(ay))-(x*Sin(ay))
    zr=zr+2000
               
    plot3d(xr,yr,zr)           
    maxz=Max(maxz,zr)
    minz=Min(minz,zr)
end

var
    i,j : real
    ax,ay:real
    d1:real=0.001
    d2:real=0.003         
   
    maxz:real=-99999
    minz:real=99999
    scale:real=1000     
   
    power1,power2:real=1
    n:real=32

    twopi,pid2,delta :real
    theta1,theta2,theta3:real
    px,py,pz:real   
begin
  openscreen         
               
   twopi = pi*2.0
   pid2  = pi/2.0
   
   
   d1=0.001
   d2=0.003
   
 
 
  while not keydown(vk_escape)
    cls                     
        ax = ax + 0.3
        if ax > 360 then ax=ax-360
        ay = ay + 0.7             
        if ay>360 then ay=ay-360
   
        power1 = power1 + d1
        if (power1>3) or (power1<0) then
            d1=-d1         
            power1 = power1 + d1
        endif
           

        power2 = power2 + d2
        if (power2>3) or (power2<0) then
            d2=-d2         
            power2 = power2 + d2
        endif
       
     delta = 0.01 * TWOPI / n
     for j =0 to n /2
     
      theta1 := j * TWOPI / n - PID2
      theta2 := (j + 1) * TWOPI / n - PID2

      for i = 0 to n
         if (i = 0) or (i = n) then
            theta3 = 0
         else
            theta3 = i * TWOPI / n
         endif

        EvalSuperEllipse(theta2,theta3,power1,power2,px,py,pz);
        calc3d(px*scale,py*scale,pz*scale,ax,ay)
      next
    next
             
   
//    Text(0,0,'Power1:'+power1+' power2:'+power2)
    flip
  wend
 
  closescreen
end

the power values determine the shape, uncomment the text line if you want to see the values.
Hope you enjoy it.
« Last Edit: January 11, 2007 by Clyde »

Offline mike_g

  • Amiga 1200
  • ****
  • Posts: 435
  • Karma: 34
    • View Profile
Re: Fun with superellipsoids
« Reply #1 on: January 11, 2007 »
When I compile I get an error message: Undefined symbol (Quad) on line 24

Offline Clyde

  • A Little Fuzzy Wuzzy
  • DBF Aficionado
  • ******
  • Posts: 7271
  • Karma: 71
    • View Profile
Re: Fun with superellipsoids
« Reply #2 on: January 11, 2007 »
You need to install the "Eperimental Patch" dude at Squeaky Designs. I did the same thing, as I didnt read the topic properlly.

And Cheers Graham for posting a real neat and cool snippet, nice one :)
Still Putting The IT Into Gravy
If Only I Knew Then What I Know Now.

Challenge Trophies Won:

Offline mike_g

  • Amiga 1200
  • ****
  • Posts: 435
  • Karma: 34
    • View Profile
Re: Fun with superellipsoids
« Reply #3 on: January 11, 2007 »
Cheers, I'll do that then.

Edit: >_<

Offline GrahamK

  • Atari ST
  • ***
  • Posts: 118
  • Karma: 17
    • View Profile
Re: Fun with superellipsoids
« Reply #4 on: January 11, 2007 »
Yeah, I've got to do something about that patch thing...
Once I do the full release I'll be removing the patches etc, and just having the full download.

 :||

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17422
  • Karma: 499
  • evil/good
    • View Profile
    • My Homepage
Re: Fun with superellipsoids
« Reply #5 on: January 11, 2007 »
These things take a little time.. At least you have something out there that works and is stable.
Shockwave ^ Codigos
Challenge Trophies Won:

Offline GrahamK

  • Atari ST
  • ***
  • Posts: 118
  • Karma: 17
    • View Profile
Re: Fun with superellipsoids
« Reply #6 on: January 11, 2007 »
Fingers crossed!!!  :updance: