Otrzymany prostokątny kształt S, o współczynniku kształtu sx/sy i dwa inne prostokątne kształty A (ze współczynnikiem proporcji ax/ay) i B (ze współczynnikiem kształtu bx/o), w jaki sposób Dowiaduję się, który z kształtów A lub B ma najbliższy współczynnik proporcji do S? Rozmiary kształtów są nieistotne.Jak określić, które współczynniki proporcji są najbliższe?
Czy to tylko wartość (sx/sy)/(ax/ay) i (sx/sy)/(bx/by) jest najbliżej 1?
Tym, co faktycznie próbuję zrobić, jest sprawdzenie, który kształt na slajdzie PPTX najlepiej pasuje do obrazu, który zostanie przeskalowany, a następnie przycięty, aby dopasować go do tego kształtu. Myślę, że innym podejściem byłoby ustalenie, który kształt powoduje utratę najmniejszej liczby pikseli, chociaż w moim kodzie będzie łatwiej, jeśli będę mógł to zrobić, porównując współczynniki proporcji.
W końcu poszedłem z poniższym algorytmem, realizowane w następujący sposób (dzięki Matt piłka do jego sprzężenie zwrotne):
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;
}
Początkowo o tym myślałem, ale myślę, że działa to tylko wtedy, gdy założymy, że wszystkie kształty mają X> Y (lub vice wers).Na przykład w przypadku obrazów portretowych proporcje są zawsze ułamkami; dla krajobrazu jest liczbą całkowitą. Daj mi znać, jeśli się mylę - dzięki –
Załóżmy, że 'target_ratio' to' 1', 'a_ratio' to' 1.1', a 'b_ratio' to' 0.5' (więc poprawna odpowiedź to 'a_ratio') . Następnie masz '| -0.1 | <| 0.5 | 'lub' 0.1 <0.5', więc przypadek 'if' jest" prawdziwy ", więc otrzymujemy' a_ratio' z algorytmu pseudokodowania. Tak więc działa to dobrze, gdy używa się mieszanki krajobrazu i portretu. –
Po prostu zaimplementowałem to w moim kodzie i działa idealnie - dzięki :-) –