Exemplo n.º 1
0
double UpdateAzim(struct control *pcontrol, sort *NN, data *Point, data **P)
/* function calculating the predicted f^ (azimuth) for a given location stored
   in Point.
   Function returns the azimuth between -pi/2 and pi/2, returns -pi if error 
   occured and pi if no azimuth could be calculated (for example if no neighbours
   were found */
{
  int NoNeighbour, i, use=TRUE, numnn;
  double azim, sumweights, sumquality;
  double Azimuth(double f1, double f2);
  int FindNNP(struct control *pcontrol, sort *NN, data *Point, data **P);
  int CalcWeightsP(struct control *pcontrol, data *Point);
  int CalcPredictor(struct control *pcontrol, data *Point);
  
  if ( (NoNeighbour = FindNNP(pcontrol, NN, Point, P)) < 0 )  {
     fprintf(stderr, "ERROR: occured in function FindNNP \n");
     return (-1) * pi;
  } else if  (NoNeighbour == TRUE) {
     if (debug)
        fprintf(stdout, " INFO: no neighbour for smoothing ... \n");
     return pi;
  }      
  if (CalcWeightsP(pcontrol, Point) != 0 )  {
     fprintf(stderr, "ERROR: occured in function CalcWeightsP \n");
     return (-1)*pi;
  }   
  if (CalcPredictor(pcontrol, Point) != 0 )  {
     fprintf(stderr, "ERROR: occured in function CalcPredictorP \n");
     return (-1)*pi;
  }   
  
  // number of neighbours for this location, define abreviation
  numnn = Point->numnn;
  
  // calculate the values needed to check if this point should be ignored 
  // due to a -I option
  use = TRUE;
  if (pcontrol->ConstNNRadius) {
     for (i=1, sumweights=0.0, sumquality=0.0; i<numnn; i++) {
         sumweights += Point->wnn[i];
         sumquality += Point->nn[i]->quality;
     }  
     
     if (pcontrol->IgnorePoint == ignore_n && numnn < pcontrol->IgnoreNum) {
        use = FALSE;
     } else if (pcontrol->IgnorePoint == ignore_w && sumweights < pcontrol->IgnoreNum) {
        use = FALSE;
     } else if (pcontrol->IgnorePoint == ignore_q && sumquality < pcontrol->IgnoreNum) {
        use = FALSE;
     } 
  }
  
  if (use) {
    azim = Azimuth(Point->f1,Point->f2);
    return azim;
  } else {
    return pi;
  }  
}  
Exemplo n.º 2
0
void animateCamera() {
  pScene   sc;
  pCamera  c;
  double   dazim,delev,azim,elev;
  float    cfelev,cfazim;

  if ( !animate || !ctracking )  return;
  sc = cv.scene[currentScene()];
  c  = sc->camera;
  azim  = Azimuth(c);
  elev  = Elevation(c);

  switch (cbutton) {
    case GLUT_LEFT_BUTTON:
      cfelev = 3.0;
      cfazim = 3.0;
      delev  = 2.0*(cury-starty)/(float)sc->par.ys;
      dazim  = 2.0*(curx-startx)/(float)sc->par.xs;
      if ( delev >= 0.0 ) delev *= delev;
      else                delev = -delev*delev;
      if ( dazim >= 0.0 ) dazim *= dazim;
      else                dazim  = -dazim*dazim;
      elev += cfelev * delev;
      azim -= cfazim * dazim;
      break;
    
    case GLUT_MIDDLE_BUTTON:
      break;
    case GLUT_BUTTON_3:
      puts("button3");
      break;
    case GLUT_BUTTON_4:
      puts("button4");
      break;
  }
  updateCamera(sc,c,azim,elev);
  reshapeScene(sc->par.xs,sc->par.ys);
  glutPostRedisplay();
}
Exemplo n.º 3
0
void motionCamera(int x,int y) {
  pScene   sc;
  pCamera  c;
  double   dazim,delev,azim,elev;
  float    cfelev,cfazim;

  /* keep current pos */
  curx = x;
  cury = y;

  if ( animate ) return;
  sc = cv.scene[currentScene()];
  c  = sc->camera;
  azim  = Azimuth(c);
  elev  = Elevation(c);
   switch (cbutton) {
    case GLUT_LEFT_BUTTON:
      cfelev = 50.0;
      cfazim = 50.0;
      delev  = cfelev * (y-starty)/(float)sc->par.ys;
      dazim  = cfazim * (x-startx)/(float)sc->par.xs;
      startx = x;
      starty = y;
      elev  += delev;
      azim  -= dazim;
      break;
    case GLUT_MIDDLE_BUTTON:
      break;
    case GLUT_BUTTON_3:
      puts("button3");
      break;
    case GLUT_BUTTON_4:
      puts("button4");
      break;
  }
  updateCamera(sc,c,azim,elev);
  reshapeScene(sc->par.xs,sc->par.ys);
  glutPostRedisplay();
}
Exemplo n.º 4
0
/* draw HUD system for flight */
void drawHUD(pScene sc) {
  pCamera  c;
  pMesh    mesh;
  GLfloat  xm,ym,x,y,dx,dy,alt;
  double   azim,elev;
  int      i,j;

  if ( ddebug )  fprintf(stdout,"drawHUD\n");
  glDisable(GL_DEPTH_TEST);
  glDisable(GL_LIGHTING);

  glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glLoadIdentity();
  gluOrtho2D(-0.5,639.5,-0.5,479.5);

  c  = sc->camera;
  mesh = cv.mesh[sc->idmesh];
  glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  glColor3f(0.0,0.5,0.0);
  glLineWidth(1.0f);
  xm = sc->par.xs / 2.0f;
  ym = sc->par.ys / 2.0f;
  glRecti(200,160,440,320);

  /* altitude */
  glColor3f(1.0,0.5,0.0);
  output2(230,330,"speed: %6.1f",1000.0f*c->spmod/sc->dmax);

  switch(c->vecup) {
    case X_AXIS: alt = (c->eye[1]+mesh->xtra)/(mesh->xmax-mesh->xmin); break;
    case Y_AXIS: alt = (c->eye[1]+mesh->ytra)/(mesh->ymax-mesh->ymin); break;
    case Z_AXIS: alt = (c->eye[1]+mesh->ztra)/(mesh->zmax-mesh->zmin); break;
    default: alt = 0.0;  break;
  }
  glColor3f(1.0,0.5,0.0);
  output2(350,330,"alt: %9.1f",1000.0f*alt);

  /* horiz rulers */
  output2(310,139.0f,"azim");
  glColor3f(0.0,1.0,0.0);
  output2(197,150,"-180");
  output2(257,150," -90");
  output2(317,150,"0");
  output2(377,150," 90");
  output2(437,150,"180");
  x = 200.0f;
  glBegin(GL_LINES);
  for (i=1; i<8; i++) {
    x += 240.0 / 8.0;
    glVertex2f(x,158.0);
    glVertex2f(x,162.0);
  }
  glEnd();
  
  /* vert rulers */
  glColor3f(0.0,1.0,0.0);
  output2(185,160,"-90");
  output2(185,200,"-45");
  output2(185,240,"0");
  output2(185,280,"45");
  output2(185,320,"90");
  y = 160.0f;
  glBegin(GL_LINES);
  for (i=1; i<8; i++) {
    y += 160.0 / 8.0;
    glVertex2f(198,y);
    glVertex2f(202,y);
  }
  glEnd();

  /* azimuth */
  azim = Azimuth(c);
  if ( azim > 0.0f )      azim =  180.0f - azim;
  else if ( azim < 0.0f ) azim = -180.0f - azim;
  x = 2.0/3.0*azim + 320.0f;
  glColor3f(1.0,0.0,0.0);
  glLineWidth(1.0);
  output2(x,143.0,"%d",azim>0 ? (int)(azim+0.5) : (int)(azim-0.5));
  glBegin(GL_LINES);
    glVertex2f(x,166.0);
    glVertex2f(x,318.0);
  glEnd();
  y  = 160.0f;
  dy = 160.0 / 8.0;
  glBegin(GL_LINES);
  for (i=0; i<8; i++) {
    glVertex2f(x-4,y);
    glVertex2f(x+4,y);
    for (j=0; j<5; j++) {
      glVertex2f(x-2,y+j*dy/5.0);
      glVertex2f(x+2,y+j*dy/5.0);
    }
    y += dy;
  }
  glEnd();
  
  /* elevation */
  elev = Elevation(c);
  if ( elev > 90.0f )       y = 320.0f;
  else if ( elev < -90.0f ) y = 160.0f;
  else y = 8.0/9.0 * elev + 240.0;
  glColor3f(1.0,0.0,0.0);
  output2(175.0,y,"%5.1f",elev);
  glBegin(GL_LINES);
    glVertex2f(206.0,y);
    glVertex2f(438.0,y);
  glEnd();
  x  = 200.0f;
  dx = 240.0f / 8.0f;
    glBegin(GL_LINES);
  for (i=1; i<=8; i++) {
    glVertex2f(x,y-4);
    glVertex2f(x,y+4);
    for (j=0; j<5; j++) {
      glVertex2f(x+j*dx/5.0,y-2);
      glVertex2f(x+j*dx/5.0,y+2);
    }
    x += dx;
  }
  glEnd();

  /* horizon */
  glLineWidth(2.0f);
  glColor3f(0.0,0.0,1.0);
  glBegin(GL_LINES);
    glVertex2f(200.0,240.0);
    glVertex2f(440.0,240.0);
  glEnd();
  glLineWidth(1.0f);

  /* HUD */
  glColor3f(1.0,0.0,0.0);
  glBegin(GL_LINES);
    glVertex2f(310,230);
    glVertex2f(330,230);
    glVertex2f(310,250);
    glVertex2f(330,250);
    
    glVertex2f(310,230);
    glVertex2f(310,234);
    glVertex2f(330,230);
    glVertex2f(330,234);
    
    glVertex2f(310,246);
    glVertex2f(310,250);
    glVertex2f(330,246);
    glVertex2f(330,250);
  glEnd();
  /*glRecti(318,238,322,242);*/
  glColor3f(0.0,1.0,0.0);
  glLineWidth(3.0f);
  glBegin(GL_LINES);
    glVertex2f(320.,235.);
    glVertex2f(320.,245.);
    glVertex2f(315.,240.);
    glVertex2f(325.,240.);
  glEnd();
  glLineWidth(1.0f);
  
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();
  glMatrixMode(GL_MODELVIEW);
  glEnable(GL_DEPTH_TEST);
}
Exemplo n.º 5
0
int main(int argc, char *argv[])
{
	int		x, y;
	unsigned char	sitenum, metric, error;
	double		distance, azimuth;
	struct		site point[2];

	if (argc==1)
	{
		fprintf(stdout,"\nProvides distance and azimuth bearing between two site locations.\n");
		fprintf(stdout,"\nUsage: bearing site1(.qth) site2(.qth)");
		fprintf(stdout,"\n       bearing site1(.qth) site2(.qth) -metric\n\n");
		fflush(stdout);
		return 1;
	}

	metric=0;
	error=0;
	y=argc-1;
	sitenum=0;

	point[0].lat=91.0;
	point[0].lon=361.0;
	point[1].lat=91.0;
	point[1].lon=361.0;

	/* Scan for command line arguments */

	for (x=1; x<=y; x++)
	{
		if (strcmp(argv[x],"-metric")==0)
		{
			metric=1;
			x++;
		}

		/* Read Receiver Location */

		if (x<=y && argv[x][0] && argv[x][0]!='-' && sitenum<2)
		{
			point[sitenum]=LoadQTH(argv[x]);

			if (point[sitenum].lat>90.0 || point[sitenum].lon>360.0)
				fprintf(stderr,"\n%c*** \"%s\" is not a valid .qth file!",7,argv[x]);
			else
				sitenum++;
		}
	}

	if (sitenum<2)
	{
		fprintf(stderr,"\n%c*** ERROR: Not enough valid sites specified!\n\n",7);
		exit (-1);
	}

	for (x=0; x<sitenum; x++)
	{
		if (point[x].lat>90.0 && point[x].lon>360.0)
		{
			fprintf(stderr,"\n*** ERROR: site #%d not found!",x+1);
			error=1;
		}
	}

	if (error)
		return -1;

	else
	{
		/* Perform the calculations and display the results */

		distance=Distance(point[0],point[1]);
		azimuth=Azimuth(point[0],point[1]);

		printf("\nThe distance between %s and %s is\n",point[0].name, point[1].name);

		if (metric)
			printf("%.2f kilometers",distance*KM_PER_MILE);
		else
			printf("%.2f miles",distance);

		printf(" at a bearing of %.2f%c azimuth.\n\n",azimuth, 176);
	}

	return 0;
}
Exemplo n.º 6
0
/* special keys CAMERA mode */
void specCamera(pScene sc,int key) {
  pCamera     c;
  double      dd,azim,elev;
  GLfloat     axe[3];
  int         keyact;
  
  c  = sc->camera;
  keyact = glutGetModifiers();

  axe[0] = c->speed[2];
  axe[1] = 0.0;
  axe[2] = -c->speed[0];
  dd = sqrt(axe[0]*axe[0] + axe[2]*axe[2]);
  if ( dd != 0.0f ) {
    axe[0] /= dd;
    axe[2] /= dd;
  }

  switch (key) {
  case GLUT_KEY_LEFT:
    if ( keyact & GLUT_ACTIVE_SHIFT ) {
      c->eye[0] += axe[0]*c->altinc;
      c->eye[2] += axe[2]*c->altinc;
      reshapeScene(sc->par.xs,sc->par.ys);
      glutPostRedisplay();
      return;
    }
    else {
      azim = Azimuth(c);
      elev = Elevation(c);
      azim += dazim;
    }
    break;
  case GLUT_KEY_RIGHT:
    if ( keyact & GLUT_ACTIVE_SHIFT ) {
      c->eye[0] -= axe[0]*c->altinc;
      c->eye[2] -= axe[2]*c->altinc;
      reshapeScene(sc->par.xs,sc->par.ys);
      glutPostRedisplay();
      return;
    }
    else {
      azim = Azimuth(c);
      elev = Elevation(c);
      azim -= dazim;
    }
    break;
  case GLUT_KEY_UP:
    if ( keyact & GLUT_ACTIVE_SHIFT ) {
      c->eye[1] += c->altinc;
      reshapeScene(sc->par.xs,sc->par.ys);
      glutPostRedisplay();
      return;
    }
    else {
      azim = Azimuth(c);
      elev = Elevation(c);
      elev -= delev;
    }
    break;
  case GLUT_KEY_DOWN:
    if ( keyact & GLUT_ACTIVE_SHIFT ) {
      c->eye[1] -= c->altinc;
      reshapeScene(sc->par.xs,sc->par.ys);
      glutPostRedisplay();
      return;
    }
    else {
      azim = Azimuth(c);
      elev = Elevation(c);
      elev += delev;
    }
    break;
  default:
    return;
  }

  updateCamera(sc,c,azim,elev);

  /* refresh scene */
  reshapeScene(sc->par.xs,sc->par.ys);
  glutPostRedisplay();
}