Autor Beitrag
e_t_grea
Hält's aus hier
Beiträge: 11

Win XP

BeitragVerfasst: Sa 15.12.07 17:11 
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:
ausblenden volle Höhe Delphi-Quelltext
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);                 //Seitenläge bestimmen
  var
   w,i,j:Integer;                                             //Winkel,Zählvar.
   xmin,xmax,ymin,ymax,xdif,ydif,xges,yges:Integer;
   lx,ly:Integer;                                             //Länge nach x/y
 begin
  //...
  // hier initialisiere ich alle Werte mit 0
  //...
  repeat                                                      //virtuelles zeichnen
   for i:=1 to n do                                           //des Spirolaterals
    begin                                                     //zur Bestimmung des
     inc(j);                                                  //Bereiches, in dem
     al:=1000000*i;                                           //sich das Spirolateral
     NewPoint(x,y);                                           //befindet
     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;                                            //x-Bereich des Spiro.
  if xdif<0 then xdif:=-xdif;
  ydif:=ymax-ymin;                                            //y-Bereich des Spiro.
  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);                           //Seitenlänge für x
    ly:=round(100000000*yges/xdif);                           //Seitenlänge für y
    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 user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Do 17.01.2008 um 00:05
Einloggen, um Attachments anzusehen!
e_t_grea Threadstarter
Hält's aus hier
Beiträge: 11

Win XP

BeitragVerfasst: Mi 16.01.08 20:18 
Hi,

da ja hier anscheinend keiner die Lösung für mein Problem kennt und
dass eigentlich ja auch mehr ein source- als ein Komponentenproblem ist,
würde ich mich freuen wenn ein Admin dieses Thema in Delphi-Language verschieben könnte.
Hoffentlich erkennt dort jemand mein Problem.
Weiterhin würde ich mich natürlich immer noch über Vorschläge und Kritik freuen.

MfG.

grea