home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / games / mpendel / pendel.c next >
Encoding:
C/C++ Source or Header  |  1991-01-02  |  4.9 KB  |  256 lines

  1. #include <graph.h>
  2. #include <dos.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <float.h>
  6. #include <math.h>
  7.  
  8. #define FLOAT "0123456789.eE-"
  9.  
  10.  
  11. struct vektor
  12. {
  13.   double x;
  14.   double y;
  15.   double z;
  16. };
  17.  
  18. typedef struct vektor VEKTOR;
  19.  
  20. double getlen(VEKTOR *);
  21.  
  22. VEKTOR a={140.2,290,0};
  23. VEKTOR b={290,150,0};
  24. VEKTOR c={340,338,0};
  25. VEKTOR d={245,265,230};
  26. VEKTOR dir={-80,-80,-256};
  27. VEKTOR traegheit;
  28. VEKTOR nullvektor={0,0,0};
  29. VEKTOR pos;
  30. double length=230;
  31. double f=5000000;
  32. double skal=30000;
  33. VEKTOR gravi={0,0,-100};
  34. double brems=1;
  35. union REGS regs;
  36. double yfakt=0.729166666;
  37.  
  38.  
  39. main(argc,argv)
  40. int argc;
  41. char *argv[];
  42. {
  43.   VEKTOR kraft,akku,mem;
  44.   double r,len;
  45.   int ch;
  46.  
  47.   getvals();
  48.   if(!strcmp(argv[1],"v"))
  49.   {
  50.     yfakt=1;
  51.     _setvideomode(_VRES16COLOR);
  52.   }
  53.   else
  54.     _setvideomode(_ERESCOLOR);
  55.   mouseint(0);
  56.   if(regs.x.ax!=0xffff)
  57.   {
  58.     printf("Keine Maus angeschlossen!\n");
  59.     exit(1);
  60.   }
  61.  
  62.   do
  63.   {
  64.     _settextposition(1,1);
  65.     _outtext("<ESC>: Neustart + Bildschirm löschen");
  66.     _settextposition(1,40);
  67.     _outtext("sonst. Taste: Neustart");
  68.     _settextposition(2,1);
  69.     _outtext("linke Maustaste: Start");
  70.     putpoint(&a,2);
  71.     putpoint(&b,3);
  72.     putpoint(&c,4);
  73.     putpoint(&d,5);
  74.  
  75.     traegheit=nullvektor;
  76.  
  77.     _settextposition(2,48);
  78.     _outtext("Rechte Maustaste: EXIT");
  79.  
  80.     do
  81.     {
  82.       _setcolor(7);
  83.       _ellipse(_GBORDER,d.y-length,(d.x-length)*yfakt,d.y+length,(d.x+length)*yfakt);
  84.  
  85.       mouseint(1);
  86.       do
  87.       {
  88.     regs.x.bx=1;
  89.     mouseint(5);
  90.     if(regs.x.bx!=0)
  91.     {
  92.       mouseint(2);
  93.       _setvideomode(_DEFAULTMODE);
  94.       return;
  95.     }
  96.     regs.x.bx=0;
  97.     mouseint(5);
  98.       }while(regs.x.bx==0);
  99.  
  100.       _settextposition(2,48);
  101.       _outtext("                      ");
  102.       mouseint(2);
  103.  
  104.       pos.x=regs.x.dx/yfakt;
  105.       pos.y=regs.x.cx;
  106.       subvektor(&pos,&d,&dir);
  107.       r=length*length-dir.x*dir.x-dir.y*dir.y;
  108.       if(r<0)
  109.       {
  110.     _settextposition(24,0);
  111.     _outtext("Es dürfen nur Punkte innerhalb des Kreises gewählt werden (Pendellänge)");
  112.     _settextposition(25,35);
  113.     _outtext("Taste drücken");
  114.     getch();
  115.     _settextposition(25,35);
  116.     _outtext("             ");
  117.     _settextposition(24,0);
  118.     _outtext("                                                                       ");
  119.       }
  120.     }while(r<0);
  121.  
  122.     dir.z= -sqrt(r);
  123.  
  124.     do
  125.     {
  126.       putpoint(&a,2);
  127.       putpoint(&b,3);
  128.       putpoint(&c,4);
  129.       putpoint(&d,5);
  130.       addvektor(&d,&dir,&pos);
  131.       putpoint(&pos,15);
  132.       mem=pos;
  133.  
  134.       kraft=gravi;
  135.  
  136.       subvektor(&a,&pos,&akku);
  137.       r=getlen(&akku);
  138.       len=f/(r*r);
  139.       geteinheit(&akku,&akku);
  140.       mulkonst(&akku,len,&akku);
  141.       addvektor(&akku,&kraft,&kraft);
  142.  
  143.       subvektor(&b,&pos,&akku);
  144.       r=getlen(&akku);
  145.       len=f/(r*r);
  146.       geteinheit(&akku,&akku);
  147.       mulkonst(&akku,len,&akku);
  148.       addvektor(&akku,&kraft,&kraft);
  149.  
  150.       subvektor(&c,&pos,&akku);
  151.       r=getlen(&akku);
  152.       len=f/(r*r);
  153.       geteinheit(&akku,&akku);
  154.       mulkonst(&akku,len,&akku);
  155.       addvektor(&akku,&kraft,&kraft);
  156.       divkonst(&kraft,skal,&kraft);
  157.       addvektor(&kraft,&traegheit,&kraft);
  158.       addvektor(&dir,&kraft,&akku);
  159.       geteinheit(&akku,&akku);
  160.       mulkonst(&akku,length,&akku);
  161.       subvektor(&akku,&dir,&traegheit);
  162.       mulkonst(&traegheit,brems,&traegheit);
  163.       dir=akku;
  164.       putpoint(&mem,8);
  165.     }while(!kbhit());
  166.  
  167.     ch=getch();
  168.     if(ch==27)
  169.       _clearscreen(_GCLEARSCREEN);
  170.   }while(1);
  171.   mouseint(2);
  172.   _setvideomode(_DEFAULTMODE);
  173. }
  174.  
  175. putpoint(VEKTOR *v,short col)
  176. {
  177.   _setcolor(col);
  178.   _setpixel((short)v->y,(short)v->x*yfakt);
  179. }
  180.  
  181. addvektor(VEKTOR *a1,VEKTOR *a2, VEKTOR *e)
  182. {
  183.   e->x=a1->x+a2->x;
  184.   e->y=a1->y+a2->y;
  185.   e->z=a1->z+a2->z;
  186. }
  187.  
  188. subvektor(VEKTOR *a1,VEKTOR *a2, VEKTOR *e)
  189. {
  190.   e->x=a1->x-a2->x;
  191.   e->y=a1->y-a2->y;
  192.   e->z=a1->z-a2->z;
  193. }
  194.  
  195. double getlen(VEKTOR *v)
  196. {
  197.   double l;
  198.  
  199.   l=v->x*v->x+v->y*v->y+v->z*v->z;
  200.   return(sqrt(l));
  201. }
  202.  
  203. geteinheit(VEKTOR *v1,VEKTOR *v2)
  204. {
  205.   double len;
  206.  
  207.   len=getlen(v1);
  208.   divkonst(v1,len,v2);
  209. }
  210.  
  211. divkonst(VEKTOR *v1,double konst,VEKTOR *v2)
  212. {
  213.   v2->x=v1->x/konst;
  214.   v2->y=v1->y/konst;
  215.   v2->z=v1->z/konst;
  216. }
  217.  
  218. mulkonst(VEKTOR *v1,double konst,VEKTOR *v2)
  219. {
  220.   v2->x=v1->x*konst;
  221.   v2->y=v1->y*konst;
  222.   v2->z=v1->z*konst;
  223. }
  224.  
  225. mouseint(unsigned num)
  226. {
  227.   regs.x.ax=num;
  228.   int86(0x33,®s,®s);
  229. }
  230.  
  231. getvals()
  232. {
  233.   char str[100];
  234.  
  235.   sprintf(str,"%-10.2lf",f);
  236.   printf("\nMagnetkonstante : ");
  237.   string_eingeben(14,FLOAT,str);
  238.   f=atof(str);
  239.  
  240.   sprintf(str,"%-10.2lf",skal);
  241.   printf("\nSkalierung : ");
  242.   string_eingeben(14,FLOAT,str);
  243.   skal=atof(str);
  244.  
  245.   sprintf(str,"%-4.0lf",length);
  246.   printf("\nPendellänge : ");
  247.   string_eingeben(10,FLOAT,str);
  248.   length=atof(str);
  249.   d.z= 1.001*length;
  250.  
  251.   sprintf(str,"%-1.8lf",brems);
  252.   printf("\nBremsfaktor : ");
  253.   string_eingeben(10,FLOAT,str);
  254.   brems=atof(str);
  255. }
  256.