2014-12-14 21 views
5

mam SVG z viewbox 0 0 500 500 i transformacji matrix 0.8,0,0,0.8,54,54SVG - Oblicz macierz transformacji do formatu SVG z innym viewbox

teraz chcę dodać to przekształcić do innych pomostów żylnych. Problem polega na tym, że wszystkie pozostałe SVG mają inny widok. Więc napisałem funkcję do obliczenia transformacji na podstawie widoku ...

getAdjustedTransform('0.8,0,0,0.8,54,54','0 0 500 500','0 0 100 100'); 

działa całkiem dobrze.

Ale teraz znalazłem inny problem. Niektóre SVG mają viewbox o innej wysokości i szerokości (nie sqaure).

Staram się rozwiązać ten problem tutaj

$viewboxWH_diff = $toThisViewBox_arr[2]/$toThisViewBox_arr[3]; 
$transform_arr_adjusted[5] = $transform_arr_adjusted[5]*$viewboxWH_diff; 

Ale moja kalkulacja nie jest poprawna. Jakieś pomysły, które popełniam źle?

function getAdjustedTransform($transform,$viewBox,$toThisViewBox) 
{ 
    $transform_arr  = explode(",", $transform);  // transform from the source SVG 
    $viewBox_arr  = explode(" ", $viewBox);  // viewbox from the source SVG 
    $toThisViewBox_arr = explode(" ", $toThisViewBox);    

    $transform_arr_adjusted = array(); 

    $val_1 = $transform_arr[4]/$viewBox_arr[2]; 
    $val_2 = $transform_arr[5]/$viewBox_arr[3]; 

    $transform_arr_adjusted[0] = $transform_arr[0]; 
    $transform_arr_adjusted[1] = $transform_arr[1]; 
    $transform_arr_adjusted[2] = $transform_arr[2];     
    $transform_arr_adjusted[3] = $transform_arr[3]; 
    $transform_arr_adjusted[4] = $val_1 * $toThisViewBox_arr[2]; 
    $transform_arr_adjusted[5] = $val_1 * $toThisViewBox_arr[3]; 

    // if viewbox with and height != 
    if($toThisViewBox_arr[2] != $toThisViewBox_arr[3]) 
    { 
     if($toThisViewBox_arr[2] > $toThisViewBox_arr[3]) 
     { 
      $viewboxWH_diff = $toThisViewBox_arr[2]/$toThisViewBox_arr[3]; 
      $transform_arr_adjusted[5] = $transform_arr_adjusted[5]*$viewboxWH_diff; 
     } 
     else 
     { 
      $viewboxWH_diff = $toThisViewBox_arr[3]/$toThisViewBox_arr[2]; 
      $transform_arr_adjusted[5] = $transform_arr_adjusted[5]*$viewboxWH_diff; 
     } 
    } 

    $transform_arr_adjusted = implode(',',$transform_arr_adjusted); 
    return $transform_arr_adjusted;  
} 



EDIT:
wyniki SVG z tej funkcji
http://jsfiddle.net/nw6ykszn/

+0

Wygląda na to, że próbujesz napisać własną metodę getCTM lub getScreenCTM, dlaczego zamiast tego użyć funkcji wbudowanych w funkcje SVG DOM? –

+0

Nie wiedziałem, że on istnieje. Ale to tylko rozwiązanie JS, prawda? – Peter

+0

Tak, to jest implementacja Firefoksa (w C++), jeśli chcesz ją zaimplementować: http://mxr.mozilla.org/mozilla-central/source/dom/svg/SVGContentUtils.cpp#380 w php –

Odpowiedz

0

Chciałam umieścić to jako komentarz, ale moja reputacja nie pozwala mi.

Zastanawiam się, czy jest to literówka lub czy błąd występuje również w kodzie.

$transform_arr_adjusted[5] = $val_1 * $toThisViewBox_arr[3]; 

Chyba powinno być:

$transform_arr_adjusted[5] = $val_2 * $toThisViewBox_arr[3]; 

Nadzieję, że to pomaga!