コード例 #1
0
ファイル: interp.c プロジェクト: 1014511134/src
struct point ptinterp (struct point pt0, struct point pt1, struct point pt2, struct point pt3, 
		       float var)
/*< point interpolation >*/
{
    struct point a, b, c, d; 
    struct point X0, X1, dX0, dX1;
    struct point ei, ek;
    struct point Temp;
    float temp;

    ei = makepoint (1., 0.);
    ek = makepoint (0., 1.);

    X0 = pt1;
    X1 = pt2;
    temp = dist(pt2, pt0);
    dX0.x = ptmult(ptdiff(pt2, pt0), ei) / temp;
    dX0.z = ptmult(ptdiff(pt2, pt0), ek) / temp;
    temp = dist(pt3, pt1);
    dX1.x = ptmult(ptdiff(pt3, pt1), ei) / temp;
    dX1.z = ptmult(ptdiff(pt3, pt1), ek) / temp;
 
    d = X0;
    c = dX0;
    b.x = 3. * (X1.x - X0.x) - 2. * dX0.x - dX1.x;
    b.z = 3. * (X1.z - X0.z) - 2. * dX0.z - dX1.z;
    a.x = X1.x - b.x - c.x - d.x;
    a.z = X1.z - b.z - c.z - d.z;

    Temp.x = d.x + var * (c.x + var * (b.x + var * a.x));
    Temp.z = d.z + var * (c.z + var * (b.z + var * a.z));

    return Temp;
}
コード例 #2
0
ファイル: point.c プロジェクト: yuyabee/kandr2
int main()
{
  struct point testpoint = makepoint(4, 3);
  struct rect testrect;
  testrect.pt1 = makepoint(2, 1);
  testrect.pt2 = makepoint(5, 4);
  printf("%d\n", ptinrect(testpoint, testrect));
}
コード例 #3
0
ファイル: zad2.c プロジェクト: ikablasz/lab_c
int main(){
  struct rect test1, test2;

  test1.ll=makepoint(0,0);
  test1.ur=makepoint(1,1);

  test2.ll=makepoint(-9,-9);
  test2.ur=makepoint(-1,-1);

  printf("czy rozłączny:%d\n",disjointrect(test1,test2) );
}
コード例 #4
0
int main(void){
    struct rect screen;
    struct point middle;

    screen.pt1 = makepoint(0, 0);
    screen.pt2 = makepoint(XMAX, YMAX);
    middle = makepoint((screen.pt1.x + screen.pt2.x) / 2, (screen.pt1.y + screen.pt2.y) / 2);

    printf("Middle point has coordinates (%d, %d)\n", middle.x, middle.y);
    return 0;
}
コード例 #5
0
ファイル: zad2.c プロジェクト: k0n1u/lab_c
int main()
{
	struct rect test1, test2;
	
	test1.ll=makepoint(0,0);
	test1.ur=makepoint(10,10);

	test2.ll=makepoint(9,9);
	test2.ur=makepoint(14,18);

	printf("rozłączny?: %d\n",disjointrect(test1,test2) );
}
コード例 #6
0
ファイル: struktury1.c プロジェクト: jfalecki/labc
int main()
{
	struct rect test1, test2;

	test1.ll=makepoint(0,0);
	test1.ur=makepoint(10,10);

	test2.ll=makepoint(2,2);
	test2.ur=makepoint(8,8);

	printf("%d\n",rectinrect(test2,test1));
}
コード例 #7
0
ファイル: PointerTest.c プロジェクト: carolemieux/daikon
int main()
{
  struct point origin, tenfive, *pointPtr, *basePtr;
  char buffer [100];
  char* offset;
  int i;

  origin = makepoint(34,45);
  printf("%p\n", &origin);
  printf("(%i,%i)\n", origin.x, origin.y);
  printf("\n");

  tenfive = makepoint(10,5);
  printf("%p\n", &tenfive);
  printf("(%i,%i)\n", tenfive.x, tenfive.y);

  printf("Size of struct point: %i\n", sizeof(struct point));

  pointPtr = malloc(5*(sizeof(struct point)));

  basePtr = pointPtr + 100;

  printf("pointPtr = %p\n", pointPtr++);
  printf("pointPtr + 1 = %p\n", pointPtr++);
  printf("pointPtr + 2 = %p\n", pointPtr++);
  printf("pointPtr + 3 = %p\n", pointPtr++);
  printf("pointPtr + 4 = %p\n", pointPtr);

  basePtr -= 100;

  free(basePtr);

  memset(buffer, 0, 100);
  writeCrap(buffer);
  offset = buffer + 20;
  writeCrap(offset);
  offset += 30;
  writeCrap(offset);

  for (i = 0; i < 100; i++) {
    char temp = buffer[i];
    if (temp >= 'a' && temp <= 'z') {
      printf("%c", temp);
    }
    else {
      printf("_");
    }
  }

  printf("\n");

  return 0;
}
コード例 #8
0
ファイル: struct_fn2.c プロジェクト: kimjh4930/cstudy
int main(){
	struct rect screen;
	struct point middle;

	makepoint(&screen.p1, 0, 0);
	makepoint(&screen.p2, XMAX, YMAX);
	makepoint(&middle, (screen.p1.x + screen.p2.x)/2, (screen.p1.y + screen.p2.y)/2);

	printf("middle : %d, %d\n", middle.x, middle.y);

	addpoint(&screen.p1, &middle);

	printf("screen.py : %d, %d\n", screen.p1.x, screen.p1.y);
}
コード例 #9
0
ファイル: test_rect.c プロジェクト: rdiachenko/books
int main()
{
	struct rect screen;
	screen.pt1 = makepoint(7, 1);
	screen.pt2 = makepoint(3, 10);
	struct rect canonscreen = canonrect(screen);
	printf("canon screen: (x1=%d, y1=%d), (x2=%d, y2=%d)\n", canonscreen.pt1.x, canonscreen.pt1.y, canonscreen.pt2.x, canonscreen.pt2.y);

	struct point inpoint = makepoint(4, 5);
	printf("point (%d, %d) in screen: %d\n", inpoint.x, inpoint.y, ptinrect(inpoint, canonscreen));

	struct point outpoint = makepoint(-1, -7);
	printf("point (%d, %d) out of screen: %d\n", outpoint.x, outpoint.y, ptinrect(outpoint, canonscreen));
	return 0;
}
コード例 #10
0
ファイル: prove.c プロジェクト: lmaddalena/algoritmi
//
// structures
void structures()
{		
	t_point *pt = makepoint(2, 3, "alfa");
	printpoint(pt);
	
	t_rect *rect = makerect(*makepoint(10, 10, "p1"), *makepoint(20, 20, "p2"));
	
	printrect(rect);
	printf("Area: %d\n", calcarea(rect));
	printf("Area: %d\n", calcarea2(*rect));
	
	free(pt);
	free(rect);
					
}
コード例 #11
0
int main()
{
    struct rect screen;
    struct point middle;
    struct point makepoint(int, int);
    screen.pt1 = makepoint(0,0);
    screen.pt2 = makepoint(XMAX, YMAX);
    middle = makepoint((screen.pt1.x + screen.pt2.x)/2,
                       (screen.pt1.y + screen.pt2.y)/2);
    printf("%d %d \n", middle.x, middle.y);

    struct point one = makepoint(1,1);
    printf("%d %d \n", (addpoint(middle, one)).x, (addpoint(middle, one)).y);

    return 0;
}
コード例 #12
0
ファイル: struct.c プロジェクト: haplesshero13/lcc-lc3
main() {
	int i;
	point x, origin = { 0, 0 }, maxpt = { 320, 320 };
	point pts[] = { -1, -1, 1, 1, 20, 300, 500, 400 };
	rect screen = makerect(addpoint(maxpt, makepoint(-10, -10)),
		addpoint(origin, makepoint(10, 10)));

	for (i = 0; i < sizeof pts/sizeof pts[0]; i++) {
		printf("(%d,%d) is ", pts[i].x,
			(x = makepoint(pts[i].x, pts[i].y)).y);
		if (ptinrect(x, screen) == 0)
			printf("not ");
		printf("within [%d,%d; %d,%d]\n", screen.pt1.x, screen.pt1.y,
			screen.pt2.x, screen.pt2.y);
	}
	odd(y);
	return 0;
}
コード例 #13
0
ファイル: ch0602_struct_fn01.c プロジェクト: kernel-bz/clang
int main ()
{
	//구조체 정의
	struct rect screen;
	struct point middle;

	screen.pt1 = makepoint (0,0);
	screen.pt2 = makepoint (XMAX, YMAX);
	middle = makepoint ((screen.pt1.x + screen.pt2.x)/2,
					    (screen.pt1.y + screen.pt2.y)/2);

	printf ("middle: %d, %d\n", middle.x, middle.y);

	screen.pt1 = addpoint (screen.pt1, middle);
	printf ("screen.pt1: %d, %d\n", screen.pt1.x, screen.pt1.y);

	printf("\nPress any key to end...");
	getchar(); 
	return 0;
}
コード例 #14
0
ファイル: structNfunc.c プロジェクト: girardimatthew/workshop
int main() {
    //structure declaration and tag
    struct point {
        int x;
        int y;
    };
    
    struct rect {
        struct point pt1;
        struct point pt2;
    };
    
    struct rect screen;
    struct point middle;
    struct point makepoint(int, int);
    
    screen.pt1 = makepoint(0, 0);
    screen.pt2 = makepoint(XMAX, YMAX);
    middle = makepoint((screen.pt1.x + screen.pt2.x)/2, (screen.pt1.y + screen.pt2.y)/2);
    
}
コード例 #15
0
ファイル: ch0602_struct_fn02.c プロジェクト: kernel-bz/clang
int main ()
{
	//구조체 정의
	struct rect screen;
	struct point middle;

	//구조체 멤버 연산자(. ->)는 포인터 연산자(& *)보다 우선순위가 높음
	makepoint (&screen.pt1, 0, 0);
	makepoint (&screen.pt2, XMAX, YMAX);
	makepoint (&middle
			  , (screen.pt1.x + screen.pt2.x)/2, (screen.pt1.y + screen.pt2.y)/2);

	printf ("middle: %d, %d\n", middle.x, middle.y);

	addpoint (&screen.pt1, &middle);
	printf ("screen.pt1: %d, %d\n", screen.pt1.x, screen.pt1.y);

	printf("\nPress any key to end...");
	getchar(); 
	return 0;
}
コード例 #16
0
int main()
{
	int T,i,j;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(i = 0; i < n; i++)
		{
			scanf("%lf%lf",&in[i].x,&in[i].y);
			line[i].y = true;
		}
		for(i = 1;i < n; i++)
		{
			if(in[i].x == in[i-1].x)
			{
				line[i].y = false;
				line[i].A = in[i].x;
			}
			else
			{
				line[i].A = (in[i].y-in[i-1].y)*1.0/(in[i].x-in[i-1].x);
				line[i].B = in[i-1].y - line[i].A*in[i-1].x;
			}
		}
		if(in[n-1].x == in[0].x)
		{
			line[0].y = false;
			line[0].A = in[0].x;
		}
		else
		{
			line[0].A = (in[0].y-in[n-1].y)*1.0/(in[0].x-in[n-1].x);
			line[0].B = in[n-1].y - line[0].A*in[n-1].x;
		}
		pnum = 0;
		for(i = 0; i < n; i++)
		{
			for(j = i+1; j < n; j++)
			{
				makepoint(line[i],line[j]);
			}
		}
		for(i = 0; i < pnum; i++)
			if(check(test[i]))
				break;
		if(i < pnum)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}
コード例 #17
0
int main() {
  struct point p, p1, p2;
  struct rect r;

  p1 = makepoint(4, 6);
  p2 = makepoint(6, 4);

  p = addpoints(p1, p2);

  /* p.x = 4;        // punkt, który ma odciętą 4
     p.y = 6;        // punkt, który ma odciętą 6
     (zamiast tego mamy makepoint) */

  printf("p = (%d, %d)\n", p.x, p.y);

  r = makerect(p1, p2);

  printf("r = (%d, %d) (%d, %d)\n", r.ll.x, r.ll.y, r.ur.x, r.ur.y);

  return 0;
}
コード例 #18
0
int main(void)
{
    double dist, sqrt(double);
    struct point *pp, pt, middle, ptmp;
    struct rect screen;

    pt = makepoint(320,240);
    ptmp = makepoint(640,480);
    printf("%d, %d\n", pt.x, pt.y);
    printf("%d, %d\n", ptmp.x, ptmp.y);
    ptmp = addpoint(pt, ptmp);
    pp = &ptmp;
    printf("%d, %d\n", (*pp).x, (*pp).y);
    printf("%d, %d\n", pp->x, pp->y);
    dist = sqrt((double)pt.x * pt.x + (double)pt.y * pt.y);
    printf("%f\n", dist);

    screen = makerect(makepoint(0,0), makepoint(XMAX, YMAX));
    middle = makepoint((screen.pt1.x + screen.pt2.x)/2,
            (screen.pt1.y + screen.pt2.y)/2);
    printf("%d, %d\n", middle.x, middle.y);
    pt = makepoint(2000,2000);
    printf(ptinrect(pt, screen) == 1 ? "point is in rec.\n ":"point is out rect.\n");
    return 0;
}
コード例 #19
0
ファイル: point.c プロジェクト: ddakhane/c
int main(void)
{
	struct point p1, p2;
	struct rect r;
	int value[4]; /* 一个矩形需要两个点,两个坐标决定一个点,共4个坐标 */
	int i, type;
	char s[MAXSIZE];

	i = 0;
	while ((type = getpoint(s)) != EOF) {
		if (type == NUMBER)
			value[i++] = aToi(s);
		if (i == 4) {
			i = 0;
			p1 = makepoint(value[0], value[1]);
			p2 = makepoint(value[2], value[3]);
			r.p1 = p1;
			r.p2 = p2;
			drawrect(r);
		}
	}
	return 0;
}
コード例 #20
0
ファイル: Chapter-6.c プロジェクト: brendan-kellam/learning-c
int main(){
	print(RED "running.." RESET);

	struct point pt = makepoint(10, 10);
	struct point * ppt = &pt;
	printf("%d\n", (int) ppt);
	++ppt->x;
	printf("x: %d  |  y: %d\n", pt.x, pt.y);

	/*
	pt = test2(pt);
	printf("x: %d  |  y: %d\n", pt.x, pt.y);
	*/

	//test();

	return 0;
}
コード例 #21
0
ファイル: Point.c プロジェクト: Nepetalactone/CUebungen
main()
{
	
	Point pt1 = makepoint(1, 2);
	Point pt2;

	pt2.x = 3;
	pt2.y = 4;
	
	Rect rec;
	rec.pt1 = pt1;
	rec.pt2 = pt2;
	
	printPoint(pt1);
	double sqr = sqrt((double)pt1.x * pt1.x + (double)pt1.y * pt1.y);
	printf("%f\n", dist(pt1));
	printf("%d\n", ptinrect(addpoint(pt1, pt2), rec));
	printf("%d\n", ptinrect(pt1, rec));
}
コード例 #22
0
ファイル: y4mhist.c プロジェクト: tufei/y4m.js
/* Here we draw the vectorscope layout */
void make_vectorscope_layout()
	{
	int i, p1_x, p1_y, p2_x, p2_y;
	double temp;
	char text[4];

	boxColor(screen, vector_x-130, vector_y+130, 
			 vector_x+130, vector_y-130, black); 

	hlineColor(screen, vector_x-20, vector_x-128, vector_y, white);
	hlineColor(screen, vector_x+20, vector_x+128, vector_y, white);
	vlineColor(screen, vector_x, vector_y-20, vector_y-128, white);
	vlineColor(screen, vector_x, vector_y+20, vector_y+128, white);
	circleColor(screen,vector_x, vector_y, 20, white);
	circleColor(screen,vector_x, vector_y, 50, white);
	circleColor(screen,vector_x, vector_y, 80, white);
	circleColor(screen,vector_x, vector_y,112, white);
	
	for (i =0; i<36; i++)
		{		/* Here we draw the degree scale */
			temp = 112* cos (i*(10/57.3)) ;  /* sin & cos only accept radiant */
			p1_x = round(temp);					/* and not degree input */
			temp = 112* sin (i*(10/57.3) );
			p1_y = round(temp);
			temp = 117* cos (i*(10/57.3) );
			p2_x = round(temp);
			temp = 117* sin (i*(10/57.3) );
			p2_y = round(temp);

			lineColor(screen, vector_x + p1_x, vector_y + p1_y,
									vector_x + p2_x, vector_y + p2_y, white);
		}

	sprintf(text, "0"); /* Creating the grad description */
	stringColor(screen, vector_x + 135 , vector_y - 3, text, white);
	sprintf(text, "90");
	stringColor(screen, vector_x - 7 , vector_y - 145, text, white);
	sprintf(text, "180");
	stringColor(screen, vector_x - 155 , vector_y - 3, text, white);
	sprintf(text, "270");
	stringColor(screen, vector_x - 10 , vector_y + 135, text, white);

	makepoint( 90, 60); /* length, arc, for purple */	
	makepoint( 96, 104); /* length, arc, for red */	
	makepoint( 67, 166); /* length, arc, for yellow */	
	makepoint( 90, 241); /* length, arc, for green */	
	makepoint( 96, 283); /* length, arc, for cyan */	
	makepoint( 67, 346); /* length, arc, for blue */	

	}
コード例 #23
0
int main(){

struct point a,b,c,d,e,f;
  a=makepoint(1,3);
  b=makepoint(3,4);
  c=makepoint(5,7);
  d=makepoint(7,9);
  e=makepoint(9,12);
  f=makepoint(11,15);

  struct rect K,L,M;
  K.ll=b; K.ur=c;
  L.ll=a; L.ur=d;
  M.ll=d; M.ur=e;


  printf("rectinrect(K,L):%d\n",rectinrect(K,L));
  printf("rectinrect(K,M):%d\n",rectinrect(K,M));
  

return 0;
}
コード例 #24
0
ファイル: Chapter-6.c プロジェクト: brendan-kellam/learning-c
void tut1(){
	struct rect screen;
	struct point middle;
	struct point makepoint(int, int);

	screen.pt1 = makepoint(0, 0);
	screen.pt2 = makepoint(XMAX, YMAX);
	middle = makepoint((screen.pt1.x + screen.pt2.x)/2, (screen.pt1.y + screen.pt2.y)/2);

	struct point pt1 = makepoint(10, 10);
	struct point pt2 = makepoint(20, 20);

	struct point tst = addpoint(pt1, pt2);

	printf("pt1~ x: %d | y: %d\n", pt1.x, pt1.y);
	printf("pt2~ x: %d | y: %d\n", pt2.x, pt2.y);
	printf("tst~ x: %d | y: %d\n", tst.x, tst.y);

	struct point origin,  *pp;
	origin = makepoint(0, 0);
	pp = &origin;
	printf("origin is (%d,%d)\n", pp->x, pp->y);

}
コード例 #25
0
struct rect screen;
struct point middle;
struct point makepoint(int, int);

screen.pt1 = makepoint(0, 0);
screen.pt2 = makepoint(XMAX, YMAX);
middle = makepoint((screen.pt1.x + screen.pt2.x)/2,
                   (screen.pt1.y + screen.pt2.y)/2);
コード例 #26
0
main()
{
    struct rect screen;
    struct point middle;
    struct point makepoint(int, int);
    struct point addpoint(struct point, struct point);
    int ptinrect(struct point, struct rect);
    struct rect canonrect(struct rect);
    
    screen.pt1 = makepoint(0, 0);
    screen.pt2 = makepoint(XMAX, YMAX);
    middle = makepoint((screen.pt1.x + screen.pt2.x)/2,
                       (screen.pt1.y + screen.pt2.y)/2);
    
    struct point origin, *pp;
    
    pp = &origin;
    /* printf("origin is (%d,%d)\n", (*pp).x, (*pp).y); */
    /* use the pp->x shorthand notation rather than (*pp).x */
    printf("origin is (%d,%d)\n", pp->x, pp->y);
    
    struct rect r, *rp = &r;
    /* all the following are equivalent */
    r.pt1.x;
    rp->pt1.x;
    (r.pt1).x;
    (rp->pt1).x;

    struct {
        int len;
        char *str;
    } q, *p;
    p = &q;
    char b[] = {'h', 'u', 'z', 'z', 'a', 'h', '\0'};
    q.len = strlen(b);
    q.str = b;
    printf("%s, %d\n", p->str, p->len);

    /* K&R p132 - ". and ->, together with () for function calls and [] for subscripts,
                   are at the top of the precedence hierarchy and thus bind bery tightly" */
    /* ie, this increments len, not p */
    ++p->len;
    printf("p->len now %d\n", p->len);
    /* which is same as */
    ++(p->len);
    printf("p->len now %d\n", p->len);

    /* this would increment p before accessing len */
    // (++p)->len;

    printf("*p->str fetches whatever str points to: %c\n", *p->str);

    printf("*p->str++ increments str after accessing whatever it points to: %c\n", *p->str++);
    printf("\t...so now *p->str yields: %c\n", *p->str);

    (*p->str)++;
    printf("(*p->str)++ increments whatever str points to: %c\n", *p->str);

    /* this would increment p after accessing whatever str points to */
    //(*p->str)++;
}
コード例 #27
0
ファイル: Mnorsar.c プロジェクト: 1014511134/src
int main(int argc, char* argv[])
{
    int nang, N;
    float dx, dz;
    int nx, nz;
    float ox, oz;
    int gnx, gnz;
    float gdx, gdz, gox, goz;
    struct point length;
    int inter;
    float TETAMAX, alpha2;
    FILE *outfile;
    int ii;
    int rays, wfront, gap;
    int lomx, first;
    int nr, nrmax, nt;
    int prcube, pr, ste;
    int ns, nou;
    float DSmax, dt, T, freq;
    float *vel;
    float ds, os, goox;
    float xmin, xmax, zmin, zmax;
    float depth;
    struct point *pos;
    struct heptagon *cube;
    struct grid *out;
    sf_file inp, ampl, time;

    sf_init(argc,argv);
    inp = sf_input("in");

/* GET MODEL PARAMETERS	*/
    if (!sf_histint(inp,"n1",&nz)) sf_error("No n1= in input");
    if (!sf_histint(inp,"n2",&nx)) sf_error("No n2= in input");
    if (!sf_histfloat(inp,"d1",&dz)) sf_error("No d1= in input");
    if (!sf_histfloat(inp,"d2",&dx)) sf_error("No d2= in input");
    if (!sf_histfloat(inp,"o1",&oz)) sf_error("No o1= in input");
    if (!sf_histfloat(inp,"o2",&ox)) sf_error("No o2= in input");

/* GET TRACING PARAMETERS */
    if(!sf_getint("nang",&nang))        nang = 10;    /* Number of take-off angles */
    if(!sf_getint("rays",&rays))        rays = 0;     /* If draw rays */
    if(!sf_getint("wfront",&wfront))    wfront = 0;   /* If draw wavefronts */ 
    if(!sf_getint("gap",&gap))        	gap = 1;      /* Draw wavefronts every gap intervals */
    if(!sf_getint("inter",&inter))      inter = 1;    /* If use linear interpolation */
    if(!sf_getfloat("DSmax",&DSmax))    DSmax = 5;    /* Maximum distance between contiguos points of a wavefront */
    if(!sf_getfloat("dt",&dt))          dt = 0.0005;  /* time step */
    if(!sf_getint("nt",&nt))            nt = 5;       /* Number of time steps between wavefronts */
    if(!sf_getint("nrmax",&nrmax))      nrmax = 2000; /* Maximum number of points that define a wavefront */
    if(!sf_getint("lomx",&lomx))        lomx = 1;     /* Use Lomax's waveray method */
    if(!sf_getint("first",&first))      first = 1;    /* Obtain first arrivals only */
    if(!sf_getint("nou",&nou))      	nou = 6;      

/* GET GRIDDING PARAMETERS */
    if(!sf_getint("gnx",&gnx))		gnx = nx;    /* Coordinates of output grid */
    if(!sf_getint("gnz",&gnz))		gnz = nz;
    if(!sf_getfloat("gdx",&gdx))	gdx = dx;
    if(!sf_getfloat("gdz",&gdz))	gdz = dz;
    if(!sf_getfloat("gox",&goox))	goox = ox;
    if(!sf_getfloat("goz",&goz))	goz = oz;

/* GET LOMAX SPECIFIC PARAMETERS */
    if(!sf_getint("N",&N))                N = 3;         /* Number of control points */
    if(!sf_getfloat("TETAMAX",&TETAMAX))  TETAMAX = 1.5; /* Truncation parameter */
    if(!sf_getfloat("alpha2",&alpha2))    alpha2 = 4.0;  /* Width of gaussian weighting function */
    if(!sf_getfloat("freq",&freq))	  freq = 100.;   /* Pseudo-frequency of waverays */

/* GET DEBUGGING INFO */
    if(!sf_getint("prcube",&prcube)) 	prcube=0;        /* For debugging porpouses */
    if(!sf_getint("pr",&pr)) 		pr=0;            /* For debugging porpouses */

/* GET SOURCE LOCATIONS */
    if(!sf_getint("ns",&ns) || ns==0)	  ns=1;          /* Number of source locations */
    if(!sf_getfloat("ds",&ds))		  ds=1.;         /* interval between sources */
    if(!sf_getfloat("os",&os))		  os=0.;         /* first source location */
    if(!sf_getfloat("depth",&depth))	  depth=dz;      /* Depth location of sources */

    pos = (struct point *) sf_alloc (ns,sizeof(struct point));
    for(ii=0;ii<ns;ii++) {
	pos[ii] = makepoint(ii*ds + os, depth);
    }

/* PREPARE OUTPUT */
    ampl = sf_output("ampl");
    sf_putint(ampl,"n1",gnz);
    sf_putint(ampl,"n2",gnx);
    sf_putint(ampl,"n3",ns);
    sf_putfloat(ampl,"d1",gdz);
    sf_putfloat(ampl,"d2",gdx);
    sf_putfloat(ampl,"d3",ds);
    sf_putfloat(ampl,"o1",goz);
    sf_putfloat(ampl,"o2",goox);
    sf_putfloat(ampl,"o3",os);

    time = sf_output("time");
    sf_putint(time,"n1",gnz);
    sf_putint(time,"n2",gnx);
    sf_putint(time,"n3",ns);
    sf_putfloat(time,"d1",gdz);
    sf_putfloat(time,"d2",gdx);
    sf_putfloat(time,"d3",ds);
    sf_putfloat(time,"o1",goz);
    sf_putfloat(time,"o2",goox);
    sf_putfloat(time,"o3",os);

/* READ VELOCITY MODEL */
    vel = sf_floatalloc(nx*nz+2);
    sf_floatread(vel,nx*nz,inp); 

/* ALLOCATE MEMORY FOR OUTPUT */
    out = (struct grid *) sf_alloc (1,sizeof(struct grid));

    out->time = sf_floatalloc (gnx*gnz);
    out->ampl = sf_floatalloc (gnx*gnz);
    out->flag = sf_intalloc (gnx*gnz);

    T = 1. / freq;

    length = makepoint((nx-1)*dx,(nz-1)*dz);

    cube = (struct heptagon *) sf_alloc (nrmax,sizeof(struct heptagon));

/* FOR DEBUGGING PORPOUSES, PRINT TO FILE */
    if(pr||prcube) {
	outfile = fopen("junk","w");
    } else {
	outfile = NULL;
    }

/*  SET DISPLAY IN ORDER TO SHOW RAYS ON SCREEN */
/*  NOTE: THIS PROGRAM USES DIRECT CALLS TO LIB_VPLOT
 *  TO DRAW THE RAYS AND THE WAVEFRONTS */
    if(rays || wfront) {
	setgraphics(ox, oz, length.x, length.z);
/*
	vp_color(BLUE);
	for(ii=0;ii<gnx;ii++)  {
	    vp_umove(ii*gdx+gox, goz); vp_udraw(ii*gdx+gox, (gnz-1)*gdz+goz); }
	for(ii=0;ii<gnz;ii++) {
	    vp_umove(gox, ii*gdz+goz); vp_udraw((gnx-1)*gdx+gox, ii*gdz+goz); } 
*/
    }

    norsar_init(gnx,gnz,
		TETAMAX,N,alpha2,inter,
		nx,nz,ox,oz,dx,dz,length);

/*  ALGORITHM: 
 *    For every source: */
    for(ii=0;ii<ns;ii++) {
	ste = 0;
	gox = goox + pos[ii].x;
	sf_warning("\nSource #%d\n", ii);

/*	1.- Construct the inital wavefront 			*/
	nr = nang;
    	initial (pos[ii], cube, vel, dt, nt, T, lomx, nr, out);

	gridding_init(gnx,gnz,
		      gdx,gdz,gox,goz,
		      outfile);

/*	run while the wavefront is not too small 		*/
	while (nr > 4) {
	    ste++;

/*	    2.- Propagate wavefront 				*/
	    wavefront (cube, nr, vel, dt, nt, T, lomx);
	    if(prcube || pr) {
		fprintf(outfile,"\n\nwavefront");
		printcube(cube, nr, outfile);
	    }

/*	    3.- Get rid of caustics				*/
            if(first) {
		if(ste%2==1) {			
		    caustics_up (cube, 0, nr);
		} else {
		    caustics_down (cube, nr-1, nr);
		}					
		if(prcube || pr) {	
		    fprintf(outfile,"\n\ncaustics");
		    printcube(cube, nr, outfile);
		}
	    }

/*          4.- Eliminate rays that cross boundaries, defined
		by xmin, xmax, zmin, zmax.
		Note that the computational grid is a little bigger 
		than the ouput grid. 				*/

	    xmin = gox-nou*gdx;	xmax = 2*pos[ii].x-gox+nou*gdx;
	    zmin = oz-nou*gdz;	zmax = length.z+oz+nou*gdz;
            mark_pts_outofbounds (cube, nr, xmin, xmax, zmin, zmax);
	    if(prcube) {
                fprintf(outfile, "\n\nboundaries");
                printcube(cube, nr, outfile);
            }

/*          5.- Rearrange cube                                  */
            makeup(cube, &nr);
	    if(nr<4) break;
	    if(prcube || pr) {	
                fprintf(outfile, "\n\nmakeup");
                printcube(cube, nr, outfile);
            }

/*          6.- Calculate amplitudes for new wavefront 		*/
	    amplitudes (cube, nr); 
	    if(prcube) {
                fprintf(outfile, "\n\namplitudes");
                printcube(cube, nr, outfile);
            }

/*	    7.- Draw rays 					*/
	    if(rays)
		draw_rays (cube, nr); 

/*          8.- Draw wavefront 					*/
	    if(wfront && (ste%gap==0)) 
		draw_wavefronts (cube, nr, DSmax); 

/*          9.- Parameter estimation at receivers 		*/
	    gridding (cube, nr, out, DSmax, (ste-1)*nt*dt, vel, first); /* pos[ii]); */

/*          10.- Interpolate new points of wavefront 		*/
            interpolation (cube, &nr, nrmax, DSmax); /* 0); */
	    if(prcube) {
                fprintf(outfile,"\n\ninterpolation");
                printcube(cube, nr, outfile);
            }

/*	    11.- Prepare to trace new wavefront 		*/
	    movwavf (cube, nr);
	    if(prcube) {
                fprintf(outfile,"\n\nmovwavf");
                printcube(cube, nr, outfile);
            }

	    if((wfront || rays) && (ste%gap==0)) vp_erase();
	}

/*	Finally interpolate amplitude and traveltime values to
        receivers that has not being covered.			*/
	TwoD_interp (out, gnx, gnz);

	sf_floatwrite(out->time, gnx * gnz, time); 
	sf_floatwrite(out->ampl, gnx * gnz, ampl);  
    }

   if(pr||prcube)
	fclose(outfile);

   exit(0);
}