Richtig skalieren

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
joggel

Richtig skalieren

Beitrag von joggel »

Hallo,

ich komme einfach nicht weiter...
Ich habe zwei Rechtecke. Das eine (Rect1) ist ein BoundingRect und das zweite (Rect2) ist ein Windows-Fenster.

Nun meine Frage:
Wie bekomme ich den Skalierungsfaktor heraus? Also das Rect1 soll nur vergößert/verkleinert werden, das Seitenverhältnis soll gleich bleiben.

Ich gehe im Moment wie folgt vor (etwas Pseudocode, hoffe er ist aussagend):

Code: Alles auswählen

	float w(mBoundingRect->mMax.getX() - mBoundingRect->mMin.getX());    //TestDaten: w=11
	float h(mBoundingRect->mMax.getY() - mBoundingRect->mMin.getY());    //TestDaten: h=27

       //TestDaten: widgetSize.width == 116; widgetSize.height == 564
	Rechteck widgetRect(Punkt2dBild(0,0),Punkt2dBild(widgetSize.width()-1,widgetSize.height()-1));

	float scale(0.0f);
	if(h>=w)              // 
		scale=(h/widgetSize.height());
	else
		scale=(w/widgetSize.width());

	Rechteck testNeueDimension(Punkt2dBild(0,0),Punkt2dBild(w/scale,h/scale));
	//testNeueDimension.width  == 239.933;
	//testNeueDimension.height == 564.999;

Wie man sieht, die neue Dimension passt "perfekt" in der Höhe in das Fenster.
Aber die Breite.... sie ist zu Groß!
Ich könnte jetzt noch einen neuen ScaleFaktor berechnen, also sowas wie:

Code: Alles auswählen

scaleNew = testNeueDimension.width/widgetSize.width();
testNeueDimension.width = Punkt2dBild(testNeueDimension.width/scale);
testNeueDimension.height = Punkt2dBild(testNeueDimension.height /scale);

Aber irgendwie bin ich damit nicht zufrieden....
Gibt es einen direkteren Weg?
Benutzeravatar
Krishty
Establishment
Beiträge: 8264
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Richtig skalieren

Beitrag von Krishty »

joggel hat geschrieben:Also das Rect1 soll nur vergößert/verkleinert werden, das Seitenverhältnis soll gleich bleiben.
[…]
Wie man sieht, die neue Dimension passt "perfekt" in der Höhe in das Fenster.
Aber die Breite.... sie ist zu Groß!
Du möchtest ein Rechteck des einen Seitenverhältnisses zu einem Rechteck eines anderen Seitenverhältnisses skalieren, ohne das Seitenverhältnis zu ändern? óÔ

Oder möchtest du nur, dass die Breite passt und dafür die Höhe zu groß / klein ist?

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: Richtig skalieren

Beitrag von joggel »

Ja, ich möchte dass das Rechteck (Rect1) so skaliert wird, dass es komplett in das Rechteck (Rect2) passt.
Benutzeravatar
Krishty
Establishment
Beiträge: 8264
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Richtig skalieren

Beitrag von Krishty »

Das geht aber nicht, ohne das Seitenverhältnis zu ändern.
Das sind deine Möglichkeiten:
SV.png
SV.png (2.31 KiB) 1653 mal betrachtet
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: Richtig skalieren

Beitrag von joggel »

Na doch. Es müsste doch gehen...
Das Rechteck soweit verkleinern, das es eben in das Rechteck passt! Aber das Seitenverhältnis beibehalten.
Man muss es nur soweit skalieren, dass die Breite des Rect1 <= Breite des Fensters und Höhe des Rect1 <= Höhe des Fensters ist.
Benutzeravatar
Krishty
Establishment
Beiträge: 8264
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Richtig skalieren

Beitrag von Krishty »

Also Nr. 1 –

Ja, das geht relativ einfach. Du findest heraus, wie du das Rechteck zur selben Höhe skalieren würdest und wie du es zur selben Breite skalieren würdest. Dann nimmst du das Minumum der beiden Faktoren und skalierst damit. (Du musst auch die Reihenfolge der Division umkehren, damit du einen Faktor erhälst, mit dem du multiplizieren kannst):

Code: Alles auswählen

// w und h zu Größe des Widgets
float const widthScaleFactor = widgetRect.width / w;
float const heightScaleFactor = widgetRect.height / h;
float const scaleFactor = min(widthScaleFactor, heightScaleFactor);
Rechteck testNeueDimension(Punkt2dBild(0,0), Punkt2dBild(w*scaleFactor,h*scaleFactor));
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: Richtig skalieren

Beitrag von joggel »

Okay, danke! Das hat mir geholfen!

[Edit]
Ich sollte vlt. erwähnen, das "w" und "h" nicht die Größe des Widgets ist, sonder die Größe des ersten Rechtecks (Rect1).
Nicht das es da Misverständnisse gibt
Antworten