SVG — вычислить матрицу преобразования в SVG с другим окном просмотра

у меня есть SVG с viewbox 0 0 500 500 и преобразование matrix 0.8,0,0,0.8,54,54

Теперь я хочу добавить это преобразование в другие SVG. Проблема в том, что все другие SVG имеют разные окна просмотра. Итак, я написал функцию для расчета преобразования на основе окна просмотра …

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

работает довольно хорошо.

Но теперь я нашел другую проблему. У некоторых SVG есть окно просмотра с другой высотой и шириной (не квадрат).

Я пытаюсь решить эту проблему здесь

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

Но мой расчет не верен. Есть идеи, что я делаю неправильно?

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;
}

РЕДАКТИРОВАТЬ:
SVG результат этой функции
http://jsfiddle.net/nw6ykszn/

5

Решение

Я хотел поставить это как комментарий, но моя репутация не позволяет мне.

Интересно, это опечатка или ошибка в вашем коде?

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

Я думаю, это должно быть:

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

Надеюсь, поможет!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]