SVG - 使用不同的视图框计算变换矩阵到SVG

Pet*_*ter 5 php svg viewbox

我有一个带有视图0 0 500 500和转换的SVGmatrix 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');
Run Code Online (Sandbox Code Playgroud)

效果很好.

但现在我发现了另一个问题.一些SVG具有不同高度和宽度的视图框(不是sqaure).

我试着解决这个问题

$viewboxWH_diff = $toThisViewBox_arr[2]/$toThisViewBox_arr[3];  
$transform_arr_adjusted[5] = $transform_arr_adjusted[5]*$viewboxWH_diff;
Run Code Online (Sandbox Code Playgroud)

但我的计算不正确.我有什么想法?

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;    
}
Run Code Online (Sandbox Code Playgroud)



编辑:
此函数的SVG结果
http://jsfiddle.net/nw6ykszn/

小智 0

我本想将此作为评论,但我的声誉不允许我这么做。

我想知道这是一个拼写错误还是您的代码中也有错误。

$transform_arr_adjusted[5] = $val_1 * $toThisViewBox_arr[3];
Run Code Online (Sandbox Code Playgroud)

我想应该是:

$transform_arr_adjusted[5] = $val_2 * $toThisViewBox_arr[3];
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!