Entwickler-Ecke

Open Source Projekte - Erdkugel


Mathematiker - Mi 08.07.15 10:40
Titel: Erdkugel
Hallo,
die Darstellung der Erdkugel ist eigentlich sehr, sehr einfach. Hat man die entsprechenden Daten, ist der Rest nur noch die Transformation der Kugelkoordinaten auf die Ebene.
erdkugel
Ich zeige das Beispiel nur, da es vielleicht doch den einen oder anderen gibt, der mal schnell eine Erdkugeldarstellung braucht und ich in der EE nichts gefunden habe oder natürlich falsch gesucht habe.
Im Matheprogramm [http://www.entwickler-ecke.de/viewtopic.php?t=114237] nutze ich diese Routine mehrmals.
Evtl. interessiert es auch einen "Anfänger". Es ist aber kein Beispiel für "gute Programmierung". :wink:

Außer der Exe benötigt man die Dateien erde.000 bzw. erde2.000. In denen befinden sich die Koordinaten der Landgrenzen der Erde. Die zweite Datei ergibt einer genauere Darstellung.
Schaltet man auf "transparente Erde" wird auch die verdeckte Halbkugel gezeichnet. Dann kommt es wieder zu einer optischen Täuschung. Dreht sich die Erde dann links herum oder rechts herum?

Beste Grüße
Mathematiker

Revision 1: Mit Äquator, Nullmeridian, Breiten- und Längenkreise.
Revision 2: Mit wahlweiser Neigung der Erdachse.

Ergänzung: Dank der Superhilfe von user profile iconNersgatt und user profile iconub60 gibt es jetzt auch eine Komponente zur Erdkugeldarstellung. In dem Zip-File ist auch ein Demoprogramm.

Komponente:
Revision 1: Mit eigenem Breitenkreis und einstellbaren Abständen zwischen den Breiten- und Längenkreisen.
Revision 2: Im Demoprogramm kann der eigene Breitenkreis gewählt werden. Außerdem sind erste Farben einstellbar.
Revision 3: Weitere Eigenschaften der Komponente und wesentlich erweiterte Demo.
Revision 4: Zeitanzeige in die Komponente eingefügt. Zusätzlich Polarkreise. Demoprogramm überarbeitet.


Delete - Mi 08.07.15 10:58

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delete - Mi 08.07.15 11:05

Lieber Mathematiker,
zeichne doch bitte noch den Greenwich-Meridian (Nullmeridian) und den Äquator dazu.
https://de.wikipedia.org/wiki/Referenzellipsoid

Farben wären auch ganz toll: Wasser blau, Land ocker o.ä.

VIELEN, VIELEN DANK FÜR ALLE DEINE BEITRÄGE !!!


Mathematiker - Mi 08.07.15 15:12

Hallo,
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
... zeichne doch bitte noch den Greenwich-Meridian (Nullmeridian) und den Äquator dazu.

Danke für den Hinweis. In der Revision 1 kann man nun Nullmeridian, Äquator sowie Breiten- und Längenkreise einzeichnen lassen.
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Farben wären auch ganz toll: Wasser blau, Land ocker o.ä.

Hmm, das dauert aber wesentlich länger. Die Idee ist gut, nur werden die Grenzen zwischen Land und Wasser im Moment nicht als Polygone gezeichnet, sondern als Folge von Einzelstrecken. Für das Färben der Wasserflächen muss ich mir etwas einfallen lassen.

Beste Grüße
Mathematiker


Delete - Mi 08.07.15 15:58

Super-schnell, super-toll !
DANKE !

Was mir noch auffiel:
Die Erdachsenneigung von ca. 23,4° könnte man noch einarbeiten...
https://de.wikipedia.org/wiki/Erdachse


Mathematiker - Mi 08.07.15 17:18

Hallo,
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Die Erdachsenneigung von ca. 23,4° könnte man noch einarbeiten...

Kein Problem.
In der Revision 2 kannst du jetzt auch die Erdachse um die 23,4° neigen.

Beste Grüße
Mathematiker


Delete - Mi 08.07.15 17:37

- Nachträglich durch die Entwickler-Ecke gelöscht -


Mathematiker - Mi 08.07.15 19:51

Hallo,
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Der Globus als Komponente wäre sehr interessant.
Würdest du es umsetzen wollen?

Würde ich schon.
Da ich aber mich aber noch nie mit der Komponentenerstellung beschäftigt habe, muss ich wohl passen.
Wenn sich jemand in der EE "opfert" :wink: , könnte ich noch etwas lernen.

Beste Grüße
Mathematiker


Delete - Mi 08.07.15 20:05

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delete - Mi 08.07.15 21:16

How To Embed GoogleEarth in your Delphi Application:

http://delphidabbler.com/articles?article=26


Nersgatt - Do 09.07.15 07:47

In der Anlage mal Deine Erde als Komponente. Ist alles quick and dirty.

Was habe ich gemacht?
Ich habe eine TPaintBox abgeleitet und die Paint-Methode überschrieben. Hier hab ich Deine Berechnungen und die Zeichnroutinen hinein gepackt.
Dann habe ich alles, was Zugriffe auf Steuerelemente des Formulars waren, in Properties umgewandelt. Die können jetzt im Objektinspektor oder im Code gesetzt werden.
Außerdem habe ich den Pfad zur Koordinatendatei zur Property gemacht. Damit kann auch das von außen gesetzt werden.

Dann habe ich ein Beispielprojekt gemacht. Hier hab ich dein Formular genommen und setzt nur noch die Properties der Komponente.

Warum heißt die Komponente "spErde"? Den Präfix "sp" habe ich in Anlehnung Deines Namens verwendet. Wenn Du mehr Komponenten machst, ist es hilfreich, wenn die eigenen Komponenten einen einheitlichen Präfix haben. Das machen die meisten Komponentenhersteller auch (DevExpress heißt z.B. immer Tcx... oder Tdx...).

Erstellt hab ich das mit Delphi XE7, hab leider grade kein Delphi 7 zur Hand. Von daher muss evtl. das dfm-File angepasst werden, damit man das Testprojekt in Delphi 7 öffnen kann.


Mathematiker - Do 09.07.15 08:13

ICH BIN SAUBLÖD!!!! :autsch: :autsch: :autsch: :autsch: Gerade habe ich diesen Beitrag gelöscht! Deshalb noch mal.

Hallo Nersgatt,
Vielen Dank für die Umsetzung als Komponente. Es funktioniert hervorragend. :zustimm: :zustimm: Ich konnte unter D7 die Komponente problemlos installieren.

Jetzt werde ich mir dies genauer ansehen und habe wieder etwas zum Lernen. :dance2:

Beste Grüße
Mathematiker


Mathematiker - Do 09.07.15 14:11

Hallo,
ich habe mir jetzt die Komponente von user profile iconNersgatt angesehen und glaube, das Prinzip verstanden zu haben.
Natürlich musste ich sofort experimentieren.

Deshalb habe ich die Datei erde2.000 erst einmal mit Zlib gepackt und das Ergebnis in Create der Komponente in einer Tstringlist geladen. Das spart das ständige Nachladen der Daten. Wahrscheinlich ist ein Array mit den 32000 Koordinaten noch besser.
Schöner Nebeneffekt: Zieht man die Komponente auf ein Formular, so wird sofort die Erde angezeigt und man kann gezielter die Starteinstellungen festlegen. (veränderte Komponente im Anhang)
Ich hoffe, dass mein Versuch von constructor und destructor richtig sind. Aber die Stringliste muss ja erzeugt und wieder gelöscht werden.

Und nun mein Problem: Es ist immer noch die Datei erde2.c00 notwendig.
In meinem "jugendlichen" :wink: Wahn dachte ich, machst du daraus eine RCDATA-Ressource und fügst sie mit
{$R erde.res}
ein. Dann wird zu Beginn des Programms, wie ich es immer mache, die Ressource in einen Stream geladen und entpackt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure listedll(liste:tstringlist);
var ms1: TResourcestream;
    ms2: TMemoryStream;
begin
    ms1 := TResourceStream.Create(hinstance,'erde2',RT_RCDATA);
    try
      ms2 := TMemoryStream.Create;
      try
        DecompressStream(ms1, ms2);
        liste.LoadFromStream(ms2);
      finally
        ms2.Free;
      end;
    finally
      ms1.Free;
    end;
end;
Und das funktioniert nicht. Die res-Datei wird einfach ignoriert und ist gar nicht in der dcu der Komponente enthalten.
Was mache ich schon wieder falsch?

Beste Grüße
Mathematiker

Nachtrag: Ich habe noch ein paar Starteinstellungen festgelegt und die Eigenschaften Farbe der Landgrenze und Farbe der Kreise ergänzt. Das macht Spaß.
Nachtrag 2: Ich habe noch die Stringliste entfernt und ein Koordinatenfeld eingebaut.

Hinweis: Die korrekte Komponente findet ihr im 1.Beitrag.


Delete - Do 09.07.15 15:41

Hast Du das so o.ä. in das DPR-File eingebunden?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
...
{$R *.RES}

{$R erde2.RES}

begin
  Application.Initialize;
...


Mathematiker - Do 09.07.15 17:28

Hallo,
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Hast Du das so o.ä. in das DPR-File eingebunden?

Nein, das geht ja nicht.
Die Komponente hat ja kein Projektfile sondern nur eine Unit.

Beste Grüße
Mathematiker


ub60 - Do 09.07.15 18:47

Was spricht denn gegen das Array?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
const Daten : array[0..313860..2of single=
((5.670.1920),
(5.36, -0.3921),
(5.151, -0.8871),
(5.008, -1.4171),
(4.776, -1.7371),
(4.788, -2.1991),
(4.931, -2.5961),
(4.952, -2.7721),
(4.975, -3.0041),
...
(80.49219.7631),
(80.46619.961),
(80.41719.951),
(80.40319.961));

Habe es eben probiert. Funktioniert gut und schnell.

ub60


Mathematiker - Do 09.07.15 19:28

Hallo,
user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Was spricht denn gegen das Array?

Nichts!
Genau das ist es. Die Idee ist super. Vielen Dank! :dance2: :dance2:

Und damit kann die Erdkugel-Komponente ohne zusätzliche Datei auskommen.
Ich werde den ersten Beitrag jetzt um die Komponenten-Dateien und ein Demoprogramm mit der Komponente ergänzen.

Danke Eurer Superhilfe bin ich jetzt doch etwas stolz. "Meine" erste Komponente. :D
Wer sagt eigentlich, dass es in der EE sehr ruhig geworden ist? :P So schnelle Hilfe bekommt man nur hier. :!:

Jetzt kann der Urlaub beginnen! :beer:
Beste Grüße und nochmals vielen Dank
Mathematiker


Delete - Do 09.07.15 19:53

Aber ZLIB ändern dauert etwas länger...
http://www.entwickler-ecke.de/viewtopic.php?p=678947#678947
----------------------------------------------------------------------------------------
ErdeKomponente.zip (644.86 KB) Rev 0 funktioniert sehr gut ! DANKE !


Mathematiker - Do 09.07.15 19:57

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Aber ZLIB ändern dauert etwas länger...

Eigentlich müsste ich mich schämen. :oops: :oops:
Aber heute nicht!
Jetzt ist Party angesagt! :party: :beer: :party: :dunce:

Beste Grüße
Mathematiker


Delete - Do 09.07.15 20:37

Ich habe die Start-Procedure etwas erweitert, weil die Änderung der CheckButtons VOR dem Drehen nicht übernommen wird.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.BDrehungClick(Sender: TObject);
begin
 spERDE3.aequator:=checkequa.checked;
 spERDE3.Transparent:=checktran.checked;
 spERDE3.nullmeridian:=checknull.checked;
 spERDE3.breitenkreise:=checkbkreis.checked;
 spERDE3.laengenkreise:=checklkreis.checked;
 spERDE3.erdachse:=checkachse.checked;

  timer1.enabled:=not timer1.enabled;
  if timer1.enabled then BDrehung.caption:='Stopp'
                    else BDrehung.caption:='Drehung';
end;


ub60 - Do 09.07.15 21:41

Nur mal noch so als Idee:

Erdkugel

ub60


jfheins - Do 09.07.15 22:12

Wenn das jetzt eh schon eine Komponente ist, könntest du auch noch etwas Anti-Aliasing 'reinbringen :D

Konkret hier:

Delphi-Quelltext
1:
2:
3:
  bitmap:=tbitmap.create;
  bitmap.width:=Self.width;
  bitmap.height:=Self.height;

Das Bitmap viermal so groß dimensionieren:

Delphi-Quelltext
1:
2:
3:
  bitmap := Tbitmap.create();
  bitmap.width := 2 * Self.width;
  bitmap.height := 2 * Self.height;

Und die Ellipse für den Umriss füllen.
Dann zeichnen und am Ende bei Self.canvas.draw(0,0,bitmap); wieder auf die halbe Größe skalieren. (Wie weiß ich leider gerade auch nicht)

Es könnte sein, dass es dann ruckelt, aber es sollte auch schöner aussehen. Gerade wenn man keine Animation macht, ist das vielleicht schon ein Argument - ggf. einstellbar gestalten.

Das Bitmap solltest du übrigens auch nur einmal erstellen und in einer Property speichern zur Wiederverwendung. Bei jedem Paint Speicher zu allozieren verschwendet ein wenig Performance.
(Wenn das Anti-Aliasing zur Property wird, muss man natürlich bei jeder Änderung ein neues Bitmap erzeugen)


Mathematiker - Do 09.07.15 22:15

Hallo,
user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Der Greenwich-Meridian und der Äquator könnten eine eigene Farbe erhalten. ...

Gute Vorschläge.
Ich habe auch schon überlegt und da kam mir so in den Sinn:

Es gibt also noch genug zu tun. :wink:

user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
... könntest du auch noch etwas Anti-Aliasing 'reinbringen :D

Danke für den Hinweis. Wie gesagt, es gibt noch viel zu tun. :wink:

Beste Grüße
Mathematiker

Nachtrag: In der Revision 1 der Komponente kann man den eigenen Breitenkreis zeichnen und die geografische Breite eingeben. Außerdem sind die Abstände zwischen den Längen- und Breitenkreisen einstellbar.
Mehr wird heute Abend leider nicht mehr.


Delete - Fr 10.07.15 09:04

Erweiterung:
2 Label:
Lokale Zeit (Deutschland bzw. MEZ)
View (ungefähre Zeit des sichtbaren Globusausschnitts)

Weil 1 Stunde ein vierundzwanzigstel einer 360°-Umdrehung ist, wird Timer1.Tag hochgezählt bis 15 und dann eine Stunde addiert.


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:
procedure TForm1.Timer1Timer(Sender: TObject);
var z:integer; myDate1, myDate2 : TDateTime; //H : WORD; // = global
begin
  if checkhori.checked then begin
    z:=spinvert.value;
    inc(z);
    Timer1.Tag:= Timer1.Tag+1;
    if Timer1.Tag=15 then
    BEGIN
      inc(H);
      if H>23 then H:=0;
      myDate1 := EncodeTime(H,0,0,0);
      myDate2 := myDate1 +  now;
      Label4.caption:= 'View: '+FormatDateTime('t', myDate2);
    END;
    if Timer1.Tag>15 then Timer1.Tag:= 1;

    if z>360 then
    BEGIN
      z:=0;
      Label3.caption:= 'Lokal: '+FormatDateTime('t', now);
    END;

    spinvert.value:=z;
    spERDE3.vertikal:=spinvert.Value;
  end;
  if checkvert.checked then begin
    z:=spinhori.value;
    inc(z);
    if z>180 then z:=-180;
    spinhori.value:=z;
    spERDE3.horizontal:=spinhori.Value;
  end;
end;


Mathematiker - Fr 10.07.15 10:18

Hallo,
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Lokale Zeit (Deutschland bzw. MEZ)
View (ungefähre Zeit des sichtbaren Globusausschnitts)

Danke für den Hinweis. Ich habe es sofort in die Demo eingebaut. Außerdem kann man nun mehr einstellen.
Ergänzungen der Komponente sind die Wendekreise und die Anzeige des eigenen Ortes.

Beste Grüße
Mathematiker


Delete - Fr 10.07.15 11:02

Ich bin jetzt völlig verwirrt mit den unterschiedlichen Komponenten + Demos.
Kann es sein, dass Du falsche Versionen hochgeladen hast?

SORRY - alles ok.
Der Irrtum wurde durch eine falsche Nummerierung durch Firefox-DL verursacht.

Vorschlag:
Statt Nummern Datum und Zeit anhängen: Beispiel : ErdeKomponente(20150710-11.30)


Mathematiker - Fr 10.07.15 17:38

Hallo,
ich habe noch einmal die Komponente verändert. Zum einen werden auch die Polarkreise gezeichnet, zum anderen habe ich die Zeitanzeige in die Komponente eingefügt.
Die Lokalzeit ist die aktuelle Computerzeit. Die Viewzeit ist die Ortszeit(!) des Ortes, der sich gerade in der Mitte der Darstellung befindet. Allerdings funktioniert dies nur korrekt, wenn die Eigenschaft EigeneZeitzone in der Komponente korrekt eingestellt ist.

Außerdem habe ich noch einmal das Demoprogramm verändert.
So, das war's im Moment. Ich melde mich für ein paar Tage ab.

Beste Grüße
Mathematiker


Delete - Fr 10.07.15 18:46

Schönen Urlaub !!!
....Komm zurück mit vielen, neuen, guten Ideen... :D

Wer die Komponente nicht installieren will, muss nicht viel ändern - es geht auch ohne Installation.

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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
unit uerde;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, ComCtrls, StdCtrls, Spin, spErde;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    BDrehung: TButton;
    CheckHori: TCheckBox;
    CheckVert: TCheckBox;
    Spinhori: TSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    SpinVert: TSpinEdit;
    CheckTran: TCheckBox;
    CheckEqua: TCheckBox;
    CheckNull: TCheckBox;
    CheckBkreis: TCheckBox;
    CheckLKreis: TCheckBox;
    CheckAchse: TCheckBox;
//    spErde1: TspErde;  <---------------------------------
    CheckEKreis: TCheckBox;
    SpinEigen: TSpinEdit;  
    ColorDialog1: TColorDialog;
    BFarbeL: TButton;
    BFarbeB: TButton;
    CheckWende: TCheckBox;
    Label3: TLabel;
    Label4: TLabel;
    SpinELaenge: TSpinEdit;
    CheckOrt: TCheckBox;
    Label5: TLabel;
    SpinBreiteAbstand: TSpinEdit;
    Label6: TLabel;
    SpinLaengeAbstand: TSpinEdit;
    CheckLZeit: TCheckBox;
    CheckVZeit: TCheckBox;
    Shape1: TShape;
    Label7: TLabel;
    Shape2: TShape;
    CheckPolar: TCheckBox;
    procedure BDrehungClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure SpinhoriChange(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure CheckTranClick(Sender: TObject);
    procedure CheckEquaClick(Sender: TObject);
    procedure CheckNullClick(Sender: TObject);
    procedure CheckBkreisClick(Sender: TObject);
    procedure CheckLKreisClick(Sender: TObject);
    procedure CheckAchseClick(Sender: TObject);
    procedure SpinVertChange(Sender: TObject);
    procedure CheckEKreisClick(Sender: TObject);
    procedure SpinEigenChange(Sender: TObject);
    procedure BFarbeLClick(Sender: TObject);
    procedure BFarbeBClick(Sender: TObject);
    procedure CheckWendeClick(Sender: TObject);
    procedure CheckOrtClick(Sender: TObject);
    procedure SpinELaengeChange(Sender: TObject);
    procedure SpinBreiteAbstandChange(Sender: TObject);
    procedure SpinLaengeAbstandChange(Sender: TObject);
    procedure CheckLZeitClick(Sender: TObject);
    procedure CheckVZeitClick(Sender: TObject);
    procedure CheckPolarClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  spErde1: TspErde; //  <---------------------------------

implementation

{$R *.DFM}

procedure TForm1.BDrehungClick(Sender: TObject);
begin
  timer1.enabled:=not timer1.enabled;
  if timer1.enabled then BDrehung.caption:='Stopp'
                    else BDrehung.caption:='Drehung';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var z:integer;
begin
  if checkhori.checked then begin
    z:=spinvert.value;
    inc(z);
    if z>180 then z:=-180;
    spinvert.value:=z;
    sperde1.vertikal:=spinvert.Value;
  end;
  if checkvert.checked then begin
    z:=spinhori.value;
    inc(z);
    if z>180 then z:=-180;
    spinhori.value:=z;
    sperde1.horizontal:=spinhori.Value;
  end;
end;

procedure TForm1.SpinhoriChange(Sender: TObject);
begin
  if timer1.Enabled and checkvert.checked then exit;
  sperde1.Horizontal:=spinhori.Value;
end;

procedure TForm1.FormCreate(Sender: TObject); //<----------------------------
begin
   sperde1:= TspErde.Create(self); //<---------------------------------
   sperde1.Parent := Self;  //<---------------------------------
   sperde1.Align:= alClient; // <--------------------------------
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  form1.DoubleBuffered:=true;
  sperde1.vertikal:=0;
  sperde1.horizontal:=15;
  shape1.Brush.color:=sperde1.LandColor;
  shape2.Brush.color:=sperde1.KreiseColor;
end;

procedure TForm1.CheckTranClick(Sender: TObject);
begin
  sperde1.Transparent:=checktran.checked;
end;

procedure TForm1.CheckEquaClick(Sender: TObject);
begin
  sperde1.aequator:=checkequa.checked;
end;

procedure TForm1.CheckNullClick(Sender: TObject);
begin
  sperde1.nullmeridian:=checknull.checked;
end;

procedure TForm1.CheckBkreisClick(Sender: TObject);
begin
  sperde1.breitenkreise:=checkbkreis.checked;
end;

procedure TForm1.CheckLKreisClick(Sender: TObject);
begin
  sperde1.laengenkreise:=checklkreis.checked;
end;

procedure TForm1.CheckAchseClick(Sender: TObject);
begin
  sperde1.erdachse:=checkachse.checked;
end;

procedure TForm1.SpinVertChange(Sender: TObject);
begin
  if timer1.Enabled and checkhori.checked then exit;
  sperde1.Vertikal:=spinvert.Value;
end;

procedure TForm1.CheckEKreisClick(Sender: TObject);
begin
  sperde1.eigenerkreis:=checkekreis.checked;
end;

procedure TForm1.SpinEigenChange(Sender: TObject);
begin
  sperde1.eigenebreite:=spineigen.value;
end;

procedure TForm1.BFarbeLClick(Sender: TObject);
begin
  colordialog1.Color:=sperde1.LandColor;
  if colordialog1.execute then begin
    sperde1.LandColor:=colordialog1.color;
    shape1.Brush.Color:=colordialog1.Color;
  end;
end;

procedure TForm1.BFarbeBClick(Sender: TObject);
begin
  colordialog1.Color:=sperde1.KreiseColor;
  if colordialog1.execute then begin
    sperde1.KreiseColor:=colordialog1.color;
    shape2.Brush.Color:=colordialog1.Color;
  end;
end;

procedure TForm1.CheckWendeClick(Sender: TObject);
begin
  sperde1.wendekreise:=checkwende.checked;
end;

procedure TForm1.CheckOrtClick(Sender: TObject);
begin
  sperde1.eigenerort:=checkort.checked;
end;

procedure TForm1.SpinELaengeChange(Sender: TObject);
begin
  sperde1.eigenelaenge:=spinelaenge.value;
end;

procedure TForm1.SpinBreiteAbstandChange(Sender: TObject);
begin
  sperde1.breitenabstand:=spinbreiteabstand.value;
end;

procedure TForm1.SpinLaengeAbstandChange(Sender: TObject);
begin
  sperde1.laengenabstand:=spinlaengeabstand.value;
end;

procedure TForm1.CheckLZeitClick(Sender: TObject);
begin
  sperde1.Zeitlokal:=checklzeit.checked;
end;

procedure TForm1.CheckVZeitClick(Sender: TObject);
begin
  sperde1.Zeitview:=checkvzeit.checked;
end;

procedure TForm1.CheckPolarClick(Sender: TObject);
begin
  sperde1.polarkreise:=checkpolar.checked;
end;

end.


Delete - Sa 11.07.15 07:28

Wer die Rotationsgeschwindigkeit ändern will, fügt eine Trackbar hinzu.
Ändert das Timer.Interval von 10 msec bis 240000 = 1 Umdrehung/ 24 Std.

USER_TIMER_MINIMUM (0x0000000A)
USER_TIMER_MAXIMUM (0x7FFFFFFF)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
    Timer1.Interval:= ABS(TrackBar1.Position);
    TrackBar1.SelEnd:= TrackBar1.Position;
    Label8.Caption:= INTTOSTR(Timer1.Interval);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   sperde1:= TspErde.Create(self); 
   sperde1.Parent := Self;
   sperde1.Align:= alClient;
 //  TrackBar1.Min:= -200;
   TrackBar1.Min:= -240000//86400000 div 360;// 24 Std 
   TrackBar1.Max:= -10//=    MINIMUM
   TrackBar1.Position:= -20;
   TrackBar1.SelEnd:= -10;
   TrackBar1.SelStart:= -200;
   Timer1.Interval:= ABS(TrackBar1.Position);
   TrackBar1.SelEnd:= TrackBar1.Position;
   Label8.Caption:= INTTOSTR(Timer1.Interval);
end;