AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Objekte zu ihrer Längsachse vertikal ausrichten
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte zu ihrer Längsachse vertikal ausrichten

Ein Thema von newIndy · begonnen am 22. Mär 2019 · letzter Beitrag vom 25. Mär 2019
 
Benutzerbild von newIndy
newIndy

Registriert seit: 18. Dez 2018
29 Beiträge
 
Delphi XE3 Professional
 
#1

Objekte zu ihrer Längsachse vertikal ausrichten

  Alt 22. Mär 2019, 19:20
Objekte fallen an einer Kamera vorbei.
Diese Objekte sollen für die anschliessende Vermessung,
Erkennung und Visualisierung zu ihrer Längsachse vertikal ausgerichtet werden,
also so, als würden diese Objekte immer vertikal zu ihrer Längsachse fallen.
Ich habe eine funktionierende Methode.
Mit 'LineDDA' wird geprüft, welche 'gedachte' Linie die längste ist,
als Resultat erhält man einen Drehwinkel, mit dem das Objekt ausgerichtet wird.
Gibt es einen besseren Weg?
Danke für eure Antworten.

Delphi-Quellcode:
Procedure CheckPoints(X,Y: Integer; Canvas: TCanvas); StdCall;
var R, G, B:Byte;
    Color:TColor;
begin
     {$R-}
     Color := Canvas.Pixels[X, Y];
     R := GetRValue(Color);
     G := GetGValue(Color);
     B := GetBValue(Color);
     // prüfe, ob Pixelfarbe <> BackgroundTRGBFillColor
     if (R <> MainForm.BackgroundTRGBFillColor.r) and (G <> MainForm.BackgroundTRGBFillColor.g)
        and (B <> MainForm.BackgroundTRGBFillColor.b) then
          Inc(Distance);
     {$R+}
end;

Procedure TMainForm.AlignVertically(var bmp:TBitmap; var angle:Double);
var X1, Y1, X2, Y2, MaxDist,Vektor:Cardinal;
begin
     maxDist := 0;
     angle := 0;
     for Vektor := 1 to 8 do
     begin
          Distance := 1;
          if Vektor = 1 then
          begin
               // keine Drehung OK
               X1 := bmp.Width div 2; Y1 := 0; X2 := X1; Y2 := bmp.Height;
               //TFNLineDDAProc
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 0;
               end;
          end;
          if Vektor = 2 then
          begin
               // Drehung um 90° OK
               // Horizontal gemessen = grösste Distanz > Drehung um 90°
               X1 := 0; Y1 := bmp.Height div 2; X2 := bmp.Width; Y2 := Y1;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 90;
               end;
          end;
          if Vektor = 3 then
          begin
               // Drehung um 45° OK
               X1 := 0; Y1 := 0; X2 := bmp.Width; Y2 := bmp.Height;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 315;
               end;
          end;
          if Vektor = 4 then
          begin
               X1 := bmp.Width div 4; Y1 := 0; X2 := X1 * 3; Y2 := bmp.Height;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 337.5;
               end;
          end;
          if Vektor = 5 then
          begin // OK ?
               X2 := bmp.Width div 4; X1 := X2 * 3; Y1 := 0; Y2 := bmp.Height;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := -340;
               end;
          end;
          if Vektor = 6 then
          begin
               // Drehung um -45° OK
               X1 := bmp.Width; Y1 := 0; X2 := 0; Y2 := bmp.Height;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := -135;
               end;
          end;
          if Vektor = 7 then
          begin // OK ?
               X1 := 0; Y1 := bmp.Height div 4; X2 := bmp.Width; Y2 := Y1 * 3;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 300;
               end;
          end;
          if Vektor = 8 then
          begin // OK ?
               X1 := 0; Y2 := bmp.Height div 4; Y1 := Y2 * 3; X2 := bmp.Width;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := -300;
               end;
          end;
     end;
end;
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 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