![]() |
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:
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.
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); |
AW: Rechteck skalieren
Das Anzeigen von Text auf OpenGL ist so eine Sache.
Mit ![]() |
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 |
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 16:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz