Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten (https://www.delphipraxis.net/195428-brauche-denkanstoss-fuer-zeichnung-mit-gauss-kruegerkoordinaten.html)

verkouter 27. Feb 2018 16:39

Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich möchte ein Programm schreiben, das eine Exceltabelle (siehe Anhang) in ein Stringgrid liest.(funktioniert)
Dann sollen alle Koordinate auf ein Image gezeichnet werden z.B. als Kreis.
Die Gauß Krüger-Koordinaten sind eigendlich nur Meterangaben in Bezug auf ein Meridian.
Eigendlich muß die Zeichnung ja nur aus den Differenzen der Koordinaten gezeichnet werden, dabei wäre der kleinste Hochwert aber am weitesten Oben auf dem Image,
ist in Wirkichkeit aber am weitesten unten.

himitsu 27. Feb 2018 16:48

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Zitat:

Zitat von verkouter (Beitrag 1394764)
dabei wäre der kleinste Hochwert aber am weitesten Oben auf dem Image

Kommt auf dein Koordinatensystem an, das kannst du ja anders definieren (MSDN-Library durchsuchenSetMapMode und seine Freunde)
oder dir einfach nur denken es sei anders und von der Unterkante subtrahieren.

z.B. TCanvas und dein Monitor zählen von oben nach unten, aber Bitmaps (deren gespeicherten Lines) von unten nach oben (der Canvas eines Bitmap aber wieder von oben nach unten) ... "standardmäßig"

Redeemer 27. Feb 2018 18:28

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Das mit den Bitmaps ist falsch. Man kann sich das aussuchen, wie rum Bitmaps zählen sollen. Positive Höhen so wie du sagst, negative Höhen von oben nach unten.

verkouter 27. Feb 2018 18:51

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Zu erst geht es mir um die Aufbereitung der Kooerdinaten im Stringgrid.
Habe das vorher in Excel gemacht. Soll jetzt aber direkt im Programm stattfinden.
Ich muss zuerst in der Hochwertspalte den kleinsten Wert ermittel ??? ,diesen von allen Werten abziehen, und dass selbe nochmal bei den Rechtswerten.
Daran scheitert es schon.

Redeemer 27. Feb 2018 19:24

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Auf das StringGrid greift man mit Delphi-Referenz durchsuchenTStringGrid.Cells zu. Für das Minimum durchläuft man die Spalte und nutzt Delphi-Referenz durchsuchenMath.Min.

Delphi-Quellcode:
Minimum := StrToFloat(StringGrid.Cells[1,1]);
for i := 2 to StringGrid.RowCount - 1 do
Minimum := Math.Min(Minimum, StrToFloat(StringGrid.Cells[1,i]));
Weitere Hilfe nur mit Projekt.

himitsu 27. Feb 2018 20:01

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Zitat:

Zu erst geht es mir um die Aufbereitung der Kooerdinaten im Stringgrid.
Da klang deine Frage/Beschreibung im ersten Post aber irgendwie anders. Dort ging es ja schon um das Zeichnen und Koordinaten. :stupid:

Zitat:

Zitat von Redeemer (Beitrag 1394773)
Delphi-Quellcode:
Minimum := StrToFloat(StringGrid.Cells[1,1]);
for i := 2 to StringGrid.RowCount - 1 do
Minimum := Math.Min(Minimum, StrToFloat(StringGrid.Cells[1,i]));

Das findet dann erstmal das Kleinste, für den Anfang.

Delphi-Quellcode:
Minimum := Math.Min(Minimum, StrToFloat(StringGrid.Cells[1,i]));

entspricht dabei
Delphi-Quellcode:
if StrToFloat(StringGrid.Cells[1,i]) < Minimum then Minimum := StrToFloat(StringGrid.Cells[1,i]);

Und bei nachfolgenden Suchen, nach dem nächst größeren Wert, werden nun nur noch die Werte betrachtet, die größer als das Minimum des vorherigen Durchgangs sind,
also
Delphi-Quellcode:
if (X < DiesesMinimum) and (X > LetztesMinimum) then



Oder die Zeilen erstmal aufsteigend sortieren und dann einfach nur noch alle Zeilen von oben nach unten durchgehn.

verkouter 28. Feb 2018 16:59

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke erstmal für Eure Hilfe. Ich sortiere jetzt die 2. Spalte nach Größe und dann die 3. Spalte. Bekomme so die kleinsten und größten Werte.
Durch Tauschen von x und y habe ich jetzt eine eingenordete Zeichnung hinbekommen. Gauß-Krüger ???
Hat vielleicht noch Jemand eine Idee, wie ich das ganze um den Bildmittelpunkt drehen könnte. Dabei möchte ich aber nicht das Image drehen, sondern die Koordinaten
neu berechnen.

Redeemer 1. Mär 2018 14:58

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
https://de.wikipedia.org/wiki/Drehmatrix
Man beachte die Formel unter "Diese Matrixmultiplikation ergibt".

Für eine Drehung um einen Punkt, der nicht (0,0) ist, braucht es dann schon Kenntnisse in Affiner Geometrie. Dafür kann man zur Not mein RedeemerAffineGeometry aus RedeemerSVG verwenden:
Delphi-Quellcode:
AffineTransformation(AffineRotation(90, 100, 200), Point(x,y))
<-- Das dreht den Punkt (x,y) an der Position (100,200) um 90°.

verkouter 2. Mär 2018 15:43

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe im Internet was zur Drehmatrix gefunden, was ich auch gleich eingebaut habe.
Verstanden habe ich es aber bis jetzt noch nicht.
Wenn ich meine Zeichnung z.B um 33 Grad drehe, werden die Werte negativ, was das Bild natürlich
extrem nach Links verschiebt. Da bin ich noch auf der Suche, irgendwie mit meinen Max-Werten das auszugleichen.

brechi 3. Mär 2018 14:10

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Ungetestet:

Delphi-Quellcode:
procedure TForm1.ToolButton2Click(Sender: TObject);
var winkel,x,y,xc,yc :real;
Img : TImage;
i:integer;
begin

winkel:=strtofloat(edit1.Text);

// Mitte berechnen
xc := (max1+min1) / 2;
yc := (max2+min2) / 2;
for i := stringgrid1.RowCount-1 downto 1 do
begin
x:=strtofloat(stringgrid1.Cells[1, i]);
y:=strtofloat(stringgrid1.Cells[2, i]);


winkel := -winkel; // da Y Achse von unten nach oben
// Winkelfunktionen benoetigen Rad anstatt Grad
winkel := DegToRad(winkel);

// in den Ursprung verschieben
x := xc - x;
y := yc - y;

// drehen

xn := x * cos (Winkel) - y * Sin(Winkel);
yn := x * sin (Winkel) + y * Cos(Winkel);

// zurueck verschieben
x := xc + x;
y := yc + y;

stringgrid1.Cells[3,i]:=floattostr(x);
stringgrid1.Cells[4,i]:=floattostr(y);

end;
zeichnen;
end;

Bitte gewoehn dir frueh genug an, den Programmcode einzuruecken.

verkouter 30. Mär 2018 16:32

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Entschuldigung, das ich mich solange nicht gemeldet habe. Hatte im Moment viel zu tun.

der Fehler lag im ABS vor xn und yn.
Code:
procedure TForm1.ToolButton2Click(Sender: TObject);
var winkel,x,y,xn,yn,xc,yc,u,d :real;
Img : TImage;
i:integer;
begin
winkel:=strtofloat(drehwinkel.Text);
xc:=max1-min1;
yc:=max2-min2;
label1.caption:=floattostr(xc)+'  '+floattostr(yc);
for i := stringgrid1.RowCount-1 downto 1 do
begin
x:=strtofloat(stringgrid1.Cells[1, i]);
y:=strtofloat(stringgrid1.Cells[2, i]);
u:= Winkel * Pi/180 + arctan2(Y-Yc,X-Xc);
d:= sqrt((X-Xc)*(X-Xc) + (Y-Yc)*(Y-Yc));
xn:=((Xc+d*cos(u)));
yn:=((Yc+d*sin(u)));
stringgrid1.Cells[3,i]:=floattostr(xn);
stringgrid1.Cells[4,i]:=floattostr(yn);
end;
zeichnen;
end;
mit diesem Code funktioniert jetzt das Drehen.
Jetzt ist immer noch das Problem, das die Zeichnung teilweise außerhalb des Images liegt.
Schlecht wäre es auch nicht, wenn er die Imagegröße automatisch anpassen würde.

brechi 2. Apr 2018 15:27

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Ich blick zwar gerade nicht mehr komplett durch, aber:

Delphi-Quellcode:
procedure TForm1.Zeichnen;
var x1,x2,y1,y2,a,i:integer;
begin
image1.Picture.assign(nil);
SortStringGrid(StringGrid1, 3);
min1:=strtofloat(stringgrid1.Cells[3, 1]);
max1:=strtofloat(stringgrid1.Cells[3, stringgrid1.RowCount-1]);
SortStringGrid(StringGrid1, 2);
min2:=strtofloat(stringgrid1.Cells[4, 1]);
max2:=strtofloat(stringgrid1.Cells[4, stringgrid1.RowCount-1]);

label1.Caption:=inttostr(round((max2-min2+5)*20))+'  '+inttostr(round((max1-min1+5)*20));

image1.Height:=abs(round((max2-min2)*20) + 40); // geaendert!
image1.Width:=abs(round((max1-min1)*20)) + 40); // geaendert!

// hier auf "+ 40" gaendert, da unten y2/x2 .. bei der 2. Koordinate + 40 addiert wird
// ggf. noch wegen der Textausgabe vergrößern mit z.B. Canvas.GetTextHeight bzw. Canvas.GetTextWidth und die zusätzlichen "+ 25"

for a := stringgrid1.RowCount-1 downto 1 do
begin
x1:=round((strtofloat(stringgrid1.Cells[3, a])-min1)*20);
y1:=round((max2-strtofloat(stringgrid1.Cells[4, a]))*20);
x2:=x1+40;
y2:=y1+40;
image1.canvas.brush.Style:=(bsclear);
image1.canvas.pen.color:=clblack;
image1.canvas.Ellipse(x1,y1,x2,y2);
image1.Canvas.TextOut(x1+25,y1+25,stringgrid1.Cells[0, a]);
end;
end;

verkouter 2. Apr 2018 18:23

AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo brechi,
die 20 ist der Vergrößerungsfaktor, die(+40) ist die Größe der Elippse ,das entspricht dann in der Zeichnung 2m.
Ich habe mal die neuste Version hochgeladen.Aber ich blicke auch nicht mehr durch.Die Anpassung der Bildgröße habe ich erstmal rausgenommen.
Warscheinlich ist das alles so auf diese Koordinate angepasst, daß es bei neuen Koordinaten wieder garnicht passt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz