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

📄 earth.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 * ***************************************************** * * earth.c * * Routines for creating fancy earth model * * $Id: earth.c,v 1.20 2005/02/07 19:21:56 lloydwood Exp $ */#include <stdio.h>#include <math.h>#include "gv_utils.h"#include "utils.h"#include "constants.h"#include "globals.h"#include "coverage_vis.h"#include "savi.h"unsigned int earth_on_flag = FALSE;unsigned int earth_geom_exists = FALSE;unsigned int use_fancy_earth = FALSE;unsigned int given_temp_scratchfile = FALSE;static unsigned int earth_texture_loaded = FALSE;static double m[4][4]; /* identity matrix used for rotating Earth */static void earth_create_geom(void);static void earth_delete_geom(void);/* * earth_create_geom */static voidearth_create_geom(void){  if (earth_geom_exists)    return;  /*   * initialise the identity matrix   */  identity(m);  if (geomview_module) {    /* create a simple blue sphere for the earth */    gv_create_geom("Central_Body", "central_t", "unit_sphere_h");  }  earth_geom_exists = TRUE;}/* * earth_delete_geom */static voidearth_delete_geom(void){  if (!earth_geom_exists)    return;  if (geomview_module) {    gv_delete_geom("Central_Body");  }  earth_geom_exists = FALSE;}/* * earth_on_cmd * * Displays the earth sphere, dull or detailed. */char *earth_on_cmd(int argc, char *argv[]){  if (earth_on_flag)    return EMPTY_str;  earth_on_flag = TRUE;  if (use_fancy_earth) {    if (geomview_module) {      gv_start();      if (texture_flag) {	if (earth_texture_loaded) {	  coverage_send_static_file();	} else {	  earth_texture_loaded = gv_sendfile("oogl/earth_h.oogl");	}        if (earth_texture_loaded) {	  if (geomview_dynamic_texture_flag) {	    	  }	  if (geomview_texture_with_map || !geomview_dynamic_texture_flag) {	    /*	     * scratchfile textures written after foreground map added;	     * vector Earth redundant.	     */	    gv_create_geom("Central_Body", "central_t", "earth_h");	  } else {	    gv_create_geom("Central_Body", "central_t", "earth_vect_texture_sphere_h");	  }	  earth_geom_exists = TRUE;	} else {	  error("could not load earth texture file.");	}      } else {	gv_create_geom("Central_Body", "central_t", "earth_vect_sphere_h");	earth_geom_exists = TRUE;      }      gv_stop();    }  } else {    /* just draw sphere */    earth_create_geom();  }  return EMPTY_str;}/* * earth_off_cmd * * Destroy the earth sphere */char *earth_off_cmd(int argc, char *argv[]){  if (!earth_on_flag)    return EMPTY_str;  earth_on_flag = FALSE;  if (use_fancy_earth) {      /* we nest in gv_start/stop to hide temporary cosmetic changes -       * this is the same idea used when loading tcl scripts       * to prevent incremental per-new-satellite drawing updates.       */      if (geomview_module) gv_start();      fancy_off_cmd(argc, argv);      fancy_on_cmd(argc, argv);      if (geomview_module) gv_stop();  } else {     /* just destroy sphere */     earth_delete_geom();  }  return EMPTY_str;}/* * fancy_on_cmd * * Creates a fancy model of the earth by using vector * or loading texture-map file. */char *fancy_on_cmd(int argc, char *argv[]){  if (use_fancy_earth)    return EMPTY_str;  use_fancy_earth = TRUE;  if (geomview_module) {    gv_start();    if (earth_on_flag) {      if (texture_flag) {	if (earth_texture_loaded) {	  coverage_send_static_file();	} else {	  earth_texture_loaded = gv_sendfile("oogl/earth_h.oogl");	}        if (earth_texture_loaded) {	  if (geomview_texture_with_map || !geomview_dynamic_texture_flag) {	    /*	     * scratchfile textures written after foreground map added;	     * vector Earth redundant.	     */	    gv_create_geom("Central_Body", "central_t", "earth_h");	  } else {	    gv_create_geom("Central_Body", "central_t", "earth_vect_texture_sphere_h");	  }	  earth_geom_exists = TRUE;	} else {	  error("could not load earth texture file.");	}      } else {	gv_create_geom("Central_Body", "central_t", "earth_vect_sphere_h");	earth_geom_exists = TRUE;      }    } else {      /*       * draw only outline continents - ideal for spherical and       * hyperbolic projections.       */      gv_create_geom("Central_Body", "central_t", "earth_vect_clear_h");      earth_geom_exists = TRUE;    }    gv_stop();  }  return EMPTY_str;}/* * fancy_off_cmd * * Returns to a simple sphere to model the central body */char *fancy_off_cmd(int argc, char *argv[]){  char *status = EMPTY_str;  if (!use_fancy_earth)    return EMPTY_str;  use_fancy_earth = FALSE;  if (earth_on_flag) {    if (geomview_module) gv_start();    status = earth_off_cmd(argc, argv);    status = earth_on_cmd(argc, argv);    if (geomview_module) gv_stop();  } else {    earth_delete_geom();  }  return status;}/* * texture_on * * Use texture mapping for fancy earth model */char *texture_on_cmd(int argc, char *argv[]){  char *status = EMPTY_str;  texture_flag = TRUE;  if (earth_on_flag) {    if (geomview_module) gv_start();    status = earth_off_cmd(argc, argv);    status = earth_on_cmd(argc, argv);    if (geomview_module) gv_stop();  }  return status;}/* * texture_off_cmd * * Use vect model for fancy earth model */char *texture_off_cmd(int argc, char *argv[]){  char *status = EMPTY_str;  texture_flag = FALSE;  if (earth_on_flag) {    if (geomview_module) gv_start();    status = earth_off_cmd(argc, argv);    status = earth_on_cmd(argc, argv);    if (geomview_module) gv_stop();  }  return status;}/* * geomview_dynamic_texture_on */char *geomview_dynamic_texture_on_cmd(int argc, char *argv[]){  char *status = EMPTY_str;  if (geomview_module) {    if (!given_temp_scratchfile) {      given_temp_scratchfile = coverage_tempfile_created();    }    if (given_temp_scratchfile) {      geomview_dynamic_texture_flag = TRUE;      if (texture_flag) {	if (geomview_module) gv_start();	status = texture_off_cmd(argc, argv);	status = texture_on_cmd(argc, argv);	if (geomview_module) gv_stop();      }    } else {      error("unable to create coverage scratchfile. Disabling dynamic texturemapping.");      geomview_dynamic_texture_flag = FALSE;    }  }  return status;}/* * geomview_dynamic_texture_off */char *geomview_dynamic_texture_off_cmd(int argc, char *argv[]){  char *status = EMPTY_str;  if (geomview_module && given_temp_scratchfile && geomview_dynamic_texture_flag) {      if (texture_flag) {	if (geomview_module) gv_start();	status = texture_off_cmd(argc, argv);	geomview_dynamic_texture_flag = FALSE;	status = texture_on_cmd(argc, argv);	if (geomview_module) gv_stop();      }  } else {    geomview_dynamic_texture_flag = FALSE;  }  return status;}/* * earth_place * * rotates the earth to correct position for time t */voidearth_place(double t, const CentralBody * pcb){  double theta, ct, st;  /*   * Don't waste time rotating nothing.   */  if (!earth_geom_exists)    return;  /*   * Don't waste time rotating a featureless blue sphere.   */  if (!use_fancy_earth)    return;  theta = t * pcb->rotation_rate;  ct = cos(theta);  st = sin(theta);  /*   * update elements of an existing identity matrix   */  m[0][0] = ct;  m[0][1] = st;  m[1][0] = -st;  m[1][1] = ct;  gv_transform("central_t", m);}

⌨️ 快捷键说明

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