Autor Beitrag
Timelesk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82


Delphi 2006 Prof
BeitragVerfasst: Do 14.12.06 21:32 
Hallo,

ich würde gerne eine Formel als Bild ausgeben.
Also nicht den Graphen zeichnen, sondern die Funktion an sich selbst ausgeben:

Wurzel( Wurzel( x² + 3/5 ) ) würde dementsprechend wie bei MathDraw angezeigt (Link zu MathDraw).

Gibt es dafür schon Ansätze?
Hab leider nichts über die Suche gefunden.

Danke für eure Hilfe

gruß
Timelesk
Dragonclaw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Do 14.12.06 21:52 
Hallo,

ein Ansatz wäre einfach eine Schleife durchlaufen zu lassen.

So könnte das aussehen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var x,y : Integer
begin
for x := -100 to 100 do
begin
y := trunc(sqrt(sqrt(x*x + 3/5)));
Form1.Canvas.Pixel[x,y] := clblack;
end;


Oder so in der Art.
Timelesk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82


Delphi 2006 Prof
BeitragVerfasst: Do 14.12.06 22:00 
Hmm,

ich meinte nicht, die Funktion als Kurve zu zeichnen, sondern einfach eine Formel mit Wurzelzeichen, richtigem Bruch, Pi-Zeichen etc. auszugeben...

Trotzdem Danke ;)

gruß
Timelesk
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Fr 15.12.06 05:03 
Da wirst du nich drumrum kommen dir einen Parser zu schreiben. Und dementsprechend was dir der Parser angibt musst du reagieren.

Mal ein Beispiel: Die Eingabe des User lautet "1/17". Der Parser muss erkennen, dass es sich hierbei um einen Bruch handelt. Und er muss erkennen, welche Zahlen im Zähler bzw. Nenner stehen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
type TBruch=record of
      Zaehler:integer;
      Nenner:integer;
     end;

function ParseBruch(s:string):TBruch;
begin
 Result.Zaehler:=strtoint(copy(s,1, (pos('/',s)-1)));
 Result.Nenner:=strtoint(copy(s, pos('/',s)+1, length(s)));
end;

procedure ZeichneBruch(b : TBruch);
begin
 with form1.paintbox1.canvas do begin
  textout(0,0,inttostr(b.Zaehler));
  textout(0,20,inttostr(b.Nenner));
  MoveTo(0,15);
  LineTo(length(inttostr(b.Nenner))*8, 15);
  //je nach Schriftart
 end;
end;
end;


Das rufst du auf mit ZeichneBruch(ParseBruch('1/50'))

Das war damit du dir mal grob vorstellen kannst was vor Dir liegt. Das Parsen ist eine verflucht komplizierte Angelegenheit. Das oben scheint auf den ersten Blick noch einfach zu sein. Aber was machst du wenn irgend so ein unverschämter User mal (1/2*x)/(sqrt(x^5)) eingibt...Dann wird das richtig schwer. Das zeichnen per Canvas wird da noch das einfachste sein.

Wenn ich sowas machen wollte würde ich allerdings die Usereingabe weglassen. Das spart dir unheimlich viel Zeit (du brauchst keinen Parser) und den Usern Nerven. Es ist nämlich bei langen Funktionen alles andere als überschaubar diese in ein Editfeld einzugeben.

Ich würde alle möglichen Formelvarianten vorgeben. Wenn man einen Bruch eingeben will, klickt man also auf ein Symbol mit einem Bruch, dann erscheinen zwei Edits untereinander angeordnet mit einem Strich dazwischen.
Timelesk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82


Delphi 2006 Prof
BeitragVerfasst: Fr 15.12.06 16:38 
Hallo,

danke für die Antwort.
Ich hatte mir so etwas ähnliches schon gedacht.
Das Problem dabei ist halt, dass man die Gesamt-Höhe herausfinden muss etc.

Das Programm soll eigentlich nur Aufgaben erstellen, welche man selbst auf Papier ausrechnen muss.
Und dazu gehört dann die Ausgabe der Funktion in nem Canvas (z.B. zum Ausdrucken).

Beispielaufgabe:
f(x) = x³ - 2(t-5x)² + 4/3 * x
Berechnen Sie:
- Extrempunkte
- absolutes Maxima/Minima
- die Tangentengleichung des Wendepunktes
- t, sodass die Tangente des Wendepunktes eine Waagrechte ist

und dann erechne ich mir mit dem Programm die Lösungen.
Funktionen selbst eingeben ist also somit nicht notwendig, wäre aber ein nettes Feature ;)

Ich werd mal schauen, wie und ob ich das Ganze umsetze.

Vielen Dank

gruß
Timelesk