home *** CD-ROM | disk | FTP | other *** search
- #include <graph.h>
- #include <dos.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <float.h>
- #include <math.h>
-
- #define FLOAT "0123456789.eE-"
-
-
- struct vektor
- {
- double x;
- double y;
- double z;
- };
-
- typedef struct vektor VEKTOR;
-
- double getlen(VEKTOR *);
-
- VEKTOR a={140.2,290,0};
- VEKTOR b={290,150,0};
- VEKTOR c={340,338,0};
- VEKTOR d={245,265,230};
- VEKTOR dir={-80,-80,-256};
- VEKTOR traegheit;
- VEKTOR nullvektor={0,0,0};
- VEKTOR pos;
- double length=230;
- double f=5000000;
- double skal=30000;
- VEKTOR gravi={0,0,-100};
- double brems=1;
- union REGS regs;
- double yfakt=0.729166666;
-
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- VEKTOR kraft,akku,mem;
- double r,len;
- int ch;
-
- getvals();
- if(!strcmp(argv[1],"v"))
- {
- yfakt=1;
- _setvideomode(_VRES16COLOR);
- }
- else
- _setvideomode(_ERESCOLOR);
- mouseint(0);
- if(regs.x.ax!=0xffff)
- {
- printf("Keine Maus angeschlossen!\n");
- exit(1);
- }
-
- do
- {
- _settextposition(1,1);
- _outtext("<ESC>: Neustart + Bildschirm löschen");
- _settextposition(1,40);
- _outtext("sonst. Taste: Neustart");
- _settextposition(2,1);
- _outtext("linke Maustaste: Start");
- putpoint(&a,2);
- putpoint(&b,3);
- putpoint(&c,4);
- putpoint(&d,5);
-
- traegheit=nullvektor;
-
- _settextposition(2,48);
- _outtext("Rechte Maustaste: EXIT");
-
- do
- {
- _setcolor(7);
- _ellipse(_GBORDER,d.y-length,(d.x-length)*yfakt,d.y+length,(d.x+length)*yfakt);
-
- mouseint(1);
- do
- {
- regs.x.bx=1;
- mouseint(5);
- if(regs.x.bx!=0)
- {
- mouseint(2);
- _setvideomode(_DEFAULTMODE);
- return;
- }
- regs.x.bx=0;
- mouseint(5);
- }while(regs.x.bx==0);
-
- _settextposition(2,48);
- _outtext(" ");
- mouseint(2);
-
- pos.x=regs.x.dx/yfakt;
- pos.y=regs.x.cx;
- subvektor(&pos,&d,&dir);
- r=length*length-dir.x*dir.x-dir.y*dir.y;
- if(r<0)
- {
- _settextposition(24,0);
- _outtext("Es dürfen nur Punkte innerhalb des Kreises gewählt werden (Pendellänge)");
- _settextposition(25,35);
- _outtext("Taste drücken");
- getch();
- _settextposition(25,35);
- _outtext(" ");
- _settextposition(24,0);
- _outtext(" ");
- }
- }while(r<0);
-
- dir.z= -sqrt(r);
-
- do
- {
- putpoint(&a,2);
- putpoint(&b,3);
- putpoint(&c,4);
- putpoint(&d,5);
- addvektor(&d,&dir,&pos);
- putpoint(&pos,15);
- mem=pos;
-
- kraft=gravi;
-
- subvektor(&a,&pos,&akku);
- r=getlen(&akku);
- len=f/(r*r);
- geteinheit(&akku,&akku);
- mulkonst(&akku,len,&akku);
- addvektor(&akku,&kraft,&kraft);
-
- subvektor(&b,&pos,&akku);
- r=getlen(&akku);
- len=f/(r*r);
- geteinheit(&akku,&akku);
- mulkonst(&akku,len,&akku);
- addvektor(&akku,&kraft,&kraft);
-
- subvektor(&c,&pos,&akku);
- r=getlen(&akku);
- len=f/(r*r);
- geteinheit(&akku,&akku);
- mulkonst(&akku,len,&akku);
- addvektor(&akku,&kraft,&kraft);
- divkonst(&kraft,skal,&kraft);
- addvektor(&kraft,&traegheit,&kraft);
- addvektor(&dir,&kraft,&akku);
- geteinheit(&akku,&akku);
- mulkonst(&akku,length,&akku);
- subvektor(&akku,&dir,&traegheit);
- mulkonst(&traegheit,brems,&traegheit);
- dir=akku;
- putpoint(&mem,8);
- }while(!kbhit());
-
- ch=getch();
- if(ch==27)
- _clearscreen(_GCLEARSCREEN);
- }while(1);
- mouseint(2);
- _setvideomode(_DEFAULTMODE);
- }
-
- putpoint(VEKTOR *v,short col)
- {
- _setcolor(col);
- _setpixel((short)v->y,(short)v->x*yfakt);
- }
-
- addvektor(VEKTOR *a1,VEKTOR *a2, VEKTOR *e)
- {
- e->x=a1->x+a2->x;
- e->y=a1->y+a2->y;
- e->z=a1->z+a2->z;
- }
-
- subvektor(VEKTOR *a1,VEKTOR *a2, VEKTOR *e)
- {
- e->x=a1->x-a2->x;
- e->y=a1->y-a2->y;
- e->z=a1->z-a2->z;
- }
-
- double getlen(VEKTOR *v)
- {
- double l;
-
- l=v->x*v->x+v->y*v->y+v->z*v->z;
- return(sqrt(l));
- }
-
- geteinheit(VEKTOR *v1,VEKTOR *v2)
- {
- double len;
-
- len=getlen(v1);
- divkonst(v1,len,v2);
- }
-
- divkonst(VEKTOR *v1,double konst,VEKTOR *v2)
- {
- v2->x=v1->x/konst;
- v2->y=v1->y/konst;
- v2->z=v1->z/konst;
- }
-
- mulkonst(VEKTOR *v1,double konst,VEKTOR *v2)
- {
- v2->x=v1->x*konst;
- v2->y=v1->y*konst;
- v2->z=v1->z*konst;
- }
-
- mouseint(unsigned num)
- {
- regs.x.ax=num;
- int86(0x33,®s,®s);
- }
-
- getvals()
- {
- char str[100];
-
- sprintf(str,"%-10.2lf",f);
- printf("\nMagnetkonstante : ");
- string_eingeben(14,FLOAT,str);
- f=atof(str);
-
- sprintf(str,"%-10.2lf",skal);
- printf("\nSkalierung : ");
- string_eingeben(14,FLOAT,str);
- skal=atof(str);
-
- sprintf(str,"%-4.0lf",length);
- printf("\nPendellänge : ");
- string_eingeben(10,FLOAT,str);
- length=atof(str);
- d.z= 1.001*length;
-
- sprintf(str,"%-1.8lf",brems);
- printf("\nBremsfaktor : ");
- string_eingeben(10,FLOAT,str);
- brems=atof(str);
- }
-