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. |
AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
Zitat:
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" |
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.
|
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. |
AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
Auf das StringGrid greift man mit TStringGrid.Cells zu. Für das Minimum durchläuft man die Spalte und nutzt Math.Min.
Delphi-Quellcode:
Weitere Hilfe nur mit Projekt.
Minimum := StrToFloat(StringGrid.Cells[1,1]);
for i := 2 to StringGrid.RowCount - 1 do Minimum := Math.Min(Minimum, StrToFloat(StringGrid.Cells[1,i])); |
AW: Brauche Denkanstoß für Zeichnung mit Gauß Krügerkoordinaten
Zitat:
Zitat:
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. |
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. |
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:
<-- Das dreht den Punkt (x,y) an der Position (100,200) um 90°.
AffineTransformation(AffineRotation(90, 100, 200), Point(x,y))
|
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. |
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. |
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:
mit diesem Code funktioniert jetzt das Drehen.
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; 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. |
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; |
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