Hi,
habe erst vor ca. einem Jahr mit Delphi angefangen zu programmieren,
bin auch eigentlich nur über den Info-Unterricht zu Delphi gekommen.
Aktuell sollen wir ein Programm schreiben, dass, wie der Titel schon sagt, eine
Spirolateral-Kurve zeichnet. Diese Aufgabe habe ich auch erfüllt, Problem ist
jetzt nur, dass die Zeichnung manchmal (eigentlich meistens

) größer
ist als die Bildfläche.
Für alle die nicht wissen, was ein Sprirolateral ist:
mathworld.wolfram.com/Spirolateral.html
Hab mir deswegen einen Code zusammengeschrieben, der die Extremalwerte von
x und y bestimmt und daraus dann deren Abstand (xdif und ydif).
Damit habe ich die Maße der Fläche, die dass Spirolateral einnimmt.
Jetzt also die erste Seitenlänge (in meinem Fall 100 000 000)
durch den maximalen Abstand der x-/y-Werte und mal der zur Verfügung
stehenden Gesamtfläche.
siehe hier:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| procedure GetLength(var length,x,y:Integer); var w,i,j:Integer; xmin,xmax,ymin,ymax,xdif,ydif,xges,yges:Integer; lx,ly:Integer; begin repeat for i:=1 to n do begin inc(j); al:=1000000*i; NewPoint(x,y); w:=w+phi; if x<xmin then xmin:=x; if x>xmax then xmax:=x; if y<ymin then ymin:=y; if y>ymax then ymax:=y; end; until (w mod 360)=0;
xdif:=xmax-xmin; if xdif<0 then xdif:=-xdif; ydif:=ymax-ymin; if ydif<0 then ydif:=-ydif; xges:=SpirolateralForm.Width; yges:=SpirolateralForm.Height; if not((xdif=0)and(ydif=0)) then begin lx:=round(100000000*xges/xdif); ly:=round(100000000*yges/xdif); if lx<ly then length:=lx else length:=ly; end; |
Problem ist jetzt, dass die Seitenlänge immer negativ ist und
ich versteh einfach nicht, wie dass geht. denn ich überprüfe
ja sowohl xdif/ydif als auch xges/yges ob sie positiv sind.
So, dann noch ne Anmerkung, dass Programm ist eigentlich nur als Test
für dass richtige gedacht, daher habe ich die Komponenten noch
nicht umbenannt und so weiter und so fort ...
Edit:
Das Programm zeichnet die Spirolaterale richtig, wenn ihr den Aufruf
von Getlength rausnehmt und die Initialisierungen von l,x und y
wieder 'reinnehmt'.
Ich habe mein Programm auf 2 Formen aufgeteilt, eine steuert die andere
und nimmt die Eingaben auf. Die andere übernimmt die gesammte Verarbeitung
und Ausgabe. Hab mich für diese Form entschieden aus dem oben genannten Grund,
die Kontrollform sollte eigentlich nur provisorisch sein.
Schlussendlich hab ich mich entschlossen, mein Programm als Anhang anzuhängen,
ich hab es mit Delphi 2005 geschrieben, dürfte aber eigentlich keine Probleme
geben, wenn ihr ein älteres Delphi habt (zumindest bis D7, danach müsst ihr auf
XP Optik verzichten

).
Ich würde mich sehr über Verbesserungsvorschläge freuen und dann auch versuchen
diese einzubauen. Sowieso will ich noch vollgendes implementieren:
Zitat: |
noch zu implementieren:
automatische Größeneinstellung des Spirolaterals
Einstellungsmenü (evtl. ausfahrbar)
-Transparenz an/aus
-Transparenzgrad (evtl. Schieberegler)
-Zeit bis Transparenz
-Rand des Spirolaterals
-(Hintergrundfarbe?)
-(Pinselfarbe)
PopUp bei Rechtsklick mit
-Einstellungen Speichern/Laden
-Spirolateral Speichern/Laden
-Einstellungsmenü öffnen
-Info
Einstellungen + letzte Spirolateralwerte bei Programmstart laden
Element, ähnlich der Statuszeile einbauen
Interface überarbeiten
-Hintergrundfarbe
-Pinselfarbe
-Pinselstärke
-minimieren?
-Einstellungsmenü ausfahren?
-Eingabefelder als TSpinEdit
Beschriftungen in externer Datei speichern (Multlanguage support?)
|
Ich hoffe auf viele Antworten und bedanke mich schonmal,
e_t_grea
Moderiert von
Narses: Topic aus VCL (Visual Component Library) verschoben am Do 17.01.2008 um 00:05