Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Rechteck skalieren (https://www.delphipraxis.net/190409-rechteck-skalieren.html)

Peter666 30. Sep 2016 12:29

Rechteck skalieren
 
Hi,

ich habe gerade eine ziemliche Blockade, bei der Lösung eines Problems. Für ein OpenGL Projekt rendere ich einen Text, indem ich eine Bild mit Buchstaben auf die Anzeige bringe. Für jeden Buchstaben habe ich die Position in der Textur (src) und möchte diese auf einen Bereich (Dest) zeichnen. Über ein Rechteck (Bounds) beschränkte ich die Textur. Jetzt müsste ich aber auch Src im Verhältnis zu den angegebenen Bounds beschränken, denn sonst stretched die Zeichenroutine den Buchstaben in das Zielrechteck und das schaut logischerweise bescheuert aus.

Delphi-Quellcode:
var
  Dest, Bounds, Src: TRectF;
begin
  Dest := RectF(100, 100, 200, 200);
  Bounds := RectF(110, 90, 190, 210);

  Src := RectF(1000, 1000, 1032, 1032);

  Dest.Left := Max(Dest.Left, Bounds.Left);
  Dest.Top := Max(Dest.Top, Bounds.Top);
  Dest.Right := Min(Dest.Right, Bounds.Right);
  Dest.Bottom := Min(Dest.Bottom, Bounds.Bottom);
Im Prinzip müsste ich Bounds ja auf einen Bereich zwischen 0..1 umrechnen und dann Src damit bearbeiten, oder? Hat jemand eine Idee? Irgendwie stelle ich mich da gerade etwas dusselig an.

Jens01 30. Sep 2016 13:29

AW: Rechteck skalieren
 
Das Anzeigen von Text auf OpenGL ist so eine Sache.
Mit TextSuite gibt es eine gute Komponente, die das genau so macht.

Peter666 30. Sep 2016 17:55

AW: Rechteck skalieren
 
Naja so eine Sache ist das nicht wirklich :) Im Prinzip ist die Engine fertig und kann neben OpenGL, Firemonkey auch Direct3D nativ. Da sich meine Anzeigelogik im wesentlichen auf 2 austauschbare Funktionen DrawTexture und FillRect beschränken, ist das auch nicht so schlimm.
Auch funktioniert die Textanzeige, allerdings blende ich alle Buchstaben aus, die nicht in der Bounds liegen. Ich wollte aber die Buchstaben auch teilweise anzeigen. Dafür muss ich Src ebenfalls anpassen im Verhältnis zu Dest.

Peter

Blup 19. Okt 2016 09:48

AW: Rechteck skalieren
 
Ungetestet:
Delphi-Quellcode:
//  Dest.Left := Max(Dest.Left, Bounds.Left);
//  Dest.Top := Max(Dest.Top, Bounds.Top);
//  Dest.Right := Min(Dest.Right, Bounds.Right);
//  Dest.Bottom := Min(Dest.Bottom, Bounds.Bottom);

  FaktorX := (Src.Right - Src.Left) / (Dest.Right - Dest.Left);
  FaktorY := (Src.Bottom - Src.Top) / (Dest.Bottom - Dest.Top);

  if Bounds.Left > Dest.Left then
  begin
    Src.Left := Src.Left + (Bounds.Left - Dest.Left) * FaktorX;
    Dest.Left := Bounds.Left;
  end;

  if Bounds.Top > Dest.Top then
  begin
    Src.Top := Src.Top + (Bounds.Top - Dest.Top) * FaktorY;
    Dest.Top := Bounds.Top;
  end;

  if Bounds.Right < Dest.Right then
  begin
    Src.Right := Src.Right + (Bounds.Right - Dest.Right) * FaktorX;
    Dest.Top := Bounds.Right;
  end;
 
  if Bounds.Bottom < Dest.Bottom then
  begin
    Src.Bottom := Src.Bottom + (Bounds.Bottom - Dest.Bottom) * FaktorY;
    Dest.Bottom := Bounds.Bottom;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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