14. november 2001 - 14:07Der er
4 kommentarer og 1 løsning
Grafisk funksjonskurve
Har en gammel tekstbasert c++ kompilator. Har tenkt å lage noen matematiske modeller der jeg behøver utskrift av en enkel grafisk kurve. Det vil kunne være godt nok å foreksempel få satt bokstaven \"x\" i rette posisjoner. Kan dette la seg gjøre ??
antag at dit vindue (DOS vindue?) er 80 tegn bredt og 24 tegn højt som på gamle tty-terminaler. Såfremt du skriver ud på papir kan du jo bare ændre dimensionerne tilsvarende.
Så skal du skalere din funktion til at tage input i området 0-79, samt levere output i området 0-23.
Dette gøres ved en lineær transformation i x-aksen på simpel vis af det oprindelige interval [a,b]. I y-aksen er det igen en lineær transformation fra [f-min,f-max], hvor f-min: den mindste værdi din funktion antager f-mamx: den største værdi din funktion antager.
Lav et 2-dimensionelt array af tegn, char output[24][80];
initialiser alle tegn til blank \' \' i output;
for (x=0; x<24; x++) { output[x][f(x)] = \'x\'; };
for (i=0; i<24; i++) { for (j=0; j<80; j++) cout<<output[i][j]; cout << endl; }
Hvilken kurve skulle det så beskrive? For det som jeg får ud af det ligner ikke noget andet end underlige tegn...
x og f(x) ligger jo som nøgler i arrayet, men skulle de ikke ligge som værdierne i stedet for? Ikke fordi at jeg er ekspert på området men jeg ville da tro at det er derfor jeg selv får så mærkeligt et resultat ud af det...
Nu beskrev jeg kun princippet, og overlod detaljerne i implementationen til langbein, men prøv at oversætte og køre flg. program fra en DOS-prompt i fuld-skærm:
// Ønsker at tegne funktionen f(x)=sin(x) i intervallet [-pi,+pi] // på simpel tekstuel vis på en tty-skærm med 71x21 tegn #include \"stdafx.h\" #include \"ostream.h\" #include \"math.h\"
double f(double x) { return sin(x); }
int main(int argc, char* argv[]) { int i,j; double a = -3.14, b = 3.14; double min = f(a), max = f(a); double h = (b-a)/70; char output[70+1][20+1];
// Beregn maximal og minimal værdi af funktionen f (til skalering i y-aksen) for (i=0; i<=70; i++) { double x = a + i*h; double y = f(x); if (y<min) min = y; if (y>max) max = y; }
// Lav \"tom\" output for (i=0; i<=70; i++) { for (j=0; j<=20; j++) { output[i][j] = \' \'; } }
// \"Tegn\" funktionen f i output for (i=0; i<=70; i++) { double x = a + i*h; double y = f(x); j = (int) ((20*(y-min)/(max-min)) + 0.5); // Skalering i y-aksen; 0.5 er for korrekt afrunding output[i][j] = \'x\'; }
// Skriv output ud på skærmen // Bemærk: Omvendt udskrivning i y-aksen pga. skærm-koordinater // starter i øverste venstre hjørne og ikke i nederste venstre hjørne for (j=20; j>=0; j--) { for (i=0; i<=70; i++) { cout << output[i][j]; } cout << endl; } return 0; }
Tak for det fine eksempel:) Jeg kunne ikke selv få det til at virke(dit eksempel virker fint):(
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.