Luki1987
Ihr wollt Wacker sein?
|
Hey. Also da ich bald einmal Matura habe (u.a. auch in Informatik), will ich ein bisschen daraufhin üben. Also mein Spezialgebiet ist "Grafikprogrammierung in Delphi". Darum soll ich versuchen, diese Aufgabe hier zu bewältigen:
Es soll ein Funktionsgraph einer unveränderlichen Funktion gezeichnet werden (in meinem Fall habe ich 3*x³+2*x²-5*x-4 gewählt). Dazu habe ich ein Image mit der Größe 400x400 verwendet. Jetzt muss noch eine Tangente auf einen, sich verändernden Punkt, gelegt werden (siehe unten).
Nun hier der bisherige Code:
------------------------------------------------------------------------------------
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Label1: TLabel; Button2: TButton; ScrollBar1: TScrollBar; Panel1: TPanel; procedure Button1Click(Sender: TObject); procedure ScrollBar1Change(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; x_echt,y_echt:real; x_bild,y_bild:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin image1.Canvas.Brush.Color:=clblack; image1.Canvas.MoveTo(0,200); image1.canvas.LineTo(400,200); image1.Canvas.MoveTo(200,0); image1.Canvas.LineTo(200,400); for i:=-10000 to 10000 do begin x_echt:=i/1000; y_echt:=(3*x_echt*x_echt*x_echt+2*x_echt*x_echt-5*x_echt-4); x_bild:=round(200+x_echt*20); y_bild:=round(200-y_echt*20); image1.Canvas.Pixels[x_bild,y_bild]:=clred; end; button1.Visible:=false; button2.Visible:=true; scrollbar1.Visible:=true; panel1.Visible:=true; end;
procedure TForm1.ScrollBar1Change(Sender: TObject); begin panel1.Caption:=floattostr((scrollbar1.position)/10); end;
procedure TForm1.Button2Click(Sender: TObject); var x1,y1:integer; begin x1:=scrollbar1.position; y1:=9*x1*x1+4*x1-5;
end;
end.
------------------------------------------------------------------------------------
Ich muss jetzt eine Tangente auf den Punkte legen, den man mit dem Scrollbar einstellt (also mit dem Scrollbar wählt man die X-Koordinate des Punktes auf den die Tangente kommt)...
Ich schaffe es aber einfach net, die Tangentengleichung gscheit aufzustellen. Ich mein, die Steigung hab ich jetzt eh mit y1 angegeben, aber wie zeichne ich die Gerade? Mit moveto, lineto?
Big TIA... mfG
Bearbeitet von Luki1987 am 02.06.2005, 19:14
|
Luki1987
Ihr wollt Wacker sein?
|
Solved. Es hat mit der brush.color zu tun gehabt  Wenn man das zweite brush.color (mit dem man die Farbe auf rot ändert) rausgibt und es dann so macht: image1.Canvas.Pixels[x_bild,y_bild]:=clred; geht es ohne Probleme... mfG
|
Luki1987
Ihr wollt Wacker sein?
|
Update im ersten Post: Neues Problem mit der Tangente... mfG
|
watchout
Legendundead
|
also wenn ich mich richtig erinnere solltest du die tangentenfunktion in der form y=k*x+d wunderbar zeichnen können. Verwende doch einfach die gleiche Methode die du für die Funktion verwendest und zeichne die Tangente als neue Funktion einfach darüber. Ach ich seh erst jetzt dass deine Graphikfunktion nichtmal eine Funktion im Programm ist - Das solltest du unbedingt nachholen. Mehr Funktionen - kennt sich ja keiner aus sonst (ok, ohne highlighting muss ich zugeben ists auf jeden fall mühsam, wenn du wieder code zum herzeigen hast lad' ihn besser als .txt rauf, dann bleibt die formatierung zumindest) Wenn du darin Matura hast würde ich dir raten mehr zu üben - der Stil kommt mir noch sehr unsicher vor. Zur Tangente: du hast deinen Punkt (und ich nehme jetzt mal an du rechnest mit Single) Du berechnest mit deiner Funktion (die ich dir oben geraten habe zu erstellen) dx = 0.0002; dy = f(x+dx/2)-f(x-dx/2); k = dy/dx; d = f(x)-k*x zack: deine neue Funktion heisst t(x) = k*x+d wenn du beim zeichnen nen klugen step nimmst (klug soll heissen bildbreite) macht die performance auch kein prob... hab auch mal sowas in php geproged mit gd ausgabe - macht was her
|
Luki1987
Ihr wollt Wacker sein?
|
@Matura/Stil: Das ist glaub ich net so tragisch. Wir sind ein sprachenorientiertes Bundesgymnasium und der Quellcode ist den Typen da glaub ich ziemlich egal. Bis auf meinen Info-Lehrer sitzen da alles DAUs drinnen, die nur sehen, ob das Programm funktioniert oder nicht... Wir haben Delphi auch nie wirklich vertiefend gemacht. Von HTML, Javascript, Robolab und eben Delphi die Grundlagen, mehr nicht... @Lösungsvorschläge: Danke, das hilft mir weiter. Aber dx und dy bzw. k hab ich eh schon durch die 1. Ableitung berechnet, das sollte also erledigt sein... Ich brauch also nur mehr das d. Btw. was heißt "gd ausgabe"?  Thx. mfG
|
watchout
Legendundead
|
ja, das d steht eh auch da...  einen code für ne ableitung kann ich nicht sehen - deswegen wusste ichs eben nicht, dass du die schon hast... Trotzdem solltest an deinem Stil arbeiten, hilft ja auch dir wennst dich nicht 5min danach wundern musst was du da gemacht hast...  gd-output? sowas: http://www.noob2k.com/watchouts_scripts/graph.phpoutput als png mittels der GD-Library
|
Luki1987
Ihr wollt Wacker sein?
|
Geh, oida, ich check das mit der Tangente einfach nicht... Hier noch einmal der Code (sorry, dass ich die Zeichenfunktion noch immer net seperat gemacht hab, ich will einfach einmal, dass es funktioniert, dann kümmere ich mich um die Einzelheiten). Also der Berührungspunkte der Tangente ist T(xt|yt). k hab ich mithilfe der 1. Ableitung der Funktion und dann mit xt errechnet. d fehlt mir (das hab ich derzeit auf 0 gesetzt, damit ich sehe, ob die Steigung stimmt - tut sie aber nicht, er zeichnet meistens gar nichts, nur bei k=0 fährt er die x-Achse nach)... Argh, ich werd noch wahnsinnig.... Hier der Code in .txt-Form: click here Big, big TIA! mfG Edit: Hier noch einmal die Zeilen, die für k ausschlaggebend sind: xt:=scrollbar1.position; k:=9*xt*xt+4*xt-5; Stimmt das so?
Bearbeitet von Luki1987 am 02.06.2005, 13:09
|
watchout
Legendundead
|
nah, das kommt mir komisch vor - mach erst mal gscheide funktionen, dann kennst dich auch gleich viel besser aus... ausserdem gscheite namen für die buttons.
Dann: ein Button is nicht da eine Funktion auszuführen, sondern nur eine Berechnung anzuwerfen, wenn du den Ganzen Code in ein Button-Event packst kennt sich niemand aus (ok, einschränkend: ich kenn mich nicht aus)
|
Luki1987
Ihr wollt Wacker sein?
|
Na, also das mit den Funktionen kannst auch vergessen... Jetzt bin ich einmal froh, dass zumindestens einmal die Hälfte geht, jetzt will ich es net wieder zerstören (was ich aber mache, weil ich das mit den Funktionen net hinbekomme)... Inwiefern kennst dich denn net aus? Button1 zeichnet zuerst ein Koordinatensystem (halt x- und y-Achse) und dann die Funktion. Button2 sollte die Tangente zeichnen (was er aber logischerweise net macht). Button3 löscht das ganze Bild, indem er ein 400x400 großes weißes Rechteck erzeugt und das über das Image legt. Mit Scrollbar1 sollte man den Punkte, an den die Tangente gelegt wird regulieren können und auf Panel1 wird die X-Koordinate dieses Punktes (also xt) angezeigt. Wenn es noch Fragen gibt: Nur zu  mfG
Bearbeitet von Luki1987 am 02.06.2005, 13:56
|
Luki1987
Ihr wollt Wacker sein?
|
So, endlich geschafft... Hab ein paar Fehler bei der Umrechnung gemacht (mein Infolehrer hat mich drauf gebacht)  Also hier der funktionierende Code: click here Danke noch einmal an alle, die hier versucht haben zu helfen. mfG
|