Bardziej astronomiczny przykład użycia biblioteki PGPLOT

Licencja Creative Commons

Autorem poniższego opracowania (wraz z kodem źródłowym i rysunkami) jest dr Piotr A. Dybczyński z Instytutu Obserwatorium Astronomiczne UAM w Poznaniu.

Napiszmy taki programik:



/*****************************************************************************
****                               fig_04.c                               ****
******************************************************************************
****                                                                      ****
****     Kopia fig_03.c ale zamieniona na przykład programu               ****
****     wykorzystującego bibliotekę graficzną PGPLOT                     ****
****                                                                      ****
****                                                                      ****
******************************************************************************
*                                                                            *
*                                                                            *
******************************************************************************
****              Created by PAD, last modified:  28-10-2008              ****
*****************************************************************************/


#include <stdio.h>
#include <math.h>
#include "cpgplot.h"



int main(void)
{

  int i,k,n;

  float x0,y0,z0,x,y,z,r,r0,t,xp,yp,zp;

  double kat,eps,rot,rot1;

  k=cpgopen("?"); /* taki argument powoduje, że progam zapyta, gdzie rysować... */
  if(k!=1) {
             puts("\n\ncpgopen error\n");
             return 0;
           }    


  cpgslw(6); /* ustalamy grubość linii na 6 */

  cpgenv(-512,512,-384,384,1,-2); /* definiujemy obszar rysowania, z równymi skalami w x i y , oraz bez ramki i osi */

  x0=0;
  y0=0;
  z0=0;
  r0=360;
  /* poniżej, trzy eksperymentalnie dobrane wartości kątów, by rysunek był "ładny" */
  kat=70.0/180.0*M_PI;
  rot=50.0/180.0*M_PI;
  rot1=107.0/180.0*M_PI;

  cpgsfs(2); /* ustalamy, że figury rysowane będą bez wypełnienia */

  cpgsci(4);/* rysujemy na niebiesko */

  cpgtext(-210,-270,"Sfera niebieska");

  cpgcirc(x0,y0,r0); /*rysujemy obrys sfery niebieskiej */

  cpgsci(3); /* rysujemy na zielono */

  /* ta pętla prymitywnie, po kropce, rysuje okrąg nachylony pod katem 70 stopni, tu równik niebieski*/
  for(t=0;t<(2.0*M_PI);t+=0.0001)
     {

       x=r0*cos(t);
       y=r0*sin(t)*cos(kat);
       cpgpt1(x,y,-1); /* ta funkcja stawia kropkę w miejscu (x,y) */
     }

  cpgsci(2); /* rysujemy na czerwono */

  /* a ta pętla ta samą prostą technika rysuje południk */
  for(t=M_PI;t<(2.0*M_PI);t+=0.0001)
     {

       x=r0*cos(t);
       y=r0*sin(t)*cos(rot);
       xp=x*cos(rot1)-y*sin(rot1);
       yp=x*sin(rot1)+y*cos(rot1);

       cpgpt1(xp,yp,-1);
     }


  cpgsci(1); /* rysujemy na czarno */

  /*rysujemy promienie wodzące */    
  x=0;
  y=360.0*cos(20.0/180.0*M_PI);
  cpgpt1(0,y,-1);    
  cpgdraw(0,0);
  cpgdraw(245,-89);

  cpgclos();
  return 0;
}
 


Fig_04
Wynik zadziałania programu "./fig_04"
[Tu wersja postscriptowa].

Jeśli zapiszemy go w pliku fig_04.c, wykonamy polecenie: "gcc -Wall fig_04.c -o fig_04 -lcpgplot -lpgplot -lpng -lz -lX11 -lm" , to powstanie na dysku wykonywalny plik o nazwie "fig_04".

Spróbujmy go wykonać poleceniem: "./fig_04"

Jeśli klepniemy Enter wybierając urządzenie domyślne (/xwindow) pojawi się okienko a w nim rysunek, jak obok.

Jeśli klikniemy na pokazaną obok miniaturkę, zobaczymy obrazek w pełnej rozdzielczości. Jest to plik w formacie PNG, otrzymany po uruchomieniu tego samego programu "./obrazek", ale po wybraniu urządzenia "/VCPS" (od ang. Vertical Color PostScript).

Powstała w ten sposób wersja postscript -owa tego obrazka, którą następnie przerobiłem GIMP -em na bitmapę wysokiej rozdzielczości, "zmiękczyłem" dla zasymulowania "antialiasingu" i pomniejszyłem.




Licencja Creative Commons

Edytuj