Пример #1
0
//============================================================================
// Cup neighborlist generator - finite and infinite sets
//============================================================================
// a square grid of cups at even grid points
void cups_near(double *pos, double *cups, int *ncups){
    int i, j;
    *ncups = 0;
    for (i=-1; i<=1; i++){
        for (j=-1; j<=1; j++){
            cups[2*(*ncups)+0] = pos[0]-(mymod(pos[0]+1, 2)-1) + 2*i;
            cups[2*(*ncups)+1] = pos[1]-(mymod(pos[1]+1, 2)-1) + 2*j;
            *ncups += 1;
        }
    }
}
Пример #2
0
float saw2(float f) {
  float d=mymod(f,2.0);
  if (d<=1.0)
    return d;
  else
  return 2.0-d;
}
Пример #3
0
float mycos(float x) {
#ifdef TRIGLOOKUPOFF
  return cos(x);
#endif
  setuptriglookup();
  float y=mymod(x,2*pi);
  return coslookup[(int)(y*triglookupquant/2/pi)];
}
Пример #4
0
void redocolors() {
										
  int i;
  for (i = 0; i < COLORS; i++) {	/* Set up the colors gradient */
		// myRGB r=myRGB(thru,thru,thru);
		// myRGB r=( thru < 1 ? myRGB(0.0,thru*5.0,0.0)
						             // : myRGB(thru*2.0-1.0,1.0,thru*2.0-1.0)
						// );
    float thru=4.0*mymod(frameno*palspeed/(float)COLORS+i/2.0/(float)COLORS);
		myRGB r;
		if (thru<1.0)
			r=myRGB(0.0,thru,0.0);
		else if (thru<2.0)
			r=myRGB(thru-1.0,1.0,thru-1.0);
		else if (thru<3.0)
			r=myRGB(1.0-(thru-2.0),1.0-(thru-2.0),1.0);
		else
			r=myRGB(0.0,0.0,1.0-(thru-3.0));

    #ifdef X11GFX
      xrgb[i].red = 65535 * r.r/255; // (1.0 - 1.0 * i / COLORS);
      xrgb[i].green = 65535 * r.g/255;
      xrgb[i].blue = 65535 * r.b/255;
      xrgb[i].flags = DoRed | DoGreen | DoBlue;
      xrgb[i].pixel=i;
    #endif

    #ifdef ALLEGRO
      RGB algrgb;
      algrgb.r=r.r/4;
      algrgb.g=r.g/4;
      algrgb.b=r.b/4;
      set_color(i,&algrgb);
    #endif

  }

    #ifdef X11GFX
			if (stylee == styleeTrueColor) {
        // XInstallColormap (d, colormap);
			  for (int i=0;i<colors;i++) {
				  if ( XAllocColor(d,colormap,&xrgb[i]) == 0 )
					  printf("Error allocating %i\n",i);
				  // works for true-color
			  }
			} else {

			  // for (int i=0;i<colors;i++) {
				  // xrgb[i].pixel=color[i];
			  // }
			  XStoreColors(d,colormap,xrgb,COLORS);
        // fputs("Couldn't allocate enough colors cells.\n", 
        // stderr), exit(1);
			}

    #endif

}
Пример #5
0
float mysin(float x) {
#ifdef TRIGLOOKUPOFF
  return sin(x);
#else
  setuptriglookup();
  float y=mymod(x,2*pi);
  return sinlookup[(int)(y*triglookupquant/2/pi)];
#endif
}
Пример #6
0
void plotparts()
{
  int i;
  
  if (mymod(frame,traillength+1)==0)
    BWClearArea(window1, 0, 0, SCR_WIDTH, SCR_HEIGHT);
  for (i=0; i<numps; i++) {
    plotpart(&particle[i]);
  }
}
Пример #7
0
void plotparts()
{
  int i;
  
  if (mymod(frame,traillength+1)==0)
    clear(screen);
  for (i=0; i<numps; i++) {
    plotpart(&particle[i]);
  }
}
Пример #8
0
int main(int argc, char **argv)
{
  int i,stillhappy;
  Display *display;
  int events;
  
  p.x=-0.9; p.y=0;
  q.x=0.9; q.y=0;
  
  srand48(874984);
  frame=0;

  /* Connect to the server for display */
  display = BWConnectToServer();

  /* Open the windows */
  window1 = BWCreateNewWindow(display, argc, argv, 882, 4);
  window2 = BWCreateNewWindow(display, argc, argv, 882, 324);

  for (i=0; i<numps; i++) {
    randpart(&particle[i]);
  }
	
  while(1) {
    events = BWCheckEvents(window1);
    switch (events) {
      /* Window exposed - redraw */
      case EV_EXPOSED:
        {
        plotparts();
	break;
	}
	/* Mouse button pressed - close both windows and exit*/
      case EV_BUTTON:
	{
	BWCloseWindow(window1);
	exit(0);
	}
      default: {
        plotparts();
        moveparts();
        if (mymod(frame,32)==0)
          plotfield();
        frame=frame+speed;
        break;
      }
    }
  }


}
Пример #9
0
void main() {
  allegrosetup(scrwid,scrhei);
  psychedelicpalette();
  mypalette(255,0,0,0);
  V3d pos=V3d(0,0,0);
  V3d vel=V3d(0,0,0);
  V3d acc=V3d(0,0,0);
  Ori ori;
  float roll=0;
  float yaw=0;
  JBmp b=JBmp(scrwid,scrhei);
  PPsetup(scrwid,scrhei,4);
  do {
    b.clear(255);
    V3d off=V3d(mymod(pos.x,gjump),mymod(pos.y,gjump),mymod(pos.z,gjump));
    int ioff=-mydiv(pos.x,gjump);
    int joff=-mydiv(pos.y,gjump);
    int koff=-mydiv(pos.z,gjump);
    for (int k=gridsize;k>=-gridsize;k-=gjump)
      for (int i=-gridsize;i<=gridsize;i+=gjump)
        for (int j=-gridsize;j<=gridsize;j+=gjump) {
          int x,y;
          V3d cen=V3d(i,j,k)-off;
          cen=V3d::orientate(cen,ori);
          int c=256.0*mymod(5*mysquare((i-ioff)/gjump)-11*(j-joff)/gjump-7*(k-koff)/gjump,6)/6.0;
          PPgetscrpos(cen,&x,&y);
          b.filledcircle(x,y,0.1*PPgetunit(cen),c);
        }
    b.writetoscreen();
    acc=hang(acc,V3d::origin,0.93,0.02);
    vel=hang(vel,V3d::origin,0.93,0)+acc;
    pos=pos+vel;
    roll=hang(roll,0,0.92,0.01);
    yaw=hang(yaw,0,0.92,0.01);
    ori.roll(roll);
    ori.yaw(yaw);
  } while (!key[KEY_ESC]);
}
/*
* interp1_table0_complex_per()
* 1D, 0th order, complex, periodic
*/
void interp1_table0_complex_per(
const double *r_ck,	/* [K1,1] in */
const double *i_ck,
const int K1,
const double *r_h1,	/* [J1*L1+1,1] in */
const double *i_h1,	/* imaginary part of complex interpolator */
const int J1,
const int L1,
const double *p_tm,	/* [M,1] in */
const int M,
double *r_fm,		/* [M,1] out */
double *i_fm)
{
	int mm;

	/* trick: shift table pointer to center */
	{
	const int ncenter1 = floor(J1 * L1/2.);
	r_h1 += ncenter1;
	i_h1 += ncenter1;
	}

	/* interp */
    for (mm=0; mm < M; mm++) {
	int jj1;
	const double t1 = *p_tm++;
	register double sum1r = 0;
	register double sum1i = 0;
	int k1 = 1 + floor(t1 - J1 / 2.);

	for (jj1=0; jj1 < J1; jj1++, k1++) {
		const double p1 = (t1 - k1) * L1;
		const int n1 = /* ncenter1 + */ iround(p1);
		register const double coef1r = r_h1[n1];
		register const double coef1i = i_h1[n1];
		const int k1mod = mymod(k1, K1);

		/* sum1 += coef1 * ck */
		sum1r += coef1r * r_ck[k1mod] - coef1i * i_ck[k1mod];
		sum1i += coef1r * i_ck[k1mod] + coef1i * r_ck[k1mod];
	}
	*r_fm++ = sum1r;
	*i_fm++ = sum1i;
    }
}
Пример #11
0
void main() {
  Map2d<uchar> *from=new Map2d<uchar>(scrwid,scrhei);
  Map2d<uchar> *dest=new Map2d<uchar>(scrwid,scrhei);
  JBmp *rto=new JBmp(scrwid*2,scrhei);
  Map2d<int> *to=new Map2d<int>(scrwid,scrhei,0);
  randomise();
  allegrosetup(320,200);
  for (int i=0;i<256;i++) {
    mypalette(i,myRGB::hue(mymod(4.0*(float)i/256.0)));
  }
  for (int x=0;x<scrwid;x++)
  for (int y=0;y<scrhei;y++) {
    from->pos[x][y]=intrnd(512+256);
    dest->pos[x][y]=intrnd(512+256);
  }
  do {
    to->clear(0);
    to->pos[0][0]=from->pos[0][0];
    to->pos[scrwid-1][0]=from->pos[scrwid-1][0];
    to->pos[0][scrhei-1]=from->pos[0][scrhei-1];
    to->pos[scrwid-1][scrhei-1]=from->pos[scrwid-1][scrhei-1];
    make(rto,to,from,0,0,toppow);
    rto->display();
    for (int x=0;x<scrwid;x++)
    for (int y=0;y<scrhei;y++) {
      // from->pos[x][y]=ucharchop(from->pos[x][y]+magrnd(10));
      int speed=3;
      if (from->pos[x][y]<=dest->pos[x][y]-speed)
        from->pos[x][y]+=speed;
      else
        if (from->pos[x][y]>=dest->pos[x][y]+speed)
          from->pos[x][y]-=speed;
        else
          dest->pos[x][y]=intrnd(512+256);
    }
    
  } while (!key[KEY_ESC]);
}
Пример #12
0
void main() {
  allegrosetup(scrwid,scrhei);
  makepalette(&greypalette);
  mypalette(255,0,0,0);
  mypalette(0,0,0,0);
  mypalette(255,1,1,1);
  mypalette(128,0,0,0);
  for (int r=0;r<8;r++) {
  for (int g=0;g<8;g++) {
    int palc=r+g*8;
    mypalette(palc,(r==0?0:0.3+0.4*r/7.0),(g==0?0:0.1+0.2*g/7.0),(g==0?0:0.3+0.5*g/7.0));
    }
      }
  //  randomise();
  V3d pos=V3d(0,0,0);
  V3d vel=V3d(0,0,0);
  V3d acc=V3d(0,0,0);
  Ori ori;
  float droll=0;
  float dyaw=0;
  float roll=0;
  float yaw=0;
  float pitch=0;
  int frame=0;
  starttimer();
  do {
    frame++;
    float pd=2.0+1.8*sin(2*pi*frame/1000.0);
    PPsetup(scrwid,scrhei,pd);
    left.clear(0);
    right.clear(0);
//    b.fadeby(16);
    V3d off=V3d(mymod(pos.x,gjump),mymod(pos.y,gjump),mymod(pos.z,gjump));
    int ioff=-mydiv(pos.x,gjump);
    int joff=-mydiv(pos.y,gjump);
    int koff=-mydiv(pos.z,gjump);
    ori.quickorisetup();
    // Need to find largest axis, and do loops with that one outside
    int ks=mysgn(ori.qz.z);
    int js=-mysgn(ori.qz.y);
    int is=-mysgn(ori.qz.x);
    for (int k=ks*gridsize;k!=-ks*gridsize;k=k-ks*gjump)
      for (int i=-is*gridsize;i!=is*gridsize;i=i+is*gjump)
        for (int j=-js*gridsize;j!=js*gridsize;j=j+js*gjump) {
          int x,y;
          V3d cen=V3d(i,j,k)-off;
          cen=V3d::qorientate(cen,ori);
          int c=7-chop(7*(cen.z+pd+1)/(gridsize+2),0,7);
          plotsphere(cen,c);
        }
    for (int i=0;i<scrwid;i++) {
    for (int j=0;j<scrhei;j++) {
      b.bmp[j][i]=(left.bmp[j][i] | right.bmp[j][i]);
    }
    }
    b.writetoscreen();
    acc=hang(acc,V3d::origin,0.95,0.01);
    vel=hang(vel,ori.qz/10,0.94,0)+acc;
    pos=pos+vel;
    droll=hang(droll,0,0.9,0.01);
    dyaw=hang(dyaw,0,0.95,0.01);
    roll=hang(roll,0,0.95,0)+droll;
    yaw=hang(yaw,0,0.92,0)+dyaw;
    pitch=hang(pitch,0,0.999,0.01);
    pos=pos+ori.qz*4;
    ori.roll(roll/5.0);
    ori.yaw(yaw/5.0);
    pos=pos-ori.z()*4;
    framedone();
  } while (!key[KEY_SPACE] && !key[KEY_ESC]);
  savetimer();
  allegro_exit();
  displayframespersecond();
}
Пример #13
0
void main() {
  allegrosetup(scrwid,scrhei);
  makepalette(&greypalette);
  mypalette(255,0,0,0);
  mypalette(0,0,0,0);
  mypalette(255,1,1,1);
  mypalette(128,0,0,0);
  randomise();
  for (int i=0;i<=15;i++) {
    waves+Wave();
    // waves.num(i).display();
  }
  for (int r=0;r<16;r++) {
    for (int g=0;g<16;g++) {
      int palc=r+g*16;
      mypalette(palc,(r==0?0:brightness+0.2+change*0.5*r/15.0),(g==0?0:brightness+change*0.1+0.2*g/15.0),(g==0?0:brightness+change*0.2+0.6*g/15.0));
      // Groovy colours mypalette(palc,(r==0?0:0.1+0.6*r/15.0),(g==0?0:0.1+0.2*g/15.0),(g==0?0:0.1+0.7*g/15.0));
      // Good colours: mypalette(palc,(r==0?0:0.3+0.4*r/15.0),(g==0?0:0.1+0.2*g/15.0),(g==0?0:0.3+0.5*g/15.0));
    }
  }
  V3d vel=V3d(0,0,0);
  V3d acc=V3d(0,0,0);
  Ori ori;
  float droll=0;
  float dyaw=0;
  float dpitch=0;
  int frame=0;
  List<V3d> particles=List<V3d>(gridsize*gridsize*gridsize);
  /* for (int i=1;i<gridsize*gridsize*gridsize;i++) {
       particles+gridsize*V3d(floatrnd(-1,1),floatrnd(-1,1),floatrnd(-1,1));
     }*/
  int ps=1;
  float rad=0;
  for (float thru=0;thru<1.0;thru+=0.0016) {
    V3d here=getpos(thru);
    V3d forward=getpos(thru+0.00001)-here;
    V3d up=V3d::normcross(V3d::crazy,forward);
    V3d right=V3d::normcross(forward,up);
    for (int i=0;i<ps;i++) {
      float t=2*pi*(float)i/(float)ps;
      float s=sin(t);
      float c=cos(t);
      particles+(here+rad*(s*up+c*right));
    }
    // v.print();
  }
  starttimer();
  float thru=0;
  float marker=0;
  V3d pos=getpos(marker);
  V3d *tail=new V3d[taillen];
  int tailpos=0;
  do {
    thru+=0.001;
    // V3d last=V3d(pos.x,pos.y,pos.z);
    // V3d pos=getpos(thru);
    // V3d next=getpos(thru+0.00001);
    // V3d newz=next-pos;
    // ori.forcez(newz);
    frame++;
    // float pd=1.6+1.3*sin(2*pi*frame/1000.0);
    float pd=2.0;
    PPsetup(scrwid,scrhei,pd);
    left.clear(0);
    right.clear(0);
    // b.fadeby(16);
    int ioff=-mydiv(pos.x,gjump);
    int joff=-mydiv(pos.y,gjump);
    int koff=-mydiv(pos.z,gjump);
    ori.quickorisetup();
    // Need to find largest axis, and do loops with that one outside
    int ks=mysgn(ori.qz.z);
    int js=-mysgn(ori.qz.y);
    int is=-mysgn(ori.qz.x);
    for (int i=1;i<=particles.len;i++) {
      int x,y;
      V3d p=particles.num(i);
      V3d cen=p-pos+0.0*ori.y;
      cen=V3d::disorientate(cen,ori);
      int c=15.0-chop(14.0*(cen.z+gridsize)/(float)(gridsize*2),0,14);
      // int c=7.0-chop(6.0*(i/particles.len),0,6);
      plotsphere(cen,c);
    }
    
    // Plot and move marker
    V3d m;
    for (int i=1;i<=15;i++) {
      m=V3d::disorientate(getpos(marker)-pos,ori);
      if (m.mod()<markerrange)
        marker+=0.0002;
    }
    
    float u=PPgetunitnoadd(m);
    bool plot=false;
    if (u) {
      int x,y;
      float rad=0.08*u;
      PPgetscrposnoadd(m,PPlefteye,&x,&y);
      if (left.inimage(x,y)) {
        plot=true;
        left.opencircle(x,y,rad,15);
      }
      PPgetscrposnoadd(m,PPrighteye,&x,&y);
      if (right.inimage(x,y)) {
        plot=true;
        right.opencircle(x,y,rad,15*16);
      }
    }
    if (!plot) {
      V2d v=scrwid*2*V2d(m.x,m.y).norm();
      if (abs(v.x)>scrwid/2) {
        float change=(float)scrwid/2.0/abs(v.x);
        v=change*v;
      }
      if (abs(v.y)>scrhei/2) {
        float change=(float)scrhei/2.0/abs(v.y);
        v=change*v;
      }
      v=v+V2d(scrwid/2,scrhei/2);
      left.opencircle(v,5,15);
      right.opencircle(v,5,15*16);
    }
    
    // Pull player towards marker
    // if (m.mod()>markerrange+.1) {
      V3d pulldir=getpos(marker)-pos;
      // vel=vel+pulldir*0.02;
      // float amount=(V3d::normdot(ori.z(),pulldir)+5.0)/6.0;
      float amount=chop(0.99-(m.mod()-markerrange)/5.0,0,1);
      V3d newz=ori.z()*amount+(1.0-amount)*pulldir;
      ori.forcez(newz);
      // vel=vel*amount;
      // 
    //}

    // Draw and update tail
    V3d last=(tail[tailpos]-pos).disorientate(ori);
    for (int k=1;k<taillen;k++) {
      int j=mymod(tailpos+k,taillen);
      V3d next=(tail[j]-pos).disorientate(ori);
      plotline(last,next,(float)k/(float)taillen);
      last=next;
    }

    if ((frame % 5)==0) {
    tail[tailpos]=pos-ori.qz;
    tailpos=mymod(tailpos+1,taillen);
    }
        
    // Or screens
    for (int i=0;i<scrwid;i++) {
      for (int j=0;j<scrhei;j++) {
        b.bmp[j][i]=(left.bmp[j][i] | right.bmp[j][i]);
      }
    }
    b.writetoscreen();
    // acc=hang(acc,V3d::origin,0.95,0.01);
    
    // Movement
    float angvel=turnability;
    if (key[KEY_LCONTROL])
      vel=vel+ori.z()*forcevel;
    else
      angvel=turnability*2.0;
    if (key[KEY_UP])
      dpitch=dpitch+angvel;
    if (key[KEY_DOWN])
      dpitch=dpitch-angvel;
    if (key[KEY_LEFT])
      if (key[KEY_ALT])
      droll=droll-angvel;
    else
    dyaw=dyaw-angvel;
    if (key[KEY_RIGHT])
      if (key[KEY_ALT])
      droll=droll+angvel;
    else
    dyaw=dyaw+angvel;
    vel=hang(vel,V3d::o,0.91,0);
    pos=pos+vel;
    droll=hang(droll,0,0.9,0);
    dyaw=hang(dyaw,0,0.9,0);
    dpitch=hang(dpitch,0,0.9,0);
    ori.roll(droll/5.0);
    ori.yaw(dyaw/5.0);
    ori.pitch(dpitch/5.0);
    
    framedone();
  } while (!key[KEY_SPACE] && !key[KEY_ESC]);
  savetimer();
  allegro_exit();
  displayframespersecond();
}
Пример #14
0
/*
* interp3_table0_complex_per_adj()
*/
void interp3_table0_complex_per_adj(
double *r_ck,		/* [K1,K2,K3] out */
double *i_ck,
const int K1,
const int K2,
const int K3,
const double *r_h1,	/* [J1*L1+1,1] in */
const double *i_h1,
const double *r_h2,	/* [J2*L2+1,1] in */
const double *i_h2,
const double *r_h3,	/* [J3*L3+1,1] in */
const double *i_h3,
const int J1,
const int J2,
const int J3,
const int L1,
const int L2,
const int L3,
const double *p_tm,	/* [M,3] in */
const int M,
const double *r_fm,	/* [M,1] in */
const double *i_fm)
{
	int mm;

	/* trick: shift table pointer to center */
	{
	const int ncenter1 = floor(J1 * L1/2);
	r_h1 += ncenter1;
	i_h1 += ncenter1;
	}
	{
	const int ncenter2 = floor(J2 * L2/2);
	r_h2 += ncenter2;
	i_h2 += ncenter2;
	}
	{
	const int ncenter3 = floor(J3 * L3/2);
	r_h3 += ncenter3;
	i_h3 += ncenter3;
	}

	/* initialize output to zero */
	(void) memset((void *) r_ck, 0, K1*K2*K3*sizeof(*r_ck));
	(void) memset((void *) i_ck, 0, K1*K2*K3*sizeof(*i_ck));

	/* interp */
    for (mm=0; mm < M; mm++) {
	int jj1, jj2, jj3;
	const double t3 = p_tm[2*M];
	const double t2 = p_tm[M];
	const double t1 = *p_tm++;
	const double fmr = *r_fm++;
	const double fmi = *i_fm++;
	const int koff1 = 1 + floor(t1 - J1 / 2.);
	const int koff2 = 1 + floor(t2 - J2 / 2.);
	int k3 = 1 + floor(t3 - J3 / 2.);

	for (jj3=0; jj3 < J3; jj3++, k3++) {
		const double p3 = (t3 - k3) * L3;
		const int n3 = /* ncenter3 + */ iround(p3);
		const double coef3r = r_h3[n3];
		const double coef3i = i_h3[n3];
		const int k3mod = mymod(k3, K3);

		const double v3r = coef3r * fmr + coef3i * fmi;
		const double v3i = coef3r * fmi - coef3i * fmr;
		int k2 = koff2;

	for (jj2=0; jj2 < J2; jj2++, k2++) {
		const double p2 = (t2 - k2) * L2;
		const int n2 = /* ncenter2 + */ iround(p2);
		const double coef2r = r_h2[n2];
		const double coef2i = i_h2[n2];
		const int k2mod = mymod(k2, K2);
		const int k23mod = (k3mod * K2 + k2mod) * K1;

		const double v2r = coef2r * v3r + coef2i * v3i;
		const double v2i = coef2r * v3i - coef2i * v3r;
		int k1 = koff1;

	for (jj1=0; jj1 < J1; jj1++, k1++) {
		const double p1 = (t1 - k1) * L1;
		const int n1 = /* ncenter1 + */ iround(p1);
		register const double coef1r = r_h1[n1];
		register const double coef1i = i_h1[n1];
		const int k1mod = mymod(k1, K1);
		const int kk = k23mod + k1mod; /* 3D array index */

		r_ck[kk] += coef1r * v2r + coef1i * v2i;
		i_ck[kk] += coef1r * v2i - coef1i * v2r;

	} /* j1 */
	} /* j2 */
	} /* j3 */
    }
}
Пример #15
0
uchar ucharmod(int x) {
  return (uchar)mymod(x,256);
}
Пример #16
0
uchar ucharsaw(float x) {
  return (uchar)mymod(x,256);
}
Пример #17
0
float mymod(float a) {
  return mymod(a,1);
}
// interp4_table0_complex_per_adj()
void interp4_table0_complex_per_adj(
double *r_ck,		/* [K1,K2,K3,K4] out */
double *i_ck,
const int K1,
const int K2,
const int K3,
const int K4,
const double *r_h1,	/* [J1*L1+1,1] in */
const double *i_h1,
const double *r_h2,	/* [J2*L2+1,1] in */
const double *i_h2,
const double *r_h3,	/* [J3*L3+1,1] in */
const double *i_h3,
const double *r_h4,	/* [J4*L4+1,1] in */
const double *i_h4,
const int J1,
const int J2,
const int J3,
const int J4,
const int L1,
const int L2,
const int L3,
const int L4,
const double *p_tm,	/* [M,4] in */
const int M,
const double *r_fm,	/* [M,1] in */
const double *i_fm)
{
	int mm;

	/* trick: shift table pointer to center */
	{
	const int ncenter1 = floor(J1 * L1/2.);
	r_h1 += ncenter1;
	i_h1 += ncenter1;
	}
	{
	const int ncenter2 = floor(J2 * L2/2.);
	r_h2 += ncenter2;
	i_h2 += ncenter2;
	}
	{
	const int ncenter3 = floor(J3 * L3/2.);
	r_h3 += ncenter3;
	i_h3 += ncenter3;
	}
	{
	const int ncenter4 = floor(J4 * L4/2.);
	r_h4 += ncenter4;
	i_h4 += ncenter4;
	}

	/* initialize output to zero */
	(void) memset((void *) r_ck, 0, K1*K2*K3*K4*sizeof(*r_ck));
	(void) memset((void *) i_ck, 0, K1*K2*K3*K4*sizeof(*i_ck));

	/* interp */
    for (mm=0; mm < M; mm++) {
	int jj1, jj2, jj3, jj4;
	const double t4 = p_tm[3*M];
	const double t3 = p_tm[2*M];
	const double t2 = p_tm[M];
	const double t1 = *p_tm++;
	const double fmr = *r_fm++;
	const double fmi = *i_fm++;
	const int koff1 = 1 + floor(t1 - J1 / 2.);
	const int koff2 = 1 + floor(t2 - J2 / 2.);
	const int koff3 = 1 + floor(t3 - J3 / 2.);
	int k4 = 1 + floor(t4 - J4 / 2.);

	for (jj4=0; jj4 < J4; jj4++, k4++) {
		const double p4 = (t4 - k4) * L4;
		const int n4 = /* ncenter4 + */ iround(p4);
		const double coef4r = r_h4[n4];
		const double coef4i = i_h4[n4];
		const int k4mod = mymod(k4, K4);
		const mwIndex k4Idx = k4mod*K3*K2*K1;

		const double v4r = coef4r * fmr + coef4i * fmi;
		const double v4i = coef4r * fmi - coef4i * fmr;
		int k3 = koff3;

	for (jj3=0; jj3 < J3; jj3++, k3++) {
		const double p3 = (t3 - k3) * L3;
		const int n3 = /* ncenter3 + */ iround(p3);
		const double coef3r = r_h3[n3];
		const double coef3i = i_h3[n3];
		const int k3mod = mymod(k3, K3);
		const mwIndex k3Idx = k3mod*K2*K1;

		const double v3r = coef3r * v4r + coef3i * v4i;
		const double v3i = coef3r * v4i - coef3i * v4r;
		int k2 = koff2;

	for (jj2=0; jj2 < J2; jj2++, k2++) {
		const double p2 = (t2 - k2) * L2;
		const int n2 = /* ncenter2 + */ iround(p2);
		const double coef2r = r_h2[n2];
		const double coef2i = i_h2[n2];
		const int k2mod = mymod(k2, K2);
		const mwIndex k2Idx = k2mod*K1;

		const double v2r = coef2r * v3r + coef2i * v3i;
		const double v2i = coef2r * v3i - coef2i * v3r;
		int k1 = koff1;

	for (jj1=0; jj1 < J1; jj1++, k1++) {
		const double p1 = (t1 - k1) * L1;
		const int n1 = /* ncenter1 + */ iround(p1);
		register const double coef1r = r_h1[n1];
		register const double coef1i = i_h1[n1];
		const int k1mod = mymod(k1, K1);
		const mwIndex kk = k4Idx + k3Idx + k2Idx + k1mod; /* 4D array index */

		r_ck[kk] += coef1r * v2r + coef1i * v2i;
		i_ck[kk] += coef1r * v2i - coef1i * v2r;

	} /* j1 */
	} /* j2 */
	} /* j3 */
	} /* j4 */
    }
}
Пример #19
0
/*----------------------------------------------------------------------------------------------------------------------------------------- */
void mlhoee_spyr(double *I , double *H, int ny , int nx  , int nH , int dimcolor , struct opts options  )
{
	double *spyr = options.spyr , *norma = options.norma  , *kernelx = options.kernelx , *kernely = options.kernely;
	double min_bin , max_bin , diff_bin ;
	double bin_size , center_offset , mini_b , f , absf;
	double clamp = options.clamp , temp , scaley , scalex, angle , mag , tempsx , tempsy  , ratiox , ratioy  , maxfactor = 0.0  , ratio;

	int i , j , p , l , x , y , o , q , v ;
	int kyy = options.kyy , kxy = options.kxy , kyx = options.kyx , kxx = options.kxx , bndori = options.bndori;
	int nspyr = options.nspyr , nori = options.nori  , norm = options.norm , nori2 = nori - 1 , interpolate = options.interpolate;
	int by , bx , ly , lx, pady , padx , nypad , nxpad , nypadnxpad , nynew , nxnew , nynxnew ,  nx1, ny1 , ny1nx1 , nygrady , nxgrady , nygradx , nxgradx; 	
	int indjx , indjy , indjm , indi , indj , index , indexo , indexp  , indtmpx , indtmpy , bin , nhd_bin;
	int deltay, deltax, sy , sx, origy, origx , offsety , offsetx , offy , offx , extraoy , extraox , offye , offxe, x0 , y0 , x1 , y1;

	int offyx , eyx , offxx , exx , offyy , eyy , offxy , exy , sf;
	int nynx = ny*nx , norinH = nori*nH , vnynx , vnorinH;

	double *Ipaded;
	double *grady , *gradx  , *R , *m  , *sat , *cell;

	if(bndori == 0)
	{
		min_bin  = -PI/2;
		max_bin  = PI/2;		    
	}
	else	
	{
		min_bin = -PI;
		max_bin = PI;
	}

	diff_bin      = (max_bin - min_bin);
    bin_size      = diff_bin/nori;
	center_offset = bin_size*0.5;
	mini_b        = min_bin+center_offset;



	for (p = 0 ; p < nspyr ; p++)
	{
		maxfactor   = max(maxfactor , spyr[p + 0]*spyr[p + nspyr]);
	}


    by          = (int) ceil(ny*norma[0]);
	bx          = (int) ceil(nx*norma[1]);

    nynew       = ((int) ceil(ny/(double)by))*by;
    nxnew       = ((int) ceil(nx/(double)bx))*bx;

	nynxnew     = nynew*nxnew;

	ratioy      = (nynew - ny)/2.0;
	offy        = (int) floor(ratioy);
	extraoy     = (int) ceil((ratioy - offy)/2.0);
	offye       = offy + extraoy;

	ratiox      = (nxnew - nx)/2.0;
	offx        = (int) floor(ratiox);
	extraox     = (int) ceil((ratiox - offx)/2.0);
	offxe       = offx + extraox;

/*
	pady        = max(1  , max(offy , max(kyx , kyy)));
    padx        = max(1  , max(offx , max(kxx , kxy)));

*/
	pady        = max(1  , max(offye , max(kyx , kyy)));
    padx        = max(1  , max(offxe , max(kxx , kxy)));


	nypad       = ny + 2*pady;
	nxpad       = nx + 2*padx;
	nypadnxpad  = nypad*nxpad; 

	offyx       = (int) (floor((kyx + 1)/2));
	eyx         = 2*offyx - kyx;

	offxx       = (int) (floor((kxx + 1)/2));
	exx         = 2*offxx - kxx;

	offyy       = (int) (floor((kyy + 1)/2));
	eyy         = 2*offyy - kyy;

	offxy       = (int) (floor((kxy + 1)/2));
	exy         = 2*offxy - kxy;


	Ipaded      = (double *)malloc(nypadnxpad*sizeof(double));


    nygrady     = nypad + kyy - 1;
	nxgrady     = nxpad + kxy - 1;
	nygradx     = nypad + kyx - 1;
	nxgradx     = nxpad + kxx - 1;


	grady       = (double *)malloc(nygrady*nxgrady*sizeof(double));
	gradx       = (double *)malloc(nygradx*nxgradx*sizeof(double));


	R           = (double *)malloc(nynxnew*nori*sizeof(double));
	m           = (double *)malloc(nynxnew*sizeof(double));

	nx1         = nxnew + 1;
	ny1         = nynew + 1;
	ny1nx1      = ny1*nx1;

	sat         = (double *)malloc(ny1nx1*sizeof(double));
	cell        = (double *)malloc(5*nH*sizeof(double));


	for (v = 0 ; v < dimcolor ; v++)
	{
		vnynx      = v*nynx;
		vnorinH    = v*norinH;


		/* Pading */

		for(i = 0 ; i < nypadnxpad ; i++)
		{
			Ipaded[i] = 0.0;
		}


		padarray(I + vnynx , ny , nx , pady , padx , Ipaded);

		/* Gradient computation */

		conv2(Ipaded , kernely , nypad , nxpad , kyy , kxy , nygrady , nygrady , grady);
		conv2(Ipaded , kernelx , nypad , nxpad , kyx , kxx , nygradx , nxgradx , gradx);
/*
		indtmpx     = max(0,padx + offxx - exx - offxe); 
		indtmpy     = max(0,pady + offxy - exy - offxe);

		indtmpx     = padx + offxx - exx - offxe; 
		indtmpy     = pady + offxy - exy - offxe;
*/


		indtmpx     = max(0,padx + offxx - exx - offxe); 
		indtmpy     = max(0,padx + offxy - exy - offxe);

		for (i = 0 ; i < nynxnew*nori ; i++)
		{
			R[i] = 0.0;
		}

		if(bndori == 0)
		{
			for(j = 0  ; j < nxnew  ; j++)
			{		
				indjx                         = pady + offyx - eyx - offye  + (j + indtmpx)*nygradx;
				indjy                         = pady + offyy - eyy - offye  + (j + indtmpy)*nygrady;
				indjm                         = j*nynew;

				for(i = 0 ; i < nynew ; i++)
				{
					tempsx                       = gradx[i + indjx];
					tempsy                       = grady[i + indjy];

					angle                        = atan(tempsy/(tempsx + verytiny));  
					mag                          = sqrt((tempsx*tempsx) + (tempsy*tempsy)); 

					bin                          = min(nori2 , max(0 , (int)floor(nori*(angle - min_bin)/diff_bin)));

					if(interpolate)
					{

						f                              = (angle - (mini_b + bin*bin_size))/bin_size;
						absf                           = fabs(f);
						sf                             = sign(f);
						nhd_bin                        = mymod(bin + sf  , nori2);
						R[i + indjm + bin*nynxnew]     = mag*(1.0 - absf);
						R[i + indjm + nhd_bin*nynxnew] = mag*absf;

					}
					else
					{
						R[i + indjm + bin*nynxnew]   = mag;
					}

					m[i + indjm]                 = mag; 

				}
			}
		}
		else
		{
			for(j = 0  ; j < nxnew  ; j++)
			{		
				indjx                         = pady + offyx - eyx - offye  + (j + indtmpx)*nygradx;
				indjy                         = pady + offyy - eyy - offye + (j + indtmpy)*nygrady;
				indjm                         = j*nynew;

				for(i = 0 ; i < nynew ; i++)
				{
					tempsx                       = gradx[i + indjx];
					tempsy                       = grady[i + indjy];

					angle                        = atan2(-tempsy , -(tempsx + verytiny));  
					mag                          = sqrt((tempsx*tempsx) + (tempsy*tempsy)); 

					bin                          = min(nori2 , max(0 , (int)floor(nori*(angle - min_bin)/diff_bin)));

					if(interpolate)
					{
						f                              = (angle - (mini_b + bin*bin_size))/bin_size;
						absf                           = fabs(f);
						sf                             = sign(f);
						nhd_bin                        = mymod(bin + sf  , nori2);
						R[i + indjm + bin*nynxnew]     = mag*(1.0 - absf);
						R[i + indjm + nhd_bin*nynxnew] = mag*absf;

					}
					else
					{
						R[i + indjm + bin*nynxnew]   = mag;
					}

					m[i + indjm]                 = mag; 

				}
			}
		}


		/* L1 block-normalization via the Integral Image*/


		for(i = 0 ; i < ny1nx1 ; i++)
		{
			sat[i]   = 0.0;
		}

		for (j=1 ; j < nx1; j++)
		{
			indj  =  j*ny1;
			index =  indj - ny1;
			indi  =  (j-1)*nynew;
			for (i = 1 ; i < ny1 ; i++)
			{
				sat[i + indj] = sat[i-1 + indj] + sat[i + index] - sat[(i-1) + index] + m[(i-1) + indi]; 
			}
		}

		for(l = 0 ; l < (nxnew/bx)  ; l++)
		{
			x  = l*bx;
			for(p = 0 ; p < (nynew/by)  ; p++)
			{
				y     = p*by;
				x1    = x + bx;
				y1    = y + by;

				temp  = (sat[y1 + x1*ny1] - (sat[y1 + x*ny1] + sat[y + x1*ny1]) + sat[y + x*ny1]);
				if(temp != 0.0)
				{
					temp  = 1.0/temp; 
				}
				else
				{
					temp = 1.0;
				}
				for (o = 0 ; o < nori ; o++)
				{
					index = o*nynxnew;
					for(i = x ; i < x + bx ; i++)
					{
						indi = i*nynew + index;
						for(j = y ; j < y + by ; j++)
						{
							R[j + indi] *= temp;
						}
					}
				}
			}
		}


		/*---- Orientation block definitions ----  */

		index          = 0;
		for (p = 0 ; p < nspyr ; p++)
		{
			scaley      = (spyr[p + nspyr*2]);
			ly          = (int) ( (1 - spyr[p + 0])/scaley + 1);
			deltay      = (int) (ny*scaley);
			sy          = (int) (ny*spyr[p + 0]);
			offsety     = max(0 , (int) ( floor(ny - ( (ly-1)*deltay + sy + 1)) ));

			scalex      = (spyr[p + nspyr*3]);
			lx          = (int) ( (1 - spyr[p + nspyr*1])/scalex + 1);
			deltax      = (int) (nx*scalex);
			sx          = (int) (nx*spyr[p + nspyr*1]);
			offsetx     = max(0 , (int) ( floor(nx - ( (lx-1)*deltax + sx + 1)) ));


			ratio       = maxfactor/(spyr[p + 0]*spyr[p + nspyr]);

			for(l = 0 ; l < lx ; l++) /* Loop shift on x-axis */
			{
				origx  = offsetx + l*deltax ;

				for(q = 0 ; q < ly ; q++)   /* Loop shift on y-axis  */
				{
					origy             = offsety + q*deltay ;

					cell[0 + index]   = origy + offye;
					cell[1 + index]   = origx + offxe;
					cell[2 + index]   = origy + sy;
					cell[3 + index]   = origx + sx;
					cell[4 + index]   = ratio;
					index            += 5;

				}
			}
		}

		/*---- Compute Oriented Edge Energy via the cumulated Integral Image over each orientations ----  */

		for(i = 0 ; i < ny1nx1 ; i++)
		{
			sat[i] = 0.0;
		}

		for (o = 0 ; o < nori ; o++)
		{
			indexo = o*nynxnew;
			for (j = 1 + offxe; j<nx1; j++)
			{
				indj  =  j*ny1;
				index =  indj - ny1;
				indi  = (j-1)*nynew;

				for (i = 1 + offye ; i<ny1; i++)
				{
					sat[i + indj] = sat[i-1 + indj] + sat[i + index] - sat[(i-1) + index] + R[(i-1) + indi + indexo]; 
				}
			}

			index  = 0;
			indexp = o*nH + vnorinH; 

			for (j=0 ; j < nH ; j++)
			{
				y0                     = (int) cell[0 + index];
				x0                     = (int) cell[1 + index];
				y1                     = (int) cell[2 + index];
				x1                     = (int) cell[3 + index];

				H[j + indexp]          = (sat[y1 + x1*ny1] - (sat[y1 + x0*ny1] + sat[y0 + x1*ny1]) + sat[y0 + x0*ny1])*cell[4 + index];
				index                 += 5;
			}
		}

		/*---- Normalization ----  */

		if(norm == 1) /* L1-norm */
		{		
			for(j = 0 ; j < nH ; j++)
			{
				indj  = j*nori + vnorinH;
				temp  = 0.0;
				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += H[i];
				}

				temp  = 1.0/(temp + tiny);

				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  *= temp;

				}
			}
		}
		if(norm == 2)  /* L2-norm */
		{
			for(j = 0 ; j < nH ; j++)
			{
				indj  = j*nori + vnorinH;
				temp  = 0.0;

				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += (H[i]*H[i]);
				}

				temp  = 1.0/sqrt(temp + verytiny);
				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  *= temp;

				}
			}
		}
		if(norm == 3)  /* L1-sqrt */
		{
			for(j = 0 ; j < nH ; j++)
			{
				indj  = j*nori + vnorinH;
				temp  = 0.0;

				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += H[i];
				}

				temp  = 1.0/(temp + tiny);
				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  = sqrt(H[i]*temp);

				}
			}
		}
		if(norm == 4)  /* L2-clamped */
		{
			for(j = 0 ; j < nH ; j++)
			{
				indj  = j*nori + vnorinH;
				temp  = 0.0;
				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += (H[i]*H[i]);
				}
				temp  = 1.0/sqrt(temp + verytiny);
				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  *= temp;

					if(H[i] > clamp)
					{
						H[i] = clamp;
					}
				}
				temp  = 0.0;
				for(i = indj ; i < (nori+indj); i++)
				{
					temp   += (H[i]*H[i]);
				}

				temp  = 1.0/sqrt(temp + verytiny);
				for(i = indj ; i < (nori+indj); i++)
				{
					H[i]  *= temp;
				}
			}
		}
	}
	free(Ipaded);
	free(grady);
	free(gradx);
	free(R);
	free(m);
	free(sat);
	free(cell);
}
Пример #20
0
void main() {
  allegrosetup(scrwid,scrhei);
  makepalette(&greypalette);
  mypalette(255,0,0,0);
  randomise();
  V3d pos=V3d(0,0,0);
  V3d vel=V3d(0,0,0);
  V3d acc=V3d(0,0,0);
  Ori ori;
  float droll=0;
  float dyaw=0;
  float roll=0;
  float yaw=0;
  float pitch=0;
  for (int i=1;i<1000;i++) {
    acc=hang(acc,V3d::origin,0.92,0.01);
    vel=hang(vel,ori.qz/5,0.99,0)+acc;
    pos=pos+vel;
    droll=hang(droll,0,0.9,0.01);
    dyaw=hang(dyaw,0,0.95,0.01);
    roll=hang(roll,0,0.95,0)+droll;
    yaw=hang(yaw,0,0.92,0)+dyaw;
    pitch=hang(pitch,0,0.999,0.01);
    pos=pos+ori.qz*4;
    ori.roll(roll/5.0);
    ori.yaw(yaw/5.0);
    pos=pos-ori.z()*4;
  }
  JBmp b=JBmp(scrwid,scrhei);
  int frame=0;
  starttimer();
  do {
    frame++;
    float pd=2.0-1.5*cos(2*pi*frame/200.0);
    PPsetup(scrwid,scrhei,pd);
    b.clear(255);
//    b.fadeby(16);
    V3d off=V3d(mymod(pos.x,gjump),mymod(pos.y,gjump),mymod(pos.z,gjump));
    int ioff=-mydiv(pos.x,gjump);
    int joff=-mydiv(pos.y,gjump);
    int koff=-mydiv(pos.z,gjump);
    ori.quickorisetup();
    // Need to find largest axis, and do loops with that one outside
    int ks=mysgn(ori.qz.z);
    int js=-mysgn(ori.qz.y);
    int is=-mysgn(ori.qz.x);
    for (int k=ks*gridsize;k!=-ks*gridsize;k=k-ks*gjump)
      for (int i=-is*gridsize;i!=is*gridsize;i=i+is*gjump)
        for (int j=-js*gridsize;j!=js*gridsize;j=j+js*gjump) {
          int x,y;
          V3d cen=V3d(i,j,k)-off;
          cen=V3d::qorientate(cen,ori);
          if (PPgetscrpos(cen,&x,&y)) {
            int c=255-ucharchop(255*(cen.z+pd+1)/(gridsize+2));
            c=quantiseto(64,c+63);
            b.filledcircle(x,y,0.1*PPgetunit(cen),c);
          }
        }
    b.writetoscreen();
    b.saveframe();
    acc=hang(acc,V3d::origin,0.92,0.01);
    vel=hang(vel,ori.qz/5,0.99,0)+acc;
    pos=pos+vel;
    droll=hang(droll,0,0.9,0.01);
    dyaw=hang(dyaw,0,0.95,0.01);
    roll=hang(roll,0,0.95,0)+droll;
    yaw=hang(yaw,0,0.92,0)+dyaw;
    pitch=hang(pitch,0,0.999,0.01);
    pos=pos+ori.qz*4;
    ori.roll(roll/5.0);
    ori.yaw(yaw/5.0);
    pos=pos-ori.z()*4;
    framedone();
  } while (!key[KEY_SPACE] && !key[KEY_ESC]);
  savetimer();
  allegro_exit();
  displayframespersecond();
}
Пример #21
0
/*
* interp2_table0_complex_per()
* 2D, 0th order, complex, periodic
*/
void interp2_table0_complex_per(
const double *r_ck,	/* [K1,K2] in */
const double *i_ck,
const int K1,
const int K2,
const double *r_h1,	/* [J1*L1+1,1] in */
const double *i_h1,
const double *r_h2,	/* [J2*L2+1,1] in */
const double *i_h2,
const int J1,
const int J2,
const int L1,
const int L2,
const double *p_tm,	/* [M,2] in */
const int M,
double *r_fm,		/* [M,1] out */
double *i_fm)
{
	int mm;

	/* trick: shift table pointer to center */
	{
	const int ncenter1 = floor(J1 * L1/2);
	r_h1 += ncenter1;
	i_h1 += ncenter1;
	}
	{
	const int ncenter2 = floor(J2 * L2/2);
	r_h2 += ncenter2;
	i_h2 += ncenter2;
	}

	/* interp */
    for (mm=0; mm < M; mm++) {
	int jj1, jj2;
	const double t2 = p_tm[M];
	const double t1 = *p_tm++;
	double sum2r = 0;
	double sum2i = 0;
	const int koff1 = 1 + floor(t1 - J1 / 2.);
	int k2 = 1 + floor(t2 - J2 / 2.);

	for (jj2=0; jj2 < J2; jj2++, k2++) {
		const double p2 = (t2 - k2) * L2;
		const int n2 = /* ncenter2 + */ iround(p2);
		const double coef2r = r_h2[n2];
		const double coef2i = i_h2[n2];
		const int k2mod = mymod(k2, K2);
		const int k12mod = k2mod * K1;

		register double sum1r = 0;
		register double sum1i = 0;
		int k1 = koff1;

	for (jj1=0; jj1 < J1; jj1++, k1++) {
		const double p1 = (t1 - k1) * L1;
		const int n1 = /* ncenter1 + */ iround(p1);
		register const double coef1r = r_h1[n1];
		register const double coef1i = i_h1[n1];
		const int k1mod = mymod(k1, K1);
		const int kk = k12mod + k1mod; /* 2D array index */

		/* sum1 += coef1 * ck */
		sum1r += coef1r * r_ck[kk] - coef1i * i_ck[kk];
		sum1i += coef1r * i_ck[kk] + coef1i * r_ck[kk];
	} /* j1 */

		/* sum2 += coef2 * sum1 */
		sum2r += coef2r * sum1r - coef2i * sum1i;
		sum2i += coef2r * sum1i + coef2i * sum1r;
	} /* j2 */

	*r_fm++ = sum2r;
	*i_fm++ = sum2i;
    }
}
Пример #22
0
int p(int i, int j){
	if(i < 5 && j < 5) return mymod(i + j, 5);
	if(i < 5 && j >= 5) return mymod(i + j - 5, 5) + 5;
	if(i >= 5 && j < 5) return mymod(i - 5 - j, 5) + 5;
	return mymod(i - j, 5);
}
Пример #23
0
void main() {
  allegrosetup(scrwid,scrhei);
  makepalette(&greypalette);
  mypalette(255,0,0,0);
  mypalette(0,0,0,0);
  mypalette(255,1,1,1);
  mypalette(128,0,0,0);
  randomise();
  for (int i=0;i<=5;i++) {
    waves+Wave();
    //waves.num(i).display();
  }
  for (int r=0;r<8;r++) {
  for (int g=0;g<8;g++) {
    int palc=r+g*8;
    mypalette(palc,(r==0?0:0.1+0.6*r/7.0),(g==0?0:0.1+0.2*g/7.0),(g==0?0:0.1+0.7*g/7.0));
    // Good colours: mypalette(palc,(r==0?0:0.3+0.4*r/7.0),(g==0?0:0.1+0.2*g/7.0),(g==0?0:0.3+0.5*g/7.0));
  }
  }
  V3d vel=V3d(0,0,0);
  V3d acc=V3d(0,0,0);
  Ori ori;
  float droll=0;
  float dyaw=0;
  float roll=0;
  float yaw=0;
  float pitch=0;
  int frame=0;
  List<V3d> particles=List<V3d>(gridsize*gridsize*gridsize);
/*  for (int i=1;i<gridsize*gridsize*gridsize;i++) {
    particles+gridsize*V3d(floatrnd(-1,1),floatrnd(-1,1),floatrnd(-1,1));
  }*/
  for (float thru=0;thru<1.0;thru+=0.01) {
    particles+getpos(thru);
    //v.print();
  }
  starttimer();
  float thru=0;
  V3d pos=getpos(thru);
  do {
    thru+=0.001;
    V3d last=pos;
    V3d pos=getpos(thru);
    V3d newz=pos-last;
    ori.forcez(newz);
    frame++;
    float pd=1.6+1.3*sin(2*pi*frame/1000.0);
    PPsetup(scrwid,scrhei,pd);
    left.clear(0);
    right.clear(0);
//    b.fadeby(16);
    V3d off=V3d(mymod(pos.x,gridsize),mymod(pos.y,gridsize),mymod(pos.z,gridsize));
    int ioff=-mydiv(pos.x,gjump);
    int joff=-mydiv(pos.y,gjump);
    int koff=-mydiv(pos.z,gjump);
    ori.quickorisetup();
    // Need to find largest axis, and do loops with that one outside
    int ks=mysgn(ori.qz.z);
    int js=-mysgn(ori.qz.y);
    int is=-mysgn(ori.qz.x);
    for (int i=1;i<=particles.len;i++) {
          int x,y;
          V3d p=particles.num(i);
          //V3d cen=p-off;
          V3d cen=p+pos;
          cen=V3d(mymod2(cen.x,-gridsize,gridsize),mymod2(cen.y,-gridsize,gridsize),mymod2(cen.z,-gridsize,gridsize));
          cen=V3d::qorientate(cen,ori);
          int c=7.0-chop(6.0*(cen.z+gridsize)/(float)(gridsize*2),0,6);
          plotsphere(cen,c);
        }
    for (int i=0;i<scrwid;i++) {
    for (int j=0;j<scrhei;j++) {
      b.bmp[j][i]=(left.bmp[j][i] | right.bmp[j][i]);
    }
    }
    b.writetoscreen();
//    acc=hang(acc,V3d::origin,0.95,0.01);
//    vel=hang(vel,(ori.qz/5.0).neg(),0.9,0)+acc;
//    pos=pos+vel;
//    droll=hang(droll,0,0.9,0.01);
//    dyaw=hang(dyaw,0,0.95,0.01);
//    roll=hang(roll,0,0.95,0)+droll;
//    yaw=hang(yaw,0,0.92,0)+dyaw;
//    pitch=hang(pitch,0,0.999,0.01);
//    pos=pos+ori.qz*4;
//    ori.roll(roll/5.0);
//    ori.yaw(yaw/5.0);
//    pos=pos-ori.z()*4;
    framedone();
  } while (!key[KEY_SPACE] && !key[KEY_ESC]);
  savetimer();
  allegro_exit();
  displayframespersecond();
}
Пример #24
0
float saw(float f) {
  return mymod(f);
}
Пример #25
0
void main() {
  setuptriglookup();

  allegrosetup(scrwid,scrhei);
  makepalette(&greypalette);
  mypalette(255,0,0,0);
  mypalette(0,0,0,0);
  mypalette(255,1,1,1);
  mypalette(128,0,0,0);
  for (int r=0;r<16;r++) {
    for (int g=0;g<16;g++) {
      int palc=r+g*16;
      mypalette(palc,(r==0?0:brightness+0.2+change*0.5*r/15.0),(g==0?0:brightness+change*0.1+0.2*g/15.0),(g==0?0:brightness+change*0.2+0.6*g/15.0));
      // Groovy colours mypalette(palc,(r==0?0:0.1+0.6*r/15.0),(g==0?0:0.1+0.2*g/15.0),(g==0?0:0.1+0.7*g/15.0));
      // Good colours: mypalette(palc,(r==0?0:0.3+0.4*r/15.0),(g==0?0:0.1+0.2*g/15.0),(g==0?0:0.3+0.5*g/15.0));
    }
  }

    float pd=2.5;
    PPsetup(scrwid,scrhei,pd);
  V3d vel=V3d(0,0,0);
  V3d acc=V3d(0,0,0);
  float droll=0;
  float dyaw=0;
  float dpitch=0;
  int frame=0;

  // Set up track
  randomise();
  for (int i=0;i<=15;i++) {
    waves+Wave();
    // waves.num(i).display();
  }

  for (float thru=0;thru<1.0;thru+=1.0/(float)numps) {
    V3d here=getpos(thru);
    V3d forward=getpos(thru+0.00001)-here;
    V3d up=V3d::normcross(V3d::crazy,forward);
    V3d right=V3d::normcross(forward,up);
    for (int i=0;i<tunnelps;i++) {
      float t=2*pi*(float)i/(float)tunnelps;
      float s=sin(t);
      float c=cos(t);
      V3d v=here+tunnelrad*(s*up+c*right);
      octree.add(v);
    }
  }

  for (int i=1;i<500;i++) {
    octree.add(8.0*V3d(floatrnd(-1,1),floatrnd(-1,1),floatrnd(-1,1)));
  }

  // Display track
  float t=0;
  do {
    t=t+0.03;
    V3d from=V3d::rotate(6.0*V3d::k,V3d::j,t);
    ori.forcez(from.neg());
    pos=from;
    plotscene();
    writescreen();
  } while (!key[KEY_SPACE]);
  do {
  } while (key[KEY_SPACE]);

  // Race
  starttimer();
  float thru=0;
  float marker=0;
  pos=getpos(marker);
  V3d *tail=new V3d[taillen];
  int tailpos=0;
  do {
    thru+=0.001;
    // V3d last=V3d(pos.x,pos.y,pos.z);
    // V3d pos=getpos(thru);
    // V3d next=getpos(thru+0.00001);
    // V3d newz=next-pos;
    // ori.forcez(newz);
    frame++;
    // float pd=1.6+1.3*sin(2*pi*frame/1000.0);
    
    plotscene();
    
    // Plot and move marker
    V3d m;
    for (int i=1;i<=15;i++) {
      m=V3d::disorientate(getpos(marker)-pos,ori);
      if (m.mod()<markerrange)
        marker+=0.0002;
    }
    
    float u=PPgetunitnoadd(m);
    bool plot=false;
    if (u) {
      int x,y;
      float rad=0.12*u;
      if (PPgetscrposnoadd(m,PPlefteye,&x,&y))
      if (left.inimage(x,y)) {
        plot=true;
        left.opencircle(x,y,rad,15);
        left.opencircle(x,y,rad/2,15);
      }
      if (PPgetscrposnoadd(m,PPrighteye,&x,&y))
      if (right.inimage(x,y)) {
        plot=true;
        right.opencircle(x,y,rad,15*16);
        right.opencircle(x,y,rad/2,15*16);
      }
    }
    if (!plot) {
      V2d v=scrwid*2*V2d(m.x,m.y).norm();
      if (abs(v.x)>scrwid/2) {
        float change=(float)scrwid/2.0/abs(v.x);
        v=change*v;
      }
      if (abs(v.y)>scrhei/2) {
        float change=(float)scrhei/2.0/abs(v.y);
        v=change*v;
      }
      v=v+V2d(scrwid/2,scrhei/2);
      left.opencircle(v,5,15);
      right.opencircle(v,5,15*16);
    }
    
    // Pull player towards marker
    // if (m.mod()>markerrange+.1) {
      V3d pulldir=getpos(marker)-pos;
      // vel=vel+pulldir*0.02;
      // float amount=(V3d::normdot(ori.z(),pulldir)+5.0)/6.0;
      float amount=chop(0.99-(m.mod()-markerrange)/5.0,0,1);
      V3d newz=ori.z()*amount+(1.0-amount)*pulldir;
      ori.forcez(newz);
      // vel=vel*amount;
      // 
      // 
//    }
    
    // Draw and update tail
    V3d last=(tail[tailpos]-pos).disorientate(ori);
    for (int k=1;k<taillen;k++) {
      int j=mymod(tailpos+k,taillen);
      V3d next=(tail[j]-pos).disorientate(ori);
      plotline(last,next,(float)k/(float)taillen);
      last=next;
    }
    
    if ((frame % 2)==0) {
      tail[tailpos]=pos-ori.qz;
      tailpos=mymod(tailpos+1,taillen);
    }
    
  writescreen();
    
    // acc=hang(acc,V3d::origin,0.95,0.01);
    // Movement
    float angvel=turnability;
    if (key[KEY_LCONTROL])
      vel=vel+ori.z()*forcevel;
    else
    angvel=turnability*2.0;
    if (key[KEY_DOWN])
      dpitch=dpitch+angvel;
    if (key[KEY_UP])
      dpitch=dpitch-angvel;
    if (key[KEY_LEFT])
      if (key[KEY_ALT])
      droll=droll-angvel;
    else
    dyaw=dyaw-angvel;
    if (key[KEY_RIGHT])
      if (key[KEY_ALT])
      droll=droll+angvel;
    else
    dyaw=dyaw+angvel;
    vel=hang(vel,V3d::o,0.92,0);
    pos=pos+vel;
    droll=hang(droll,0,0.9,0);
    dyaw=hang(dyaw,0,0.9,0);
    dpitch=hang(dpitch,0,0.9,0);
    ori.roll(droll/5.0);
    ori.yaw(dyaw/5.0);
    ori.pitch(dpitch/5.0);
    
    framedone();
  } while (!key[KEY_SPACE] && !key[KEY_ESC]);
  savetimer();
  allegro_exit();
  displayframespersecond();
}
Пример #26
0
//==================================================
// simulation
//==================================================
void simulate(int seed){
    ran_seed(seed);

    int    N       = 18*512;
    double radius  = 1.0;
    double L       = sqrt(1.02*pi*radius*radius*N);
    int    Npercell = 50;

    int pbc[] = {1,1};

    double epsilon    = 180.0;
    double damp_coeff = 0.3;
    double kickforce  = 20.0;

    double dt = 1e-1;
    double t  = 0.0;
    double R  = 2*radius; 
    double R2 = R*R;

    int i, j, k;
    int *key;

    int *type   = (int*)malloc(sizeof(int)*N);
    int *neigh  = (int*)malloc(sizeof(int)*N);
    double *rad = (double*)malloc(sizeof(double)*N); 
    double *col = (double*)malloc(sizeof(double)*N); 
    for (i=0; i<N; i++){ type[i] = neigh[i] = rad[i] = 0;}

    double *x = (double*)malloc(sizeof(double)*2*N);
    double *v = (double*)malloc(sizeof(double)*2*N);
    double *f = (double*)malloc(sizeof(double)*2*N);
    double *w = (double*)malloc(sizeof(double)*2*N);
    double *o = (double*)malloc(sizeof(double)*2*N);
    for (i=0; i<2*N; i++){o[i] = x[i] = v[i] = f[i] = w[i] = 0.0;}

    #ifdef PLOT 
    double time_end = 1e20;
    #else
    double time_end = 1e2;
    #endif

    #ifdef PLOT 
        plot_init(); 
        plot_clear_screen();
        key = plot_render_particles(x, rad, type, N, L,col);
    #endif

    //-------------------------------------------------
    // initialize
    for (i=0; i<N; i++){
        rad[i] = radius;
        x[2*i+0] = L*ran_ran2();
        x[2*i+1] = L*ran_ran2();
    
        v[2*i+0] = 0.0;
        v[2*i+1] = 0.0;
        type[i] = BLACK;

        if (i==0) type[i] = RED;
    }

    //-------------------------------------------------------
    // make boxes for the neighborlist
    int size[2];
    int size_total = 1;
    for (i=0; i<2; i++){
        size[i] = (int)(L / (R)); 
        size_total *= size[i];
    }

    int *count = (int*)malloc(sizeof(int)*2*size_total);
    int *cells = (int*)malloc(sizeof(int)*2*size_total*Npercell);
    for (i=0; i<size_total; i++){
        for (j=0; j<Npercell; j++)
            cells[i*Npercell + j] = 0;
        count[i] = 0;
    }

    //==========================================================
    // where the magic happens
    //==========================================================
    int frames = 0;

    #ifdef FPS
    struct timespec start;
    clock_gettime(CLOCK_REALTIME, &start);
    #endif

    int STRESS = 1;
    double T = 0.0;
    for (t=0.0; t<time_end; t+=dt){
        double colmax = 0.0;
        int index[2];

        for (i=0; i<size_total; i++)
            count[i] = 0;

        for (i=0; i<N; i++){
            col[i] = 0.0;
            coords_to_index(&x[2*i], size, index, L);
            int t = index[0] + index[1]*size[0];
            cells[t*Npercell+count[t]] = i;
            count[t]++; 
        }

        int tt[2];
        int tix[2];
        int image[2];
        double dx[2];

        for (i=0; i<N; i++){
            f[2*i+0] = 0.0;
            f[2*i+1] = 0.0;
            
            coords_to_index(&x[2*i], size, index, L);

            for (tt[0]=-1; tt[0]<=1; tt[0]++){
            for (tt[1]=-1; tt[1]<=1; tt[1]++){
                int goodcell = 1;    
                for (j=0; j<2; j++){
                    tix[j] = mod_rvec(index[j]+tt[j],size[j]-1,pbc[j],&image[j]);
                    if (pbc[j] < image[j])
                        goodcell=0;
                }

                if (goodcell){
                    int ind = tix[0] + tix[1]*size[0]; 

                    for (j=0; j<count[ind]; j++){
                        int n = cells[ind*Npercell+j];

                        double dist = 0.0;
                        for (k=0; k<2; k++){
                            dx[k] = x[2*n+k] - x[2*i+k];
                    
                            if (image[k])
                                dx[k] += L*tt[k];
                            dist += dx[k]*dx[k];
                        }

                        //===============================================
                        // force calculation - hertz
                        if (dist > 1e-10 && dist < R2){
                            double r0 = R; 
                            double l  = sqrt(dist);
                            double co = epsilon * (1-l/r0)*(1-l/r0) * (l<r0);
                            for (k=0; k<2; k++){
                                f[2*i+k] += - dx[k] * co;
                                if (STRESS==1) col[i] += co*co*dx[k]*dx[k];//100*co*dx[k];//sqrt(co*co*dx[k]*dx[k]);
                            }
                            if (STRESS==2) col[i] += dx[1] * co*co*dx[1];
                            if (STRESS==3) col[i] += dx[0] * co*co*dx[0];
                            if (STRESS==4) col[i] += dx[1] * co*co*dx[0];
                        }
                    }
                }
            } } 

            //====================================
            // damping
            f[2*i+0] -= damp_coeff*v[2*i+0];
            f[2*i+1] -= damp_coeff*v[2*i+1];

            //=====================================
            // noise
            f[2*i+0] += T*(ran_ran2()-0.5);
            f[2*i+1] += T*(ran_ran2()-0.5);

            //=====================================
            // kick force
            f[2*i+0] += o[2*i+0]; o[2*i+0] = 0.0;
            f[2*i+1] += o[2*i+1]; o[2*i+1] = 0.0;
            
            //=======================
            // color norm
            if (col[i] > colmax) colmax = col[i];
        }

        // now integrate the forces since we have found them
        for (i=0; i<N;i++){
            // Newton-Stomer-Verlet
            if (key['h'] != 1){
            v[2*i+0] += f[2*i+0] * dt;
            v[2*i+1] += f[2*i+1] * dt;

            x[2*i+0] += v[2*i+0] * dt;
            x[2*i+1] += v[2*i+1] * dt;
            }
            // boundary conditions 
            for (j=0; j<2; j++){
                if (pbc[j] == 1){
                    if (x[2*i+j] >= L-EPSILON || x[2*i+j] < 0)
                        x[2*i+j] = mymod(x[2*i+j], L);
                }
                else {
                    const double restoration = 1.0;
                    if (x[2*i+j] >= L){x[2*i+j] = 2*L-x[2*i+j]; v[2*i+j] *= -restoration;}
                    if (x[2*i+j] < 0) {x[2*i+j] = -x[2*i+j];    v[2*i+j] *= -restoration;}
                    if (x[2*i+j] >= L-EPSILON || x[2*i+j] < 0){x[2*i+j] = mymod(x[2*i+j], L);}
                }
            }

            // just check for errors
            if (x[2*i+0] >= L || x[2*i+0] < 0.0 ||
                x[2*i+1] >= L || x[2*i+1] < 0.0)
                printf("out of bounds\n");
          
           //col[i] += v[2*i+0]*v[2*i+0] + v[2*i+1]*v[2*i+1]; 
           if (STRESS == 1) col[i] = col[i]/8; 
           if (STRESS == 2) col[i] = col[i]/16; 
           if (STRESS == 3) col[i] = col[i]/16; 
           if (STRESS == 4) col[i] = col[i]/4; 

           if (STRESS > 1) col[i] = fabs(col[i])+0.5;
        }

        #ifdef PLOT 
        const int FRAMESKIP = 1;
        if (frames % FRAMESKIP == 0){
            char filename[100];
            sprintf(filename, "screen_%05d.png", frames/FRAMESKIP);
            plot_clear_screen();
            key = plot_render_particles(x, rad, type, N, L,col);
            #ifdef IMAGES
            plot_saveimage(filename);
            #endif
        }
        #endif
        frames++;

        if (key['1'] == 1) STRESS = 1;
        if (key['2'] == 1) STRESS = 2;
        if (key['3'] == 1) STRESS = 3;
        if (key['4'] == 1) STRESS = 4;

        if (key['q'] == 1)
            break;
        if (key['w'] == 1){
            for (i=0; i<N; i++){
                if (type[i] == RED)
                    o[2*i+1] = -kickforce;
            }
        }
        if (key['s'] == 1){
            for (i=0; i<N; i++){
                if (type[i] == RED)
                    o[2*i+1] = kickforce;
            }
        }
        if (key['a'] == 1){
            for (i=0; i<N; i++){
                if (type[i] == RED)
                    o[2*i+0] = -kickforce;
            }
        }
        if (key['d'] == 1){
            for (i=0; i<N; i++){
                if (type[i] == RED)
                    o[2*i+0] = kickforce;
            }
        }
        if (key['9'] == 1)
            T -= 0.01;
        if (key['0'] == 1)
            T += 0.01;
        if (key['8'] == 1)
            T = 0.0;
        if (key['o'] == 1)
            L -= 0.01;
        if (key['p'] == 1)
            L += 0.01;
    }
    // end of the magic, cleanup
    //----------------------------------------------
    #ifdef FPS
    struct timespec end;
    clock_gettime(CLOCK_REALTIME, &end);
    printf("fps = %f\n", frames/(end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec)/1e9);
    #endif

    free(cells);
    free(count);
 
    free(x);
    free(v);
    free(f);
    free(w);
    free(o);
    free(neigh);
    free(rad);
    free(type);

    #ifdef PLOT
    plot_clean(); 
    #endif
}
Пример #27
0
int main(int argc, char **argv)
{
  int i,j,stillhappy;
  Display *display;
  int events;
  rep tmp;
  
  p.x=-0.9; p.y=0;
  q.x=0.9; q.y=0;
  
  srand48(time(tloc));
  frame=0;

  /* Connect to the server for display */
  display = BWConnectToServer();

  /* Open the windows */
  window1 = BWCreateNewWindow(display, argc, argv, 882, 4);
  window2 = BWCreateNewWindow(display, argc, argv, 882, 324);

  for (i=0; i<numps; i++) {
    randpart(&particle[i]);
  }
  for (i=0; i<numrs; i++) {
    randrepulsor(&repulsor[i]);
  }
/* Choose repulsors spread out
  for (i=0; i<numrs; i++) {
    randrepulsor(&repulsor[i]);
    for (j=0; j<500; j++) {
      randrepulsor(&tmp);
      if (isolation(tmp,i)>isolation(repulsor[i],i)) {
        repulsor[i]=tmp;
        plotrepulsor(tmp);
      }
    }
  }*/
	
  while(1) {
    events = BWCheckEvents(window1);
    switch (events) {
      /* Window exposed - redraw */
      case EV_EXPOSED:
        {
        plotparts();
	break;
	}
	/* Mouse button pressed - close both windows and exit*/
      case EV_BUTTON:
	{
	BWCloseWindow(window1);
	exit(0);
	}
      default: {
/*        plotparts();*/
        moveparts();
        if (mymod(frame,32)==0) {
/*          plotfield();*/
          plotrepulsors();
        }
        frame=frame+speed;
        break;
      }
    }
  }


}
Пример #28
0
float modtwopi(float a) {
  return mymod(a,2.0*pi);
}
Пример #29
0
float floatmod(float a,float b) {
  return mymod(a,b);
}
Пример #30
0
/*
* interp3_table0_complex_per()
* 3D, 0th order, complex, periodic
*/
void interp3_table0_complex_per(
const double *r_ck,	/* [K1,K2,K3] in */
const double *i_ck,
const int K1,
const int K2,
const int K3,
const double *r_h1,	/* [J1*L1+1,1] in */
const double *i_h1,
const double *r_h2,	/* [J2*L2+1,1] in */
const double *i_h2,
const double *r_h3,	/* [J3*L3+1,1] in */
const double *i_h3,
const int J1,
const int J2,
const int J3,
const int L1,
const int L2,
const int L3,
const double *p_tm,	/* [M,3] in */
const int M,
double *r_fm,		/* [M,1] out */
double *i_fm)
{
	int mm;

	/* trick: shift table pointer to center */
	{
	const int ncenter1 = floor(J1 * L1/2);
	r_h1 += ncenter1;
	i_h1 += ncenter1;
	}
	{
	const int ncenter2 = floor(J2 * L2/2);
	r_h2 += ncenter2;
	i_h2 += ncenter2;
	}
	{
	const int ncenter3 = floor(J3 * L3/2);
	r_h3 += ncenter3;
	i_h3 += ncenter3;
	}

	/* interp */
    for (mm=0; mm < M; mm++) {
	int jj1, jj2, jj3;
	const double t3 = p_tm[2*M];
	const double t2 = p_tm[M];
	const double t1 = *p_tm++;
	double sum3r = 0;
	double sum3i = 0;
	const int koff1 = 1 + floor(t1 - J1 / 2.);
	const int koff2 = 1 + floor(t2 - J2 / 2.);
	int k3 = 1 + floor(t3 - J3 / 2.);

	for (jj3=0; jj3 < J3; jj3++, k3++) {
		const double p3 = (t3 - k3) * L3;
		const int n3 = /* ncenter3 + */ iround(p3);
		const double coef3r = r_h3[n3];
		const double coef3i = i_h3[n3];
		const int k3mod = mymod(k3, K3);

		double sum2r = 0;
		double sum2i = 0;
		int k2 = koff2;

	for (jj2=0; jj2 < J2; jj2++, k2++) {
		const double p2 = (t2 - k2) * L2;
		const int n2 = /* ncenter2 + */ iround(p2);
		const double coef2r = r_h2[n2];
		const double coef2i = i_h2[n2];
		const int k2mod = mymod(k2, K2);
		const int k23mod = (k3mod * K2 + k2mod) * K1;

		register double sum1r = 0;
		register double sum1i = 0;
		int k1 = koff1;

	for (jj1=0; jj1 < J1; jj1++, k1++) {
		const double p1 = (t1 - k1) * L1;
		const int n1 = /* ncenter1 + */ iround(p1);
		register const double coef1r = r_h1[n1];
		register const double coef1i = i_h1[n1];
		const int k1mod = mymod(k1, K1);
		const int kk = k23mod + k1mod; /* 3D array index */

		/* sum1 += coef1 * ck */
		sum1r += coef1r * r_ck[kk] - coef1i * i_ck[kk];
		sum1i += coef1r * i_ck[kk] + coef1i * r_ck[kk];
	} /* j1 */

		/* sum2 += coef2 * sum1 */
		sum2r += coef2r * sum1r - coef2i * sum1i;
		sum2i += coef2r * sum1i + coef2i * sum1r;
	} /* j2 */

		/* sum3 += coef3 * sum2 */
		sum3r += coef3r * sum2r - coef3i * sum2i;
		sum3i += coef3r * sum2i + coef3i * sum2r;
	} /* j3 */

	*r_fm++ = sum3r;
	*i_fm++ = sum3i;
    }
}