002
21.06.2008, 16:09 Uhr
hatmax1
|
so vielen dank schonmal dafür.jetzt geht es ohne fehler, aber leider zeichnet es noch nix gescheites. zum compilieren braucht man die folgenden datein: bmp.h
| C++: |
/***************************************************************************** bmp.h
TASK header-file for bmp routines
STATUS 06/05/14 gi new *****************************************************************************/
int bmpRead (char*); int bmpNew (int,int); int bmpSave (char*); void bmpGetParameters (double*,double*,int*,int*,int*); void bmpGetPixel (int,int,int*,int*,int*); void bmpSetPixel (int,int,int,int,int); void bmpLine (int,int,int,int,int,int,int); void bmpBoldLine (int,int,int,int,int,int,int); void bmpPolyLine (int,int*,int*,int,int,int); void bmpBoldPolyLine (int,int*,int*,int,int,int); void bmpShow (void);
|
und bmp.lib: die ich hier leider nicht einfügen kann..
mein code sieht bisher so aus:
main.c
| C++: |
#include <stdio.h> #include <stdlib.h> #include <math.h> #include "bmp.h"
#define name #define PATH "g:\\name.bmp"
// Groesse des Bildes #define XDIM 640 #define YDIM 960
// Farbe fuer Koordinatensystem #define COLOR_C 0,0,0
// Farbe fuer Geschwindigkeit #define COLOR_V 255,0,0
// Farbe fuer Hoehe #define COLOR_H 0,255,0
// Erdanziehung #define G (-9.81)
/* Prototypen */
double einlesend(char * ausgabe); void plot(int c, double * y, int xn, int yn, int dimx, int dimy, int r, int g, int b); void koordsys(int xn, int yn,int dimx,int dimy, int r, int g, int b); double mind(double c, double * vec); double maxd(double c, double * vec); void zeichnen(void);
int main(int argc, char * argv[]) { /* Parameter fuer Simulation */ double bmass=10; // Ballmasse in kg double brad=0.1; // Ballradius in m double feder=1000; // Federkonstante in N/m double tstep = 0.001; // Schrittweite der Simulation double tend=10; // Simulationszeit in s double tmom; double tges; double h=8; // Fallhoehe in m double v = 0; // Anfangsgeschwindigkeit in m/s
int veclength = (int) tend / tstep; double * vvec; // Dynamisches Array fuer Geschwindigkeit double * hvec; // Dynamisches Array fuer Hoehe
int i; int j;
/*---- Eingabe ----*/
puts("Simulation eines Balls"); puts("Eingabe der Parameter fuer den Ball:");
puts("Parameter fuer Simulation");
//bmass = einlesend("Masse (kg): "); //brad = einlesend("Radius (m): "); //feder = einlesend("Federkonstante in N/m: "); //h = einlesend("Fallhoehe (m): "); v = 0; //tend = einlesend("Dauer der Simulation (s): ");
/*---- Verarbeitung ----*/ // Speicher fuer Ergebnisvectoren besorgen vvec = (double *) malloc(veclength * sizeof(double)); hvec = (double *) malloc(veclength * sizeof(double)); vvec[0] = v; hvec[0] = h;
for(i=j+1;tges+tstep<tend; ++i){ double dh,dv;
tmom=0; tmom+=tstep; do { dv = G*tmom; dh = h+0.5*G*tmom*tmom;
} while(dh>=brad);
do { vvec[i]=vvec[i-1]+tstep*(G+(feder*(brad-hvec[i-1]))/bmass); hvec[i]=hvec[i-1]+vvec[i]+tstep+(0.5*G+(feder*(brad-hvec[i-1]))/bmass)*tstep*tstep;
} while(dh<=brad);
do { vvec[i]=vvec[i-1]+G*tstep; hvec[i]=hvec[i-1]+vvec[i-1]*tstep+0.5*G*tstep*tstep; } while(dh>=brad);
vvec[i] = dv; hvec[i] = dh;
}
/*---- Ausgabe (Bild) ----*/
/* Neue Grafikdatei erzeugen */ bmpNew(XDIM,YDIM);
//bmpLine(0,0,10,10, 0,0,0);
/* Hoehe einzeichnen */ plot(veclength, hvec, 20, 520, 600, 420, COLOR_H); koordsys(20, 520,600,420,COLOR_C);
plot(veclength, vvec, 20, 20, 600, 420, COLOR_V); koordsys(20, 20,600,420,COLOR_V);
printf("Bild nach %s gespeichert\n",PATH); puts("Info:"); puts("Oben im Bild: Hoehe"); bmpSave(PATH);
free(vvec); free(hvec);
return 0; }
/* * Zeichnet die Punkte in y mit linien verbunden auf ein Bild * Parameter * c : Anzahl der Werte im Array y * y : Array mit den Zu plottenden Werten * xn : Beginn des Plottens x-Wert * yn : Beginn des Plottens y-Wert * dimx : Breite des Plottfeldes * dimy : H?he des Plottfeldes * r,g,b : Farbwert mit denen der Graph geplottet wird */ void plot(int c, double * y, int xn, int yn, int dimx, int dimy, int r, int g, int b){ int ynull, scalex; double ymin, ymax, scaley; double oldy,newy; int oldx,newx, i;
// Minimaler und Maximaler Wert die zu Plotten sind
ymin = mind(c,y); ymax = maxd(c,y);
// Skalierung in x und y Richtung (ceil aufrunden) scaley = (double) dimy / (ymax - ymin); scalex = ((double)c / (double)dimx);
// Nullpunkt fuer Koordinatensystem ynull = yn; // Unterster Punkt des Zeichenbereichs if(ymin < 0){ ynull += (-ymin) * (dimy/(ymax-ymin)); // Nullpunkt fuer Koordinatensystem => (xn,ynull) }
// Nulllinie Zeichnen bmpLine(xn,ynull,xn+dimx,ynull, r, g, b);
oldx = xn; // Beginn des Zeichnens oldy = (double)ynull + (y[0] * scaley);
for(i = 1; i < c; i++ ){
if((i%(scalex)) == 0){ // jeden scalex-ten wert zeichnen newx = oldx+1; newy = (double) ynull + (y[i] * scaley);
// Linie Zeichnen bmpLine(oldx,oldy,newx,newy, r,g,b);
oldx = newx; oldy = newy; }
} }
/* * Maximalwert im Array ermitteln * Parameter * c : Anzal der Felder in vec * vec : Array * * Rueckgabe * Groesster Wert im Array */ double maxd(double c, double * vec){ int i; // laufvariable int max=0xffffffff; // kleine moegliche Zahl (32bit) for(i=0; i<c; ++i){ if(vec[i] > max) max = vec[i]; } return max; }
/* * Minimalwert im Array ermitteln * Parameter * c : Anzal der Felder in vec * vec : Array * * R?ckgabe * Kleinster Wert im Array */ double mind(double c, double * vec) { int i; // laufvariable int min=0x7fffffff; // groesste moegliche Zahl for(i=0; i<c; ++i){ if(vec[i] < min) min = vec[i]; } return min; }
/* * Zeichnet Abzisse und Ordinate mit Pfeilspitzen * Paramerter * xn : x-Ursprung * yn : y-Ursprung * dimx: Breite * dimy: Hoehe * r,g,b: Farbwerte */ void koordsys(int xn, int yn,int dimx,int dimy, int r, int g, int b) { // Abzisse bmpLine(xn,yn, xn+dimx,yn,r,g,b); // Ordinate bmpLine(xn,dimy+yn,xn,yn, r,g,b);
// Pfeilspitzen // Abzisse bmpLine(xn+dimx, yn, xn+dimx-10, yn+5, r, g, b); bmpLine(xn+dimx, yn, xn+dimx-10, yn-5, r, g, b);
// Ordinate bmpLine(xn,yn+dimy, xn-5, yn+dimy-10, r, g, b); bmpLine(xn,yn+dimy, xn+5, yn+dimy-10, r, g, b); }
/* * Liest von der Tastatur einen Double wert ein * Gelingt die Eingabe nicht so wird zur erneuten Eingabe aufgefordert. * Parameter * ausgabe : Info die dem Benutzer praesentiert wird * Rueckgabe * eingelesener Double-Wert */ double einlesend(char * ausgabe) { double d;
// Benutzerinfo ausgeben printf("%s",ausgabe);
// Wert von der Tastatur einlesen while(scanf("%lf",&d) != 1) { printf("Fehler beim Einlesen, bitte nocheinmal: "); while('\n' != getchar()){} }
// Wert zurueckliefern return d; }
|
|