Avatar billede langbein Nybegynder
14. november 2001 - 14:07 Der 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 ??
Avatar billede ttn.bonk Nybegynder
14. november 2001 - 21:18 #1
Ja, lav noget i stil med nedenstånde:

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;
}

Avatar billede langbein Nybegynder
15. november 2001 - 12:42 #2
Meget smart løsning ! Takker så mye !
Avatar billede problemer Nybegynder
16. november 2001 - 19:27 #3
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...
Avatar billede ttn.bonk Nybegynder
18. november 2001 - 12:50 #4
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;
}
Avatar billede problemer Nybegynder
18. november 2001 - 16:15 #5
Tak for det fine eksempel:)
Jeg kunne ikke selv få det til at virke(dit eksempel virker fint):(
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester