Computerhilfen.de Logo
Forum
Tipps
News

Turbo Pascal Zeichnen von Funktionen

Hi Leute,

ich möchte ein Programm schreiben mit dem Ich eine funktion zeichnen kann.

Program Grapho;
Uses crt, graph;
VAR Graphdriver,graphmode: integer;
   ms,a,b,c,i,x,y:INtEGER;
   weiter: boolean;
   ende: string;

Procedure Achsenkreuz;
 BEGIN
  line(100,240,540,240); (*Waagerechte Achse*)
  line(320,0,320,460); (*Senkrechte Achse*)

  i:=0;
   while i<440 do
   BEGIN
    i:=i+ms;
    line(315,i,325,i);
   END;

   i:=100;
   while i<520 do
    BEGIN
     i:=i+ms;
     line(i,235,i,245);
    END;
  END;

 ???Procedure Funktion;
 BEGIN
 x:=10;
 y:=x*x;
 LineTo(x,y);
 readln;
 END;


Procedure Endeingabe;
 BEGIN
  Repeat
   writeln('M”chten sie eine weitere Funktion zeichnen? (J/N):');
   readln(ende);
   FOR i:=1 to length(ende) DO
    ende:=UPCASE(ende);
  UNTIL (ende='J') or (ende='JA') or
        (ende='N') or (ende='NEIN');
  IF (ende='J') or (ende='Ja') THEN weiter:=true;
 END;

Begin
 Repeat
  ms:=20;
  ClrScr;

  Graphdriver:=detect;
  InitGraph(Graphdriver,Graphmode, 'C:\TP\BGI\');
  cleardevice;
  Achsenkreuz;
  Funktion;
  readln;
  Endeingabe;
  Readln;
 Until weiter=false
END.

Dies ist das Program das ich bis hier geschrieben habe. Jedoch gelingt es mir nicht die Procedure Funktion zu schreiben.

Ich hoffe jemand weiß bescheid und kann mir da helfen.
Vielen Dank für eure Mühen :'(


Antworten zu Turbo Pascal Zeichnen von Funktionen:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi,

sowas in der Art gabs schonmal.
Schau mal hier nach: http://www.computerhilfen.de/hilfen-14-54433-0.html

In Deiner "Funktion" müsste eine Art for-, oder besser while-Schleife, die alle x von -xmax bis xmax durchgeht, die entsprechenden y berechnet und den Punkt zeichnet. Dabei ist die Frage, wie gut die Genauigkeit sein soll (siehe Thread von oben), da Du sonst Lücken im Graphen hast bzw. (das Gegenteil) das Zeichnen lange dauert (was aber bei einem normal-beherzten Rechner nicht so das Problem sein sollte...)

Gruß Spawn

Wenn er mit der LineTo Funktion arbeitet entstehen keine "Lücken".

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Stimmt. Hab ich nicht drauf geachtet. Elegant, elegant...

Danke

den thread den du da gegeben hast habe ich auch schon versuch nur versteh ich ihn nur zur Hälfte und weiß nicht genau wie ich ihn verwende.
Dieses deltax hat irgendwie keine Bedeutung.
Könnte jemand das kurz erklären.

rangex := 5;
rangey := 5;
deltax := 0;
deltay := 0;
genauigkeit := 100;

for x := -rangex to rangex step (1/genuaigkeit) do
begin
  //step gibts in TP nicht, oder? Musst noch umbasteln...
  y := x*x; //oder whatever
  xa := 640 * (x + range x) / (2 * rangex);
  ya := 480 - 480 * (y + rangey) / (2 * rangey);
  Lineto(xa,ya);
end;

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Stimmt. Das deltax/y hatte ich ursprünglich mal dafür vorgesehen, falls Du die Funktion verschieben willst, sprich wenn der Koordinatenursprung nicht in der Mitte liegt. Ist aber gernicht implementiert.

Der Rest ist so zu verstehen: (ich machs mal in Einzelschritten und habe aus for ne while gemacht)

x:= -rangex;
//nun gehen wir alle x von -rangex bis x durch, also alle, die Du betrachten willst
while(x<=rangex) do
begin
  x := x+1;
  //genauigkeit brauchen wir nicht mehr, da Du ja LineTo nimmst
  y := x*x;
  //so, jetzt hast Du schonmal Deinen Funktionswert für x
  //jetzt muss aber noch x und y auf Bildschirmkoordinaten normiert werden
  xa := x + rangex;
  //so, jetzt liegt xa schonmal zwischen 0 und rangex+rangex (also 2*rangex)
  xa := xa / (2 * rangex);
  //so, nun liegt xa zwischen 0 und 1 -> normiert
  xa := xa * 640;
  //voila, xa liegt zwischen 0 und 640 also voll im Bildschrimsichtbereich
  ya := (y + rangey) / (2 * rangey);
  //analog x liegt y jetzt zwischen 0 und 1
  ya := ya * 480;
  //und nun zwischen 0 und 480;
  ya := 480 - ya;
  //da die Bildschirmkoordinaten im Vergleich zum kartesischen Koordinatensystem an der Horizontalen gespiegelt sind diese kleine Umformung
  Lineto(xa,ya);
  //so, jetzt hast Du es auch gezeichnet
end;

Einigermassen klar jetzt? Ich transformiere nur die x- und y-Werte um sie auf dem Bildschrim sichtbar auszugeben. Dabei wird der Bereich von -rangex bis rangex bzw. -rangey bis rangey so transformiert, dass er voll in 640x480 reinpasst.

Du solltest natürlich aufpassen, weiss nicht, wie die Auflösung bei TP ist, aber die Werte kannst Du ja ersetzen.
Ausserdem musst Du natürlich eine "gute" range für x und y wählen um Deine Funktion "schön" darzustellen.
Das könntest Du auch den Benutzer entscheiden lassen, per Eingabe oder so.

Viel Spass noch beim tüfteln. Spawn
« Letzte Änderung: 09.02.05, 19:49:40 von Spawn »

« Hilfe für Prologwill spiele programmieren »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!