⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 satellites.c

📁 卫星仿真软件 卫星仿真软件 卫星仿真软件
💻 C
字号:
/* ***************************************************** * *  SaVi by Robert Thurman (thurman@geom.umn.edu) and *          Patrick Worfolk (worfolk@alum.mit.edu). * *  Copyright (c) 1997 by The Geometry Center. *  This file is part of SaVi.  SaVi is free software; *  you can redistribute it and/or modify it only under *  the terms given in the file COPYRIGHT which you should *  have received along with this file.  SaVi may be *  obtained from: *  http://savi.sourceforge.net/ *  http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * satellites.c * * routines for satellites in Geomview * * $Id: satellites.c,v 1.10 2005/02/01 22:30:29 lloydwood Exp $ */#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <math.h>#include "globals.h"#include "constants.h"#include "gv_file.h"#include "gv_utils.h"#include "sats.h"#include "orbit_utils.h"#include "savi.h"static unsigned int satellites_on_flag = FALSE;static unsigned int satellites_geom_exists = FALSE;static unsigned int satellites_geom_needs_updating = FALSE;static unsigned int use_box_satellite = FALSE;static unsigned int use_planes_satellite = FALSE;static unsigned int use_fancy_satellite = FALSE;static char box_hname[] = "box_satellite_h";static char box_special_hname[] = "box_special_satellite_h";static char planes_hname[] = "planes_satellite_h";static char planes_special_hname[] = "planes_special_satellite_h";static char fancy_hname[] = "fancy_satellite_h";static char fancy_special_hname[] = "fancy_special_satellite_h";/* * routine to display satellites */char *satellites_on_cmd(int argc, char *argv[]){  if (satellites_on_flag)    return EMPTY_str;  satellites_on_flag = TRUE;  satellites_geom_needs_updating = TRUE;  gv_start();  if (use_box_satellite || use_planes_satellite || use_fancy_satellite) {    transforms_needed |= (1 << SATELLITES);    /* and send them too */    gv_trans_list_create(get_constellation()->satellites);  }  write_satellites_geom(get_constellation());  gv_stop();  return EMPTY_str;}/* * satellites_off_cmd() * * Routine to turn off display of satellites */char *satellites_off_cmd(int argc, char *argv[]){  if (!satellites_on_flag)    return EMPTY_str;  satellites_gv_delete();  satellites_geom_needs_updating = FALSE;  satellites_on_flag = FALSE;  return EMPTY_str;}/* * routine to display fancy satellites */char *fancy_sat_on_cmd(int argc, char *argv[]){  if (use_fancy_satellite)    return EMPTY_str;  use_box_satellite = FALSE;  use_planes_satellite = FALSE;  use_fancy_satellite = TRUE;  if (satellites_on_flag) {    transforms_needed |= (1 << SATELLITES);    satellites_geom_needs_updating = TRUE;    gv_start();    gv_trans_list_create(get_constellation()->satellites);    write_satellites_geom(get_constellation());    gv_stop();  }  return EMPTY_str;}/* * routine to display crossing-planes satellites */char *planes_sat_on_cmd(int argc, char *argv[]){  if (use_planes_satellite)    return EMPTY_str;  use_box_satellite = FALSE;  use_fancy_satellite = FALSE;  use_planes_satellite = TRUE;  if (satellites_on_flag) {    transforms_needed |= (1 << SATELLITES);    satellites_geom_needs_updating = TRUE;    gv_start();    gv_trans_list_create(get_constellation()->satellites);    write_satellites_geom(get_constellation());    gv_stop();  }  return EMPTY_str;}/* * routine to display box satellites */char *box_sat_on_cmd(int argc, char *argv[]){  if (use_box_satellite)    return EMPTY_str;  use_fancy_satellite = FALSE;  use_planes_satellite = FALSE;  use_box_satellite = TRUE;  if (satellites_on_flag) {    transforms_needed |= (1 << SATELLITES);    satellites_geom_needs_updating = TRUE;    gv_start();    gv_trans_list_create(get_constellation()->satellites);    write_satellites_geom(get_constellation());    gv_stop();  }  return EMPTY_str;}/* * Routine to turn off display of fancy satellites */char *fancy_sat_off_cmd(int argc, char *argv[]){  if (!use_fancy_satellite)    return EMPTY_str;  use_fancy_satellite = FALSE;  if (satellites_on_flag) {    transforms_needed &= ~(1 << SATELLITES);    satellites_geom_needs_updating = TRUE;    gv_start();    write_satellites_geom(get_constellation());    gv_stop();  }  return EMPTY_str;}/* * Routine to turn off display of crossing-plane satellites */char *planes_sat_off_cmd(int argc, char *argv[]){  if (!use_planes_satellite)    return EMPTY_str;  use_planes_satellite = FALSE;  if (satellites_on_flag) {    transforms_needed &= ~(1 << SATELLITES);    satellites_geom_needs_updating = TRUE;    gv_start();    write_satellites_geom(get_constellation());    gv_stop();  }  return EMPTY_str;}/* * Routine to turn off display of box satellites */char *box_sat_off_cmd(int argc, char *argv[]){  if (!use_box_satellite)    return EMPTY_str;  use_box_satellite = FALSE;  if (satellites_on_flag) {    transforms_needed &= ~(1 << SATELLITES);    satellites_geom_needs_updating = TRUE;    gv_start();    write_satellites_geom(get_constellation());    gv_stop();  }  return EMPTY_str;}char *satellites_set_cmd(int argc, char *argv[]){  Constellation *pconstellation = get_constellation();  Satellite s;  int n = atoi(argv[2]);  unsigned int flag = atoi(argv[3]);  s = constellation_search(pconstellation, n);  if (s) {    if (flag)      s->can_display_satellite = 1;    else      s->can_display_satellite = 0;    satellites_geom_needs_updating = TRUE;  }  return EMPTY_str;}/* * satellites_gv_delete * * routine to delete geomview satellites object */voidsatellites_gv_delete(){  if (satellites_geom_exists) {    gv_delete_geom("Satellites");    satellites_geom_exists = FALSE;  }}/* * satellite_display * * Takes a satellite and displays it */voidsatellite_display(Satellite s, const Constellation * pconstellation){  satellites_geom_needs_updating = TRUE;}/* * satellites_relocate * * Moves a satellite into its proper position */voidsatellites_relocate(const Constellation * pconstellation){  /* fancy satellites automatically updated from transformation matrices */  if (use_fancy_satellite)    return;  satellites_geom_needs_updating = TRUE;  gv_start();  write_satellites_geom(pconstellation);  gv_stop();}/* * satellite_delete * * Takes a satellite and deletes it on the display */voidsatellite_delete(Satellite s){  satellites_geom_needs_updating = TRUE;}voidwrite_satellites_geom(const Constellation * pconstellation){  Satellite s;  Satellite_list sl;  unsigned int i, num_view_sats, num_tag_sats;  num_view_sats = pconstellation->n_view_sats;  num_tag_sats = pconstellation->n_tag_sats;  if (satellites_on_flag && satellites_geom_needs_updating) {    satellites_geom_needs_updating = FALSE;    /* if no sats then delete the Satellites gv object */    if ((num_view_sats == 0) &&	(num_tag_sats == 0)) {      satellites_gv_delete();      return;    }    if (use_box_satellite || use_planes_satellite || use_fancy_satellite) {      /* write out new list of all satellites */      sl = pconstellation->satellites;      gv_send("(geometry Satellites {LIST\n");      while (sl) {	s = sl->s;	if (sl->s->can_display_satellite) {	  if (use_box_satellite) {	    fprintf(gv_out, "{INST transform:trans_%d geom:%s}\n", s->id,		    s->tag ? box_special_hname : box_hname);	  } else if (use_planes_satellite) {	    fprintf(gv_out, "{INST transform:trans_%d geom:%s}\n", s->id,		    s->tag ? planes_special_hname : planes_hname);	  } else {	    /* use fancy satellite */	    fprintf(gv_out, "{INST transform:trans_%d geom:%s}\n", s->id,		    s->tag ? fancy_special_hname : fancy_hname);	  }	}	sl = sl->next;      }      gv_send("})\n");    } else {      /* write out as a LIST of VECT */      gv_send("(geometry Satellites {LIST\n");      /* write out all viewable satellites as a single VECT */      if (num_view_sats > 0) {       if (GV_BINARY_FORMAT_AVAILABLE) {	u_int32_t ibuf[3];	float fbuf[3];	float rgba[] = { 0, 1, 0, 1 };	/* green */	u_int16_t zero_one_buf[] = { 0, 1 };	u_int16_t *zero = zero_one_buf;	u_int16_t *one = zero_one_buf + 1;	/* convert stuff to big endian format */	htons_buffer(zero, 2);	/* send VECT header */	gv_send("{appearance {linewidth 7} VECT BINARY\n");	/* send: n_view_sats n_view_sats 1 */	ibuf[0] = ibuf[1] = num_view_sats;	ibuf[2] = 1;	htonl_buffer(ibuf, 3);	gv_send_binary_ints(ibuf, 3);	/* send n_view_sats number of short 1s */	for (i = 0; i < num_view_sats; i++) {	  gv_send_binary_shorts(one, 1);	}	/* send short 1 followed by n_view_sats-1 number of short 0s */	gv_send_binary_shorts(one, 1);	for (i = 1; i < num_view_sats; i++) {	  gv_send_binary_shorts(zero, 1);	}	/* for each satellite to view, send 3 floats describing position */	for (sl = pconstellation->satellites; NULL != sl; sl = sl->next) {	  s = sl->s;	  if (s->can_display_satellite) {	    fbuf[0] = s->transform[3][0];	    fbuf[1] = s->transform[3][1];	    fbuf[2] = s->transform[3][2];	    htonl_buffer((u_int32_t *) fbuf, 3);	    gv_send_binary_floats(fbuf, 3);	  }	}	/* send color */	htonl_buffer((u_int32_t *) rgba, 4);	gv_send_binary_floats(rgba, 4);	gv_send("}\n");       } else {	gv_send("{appearance {linewidth 7} VECT\n");	fprintf(gv_out, "%d %d 1\n", num_view_sats, num_view_sats);	for (i = 0; i < num_view_sats; i++) {	  gv_send("1 ");	}	gv_send("\n1 ");	for (i = 1; i < num_view_sats; i++) {	  gv_send("0 ");	}	gv_send("\n");	for (sl = pconstellation->satellites; NULL != sl; sl = sl->next) {	  s = sl->s;	  if (s->can_display_satellite) {	    fprintf(gv_out, "%f %f %f\n", s->transform[3][0],		    s->transform[3][1], s->transform[3][2]);	  }	}	gv_send("0 1 0 1}\n");       }      }      /* write out any tagged satellites */      if (num_tag_sats > 0) {	fprintf(gv_out, "{appearance {linewidth 15} VECT\n%d %d 1\n",		num_tag_sats, num_tag_sats);	for (i = 0; i < num_tag_sats; i++) {	  gv_send("1 ");	}	gv_send("\n1 ");	for (i = 1; i < num_tag_sats; i++) {	  gv_send("0 ");	}	gv_send("\n");	for (sl = pconstellation->satellites; NULL != sl; sl = sl->next) {	  s = sl->s;	  if (s->tag) {	    fprintf(gv_out, "%f %f %f\n", s->transform[3][0],		    s->transform[3][1], s->transform[3][2]);	  }	}	gv_send("1 1 0 1}\n");      }      /* close LIST object */      gv_send("})\n");    }    satellites_geom_exists = TRUE;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -