2012-05-02 4 views
7

Gegeben eine rechteckige Form S mit Seitenverhältnis sx/sy und zwei andere rechteckige Formen A (mit Seitenverhältnis ax/ay) und B (mit Seitenverhältnis bx/by) wie Ich finde heraus, welche von Form A oder B das nächste Seitenverhältnis zu S hat? Die Größen der Formen sind unwichtig.So ermitteln Sie, welche Seitenverhältnisse am nächsten sind

Ist nur das von (sx/sy)/(ax/ay) und (sx/sy)/(bx/by) am nächsten an 1?

Was ich eigentlich versuche herauszufinden ist, welche Form auf einer PPTX-Folie am besten zu einem Bild passt, das in der Größe angepasst und dann zugeschnitten wird, um zu dieser Form zu passen. Ich denke, ein anderer Ansatz bestünde darin, herauszufinden, welche Form zu dem Verlust der wenigsten Pixel führt, obwohl es in meinem Code einfacher ist, wenn ich es durch Vergleichen der Seitenverhältnisse tun kann.

Am Ende habe ich mit dem Algorithmus unten ging, wie folgt umgesetzt (dank Matt Ball für sein Feedback):

ShapeInPPTXLocation closest; 
double imageAR = a_imageDim.getWidth()/a_imageDim.getHeight(); 
double aspectRatioCandidateA = a_candidateA.getWidth()/a_candidateA.getHeight(); 
double aspectRatioCandidateB = a_candidateB.getWidth()/a_candidateB.getHeight(); 
double closenessScoreA=1-(imageAR/aspectRatioCandidateA); 
double closenessScoreB=1-(imageAR/aspectRatioCandidateB); 

if (Math.abs(closenessScoreA) <= Math.abs(closenessScoreB)) 
{ 
    closest=a_candidateA; 
} 
else 
{ 
    closest=a_candidateB; 
} 

Antwort

4

Ist es nur Unabhängig davon, welche von (sx/sy)/(ax/ay) und (sx/sy)/(bx/by) ist am nächsten bei 1?

Das klingt vernünftig. Sie könnten auch minimieren nur den Unterschied:

let target_ratio = sx/sy 
let a_ratio = ax/ay 
let b_ration = bx/by 

if |target_ratio - a_ratio| < |target_ratio - b_ratio| 
    a_ratio is closer to target 
else 
    b_ratio is closer to target 

aktualisieren: der Algorithmus in dieser Antwort funktioniert nicht ganz, wie es in den Kommentaren unten erläutert. Der OP hat seine Frage aktualisiert, um den von ihm verwendeten Algorithmus einzuschließen, der anscheinend gut funktioniert.

+0

Ich dachte zuerst darüber nach, aber ich denke, es funktioniert nur, wenn wir annehmen, dass alle Formen X> Y (oder umgekehrt) haben.Zum Beispiel ist das Seitenverhältnis für Portraitbilder immer ein Bruchteil; Für Landschaft ist es eine ganze Zahl. Lass es mich wissen, wenn ich falsch liege - danke –

+0

Angenommen, 'target_ratio' ist' 1', 'a_ratio' ist' 1.1' und 'b_ratio' ist' 0.5' (also die richtige Antwort ist 'a_ratio') . Dann hast du '| -0.1 | <| 0.5 | 'oder' 0.1 <0.5', so dass der 'if' Fall 'wahr' ist, also erhalten wir' a_ratio' vom Pseudocode-Algorithmus. Das funktioniert also gut, wenn Sie eine Mischung aus Quer- und Hochformat verwenden. –

+1

Habe das einfach in meinem Code implementiert und es funktioniert perfekt - danke :-) –

3

auf Anregung über Sehen, ich bin nicht überzeugt:

auf das folgende Beispiel denken: A = 1: 2 B = 2: 1 und

targetRatio = 1: 1

eindeutig sowohl A & B sollte gleichermaßen geeignet sein, aber mit dem Vergleich von

(1 - GoalAR/CandiateAR), wie vorgeschlagen,

aspectRatioCandidateA = 0,5 [1: 2]

aspectRatioCandidateB = 2 [2: 1]

würden Sie

closenessScoreA = 1

closenessScoreB = 0,5

erhalten Der beste Weg, um Seitenverhältnisse zu vergleichen, ist, sie als einen Winkel zu definieren:

tan (o) = h/w

o = atan (h/w)

Sie können dann einfach die Differenz des Winkels jetzt vergleichen.

+0

Die angenommene Antwort wie angegeben funktioniert nicht, wie Ihr Beispiel zeigt. Wenn Sie den Kommentarthread für diese Antwort lesen, werden Sie sehen, was ich getan habe - das war der Algorithmus, den ich in der Frage vorgeschlagen habe. Wie auch immer, danke für deine Eingabe :-) –

+0

Hi. Etwas verwirrt jetzt. Wie ich den aktuellen Thread verstehe, ist der Code in der Frage gedruckt (nach Ihrer Bearbeitung), was Sie verwenden, nicht wahr? Ich habe das mit meinem Gegenbeispiel gemeint. Nehmen wir als Beispiel die beiden Verhältnisse A = 3: 4 = 0,75 und B = 17: 10 = 1,7. Was liegt näher bei G = 5: 4 = 1,25? Laut Ihrem Code wäre es A mit einer Punktzahl von 0,66, während B eine Punktzahl von 0,735 hat. Wenn Sie jedoch die Winkel vergleichen, endet B mit "näher" am Ziel. B hat ein Theta von 59,53, A hat ein Theta von 36,869 und das Ziel liegt bei 51,34. – BmyGuest

+1

Ihre Methode kann genauer sein (es scheint vernünftig). Mit dem 'my' -Algorithmus gewinnt B aber auch: s A's (sx/sy)/(ax/ay) = 1.67; B (sx/sy)/(ax/ay) = 0,74; A's Score (Nähe zu 1) = 1-1.67 = 0.67; B's Score = 1-0,74 = 0,26. Es sei denn, ich habe einen Fehler gemacht ;-) –

Verwandte Themen