Seite 1 von 1

Richtig skalieren

Verfasst: 01.10.2010, 10:23
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?

Re: Richtig skalieren

Verfasst: 01.10.2010, 10:50
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

Re: Richtig skalieren

Verfasst: 01.10.2010, 10:57
von joggel
Ja, ich möchte dass das Rechteck (Rect1) so skaliert wird, dass es komplett in das Rechteck (Rect2) passt.

Re: Richtig skalieren

Verfasst: 01.10.2010, 11:03
von Krishty
Das geht aber nicht, ohne das Seitenverhältnis zu ändern.
Das sind deine Möglichkeiten:
SV.png
SV.png (2.31 KiB) 1732 mal betrachtet

Re: Richtig skalieren

Verfasst: 01.10.2010, 11:09
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.

Re: Richtig skalieren

Verfasst: 01.10.2010, 11:14
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));

Re: Richtig skalieren

Verfasst: 01.10.2010, 11:24
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