Autor Beitrag
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: Do 09.07.15 21:41 
Nur mal noch so als Idee:
  • Der Greenwich-Meridian und der Äquator könnten eine eigene Farbe erhalten.
  • Der eigene Breitenkreis wäre auch ganz interessant (natürlich nur, wenn man nicht vertikal dreht - ansonsten ergibt sich auch ein interessanter Effekt :) ).

Erdkugel

ub60
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Mathematiker
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
  bitmap:=tbitmap.create;
  bitmap.width:=Self.width;
  bitmap.height:=Self.height;

Das Bitmap viermal so groß dimensionieren:
ausblenden 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)

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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:
  • Abstände der Breiten- und Längenkreise einstellbar
  • Tag- und Nachtgrenze, wie in www.entwickler-ecke....ewtopic.php?t=114460, einzeichnen (wird aber schwierig)
  • Nördlicher und südlicher Wendekreis
  • Zeitzonen (wird aber wohl auch schwierig)

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.

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.

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:
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;
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.
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:
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.
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Mathematiker
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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)

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:
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;