SVG-如何将渐变变换矩阵应用于线性渐变笔刷? 我用C++语言写了一个SVG查看器应用程序。事实上,我在几个SVG文件中遇到了一个无法理解的转换问题

SVG-如何将渐变变换矩阵应用于线性渐变笔刷? 我用C++语言写了一个SVG查看器应用程序。事实上,我在几个SVG文件中遇到了一个无法理解的转换问题,svg,matrix,gradient,transformation,linear-gradients,Svg,Matrix,Gradient,Transformation,Linear Gradients,考虑以下SVG文件: 这基本上是一个用渐变笔刷填充的矩形,从橙色到洋红。应用所有变换后,矩形大小为90x145,位于坐标[0,0]处 如果我很好地理解了原理,为了正确绘制矩形,我应该执行以下步骤: 计算本地文档坐标系中由x1、y1、x2和y2值给出的渐变笔刷边界框。这应该通过将给定的梯度变换矩阵应用于从x1、y1、x2和y2计算出的点来实现 由于渐变单位被声明为“用户使用空间”,因此根据线性渐变标记值和变换的边界框计算笔刷 转换要填充的矩形坐标,并将其放入文档坐标系中 使用先前创建的画笔,在

考虑以下SVG文件:


这基本上是一个用渐变笔刷填充的矩形,从橙色到洋红。应用所有变换后,矩形大小为90x145,位于坐标[0,0]处

如果我很好地理解了原理,为了正确绘制矩形,我应该执行以下步骤:

  • 计算本地文档坐标系中由x1、y1、x2和y2值给出的渐变笔刷边界框。这应该通过将给定的梯度变换矩阵应用于从x1、y1、x2和y2计算出的点来实现
  • 由于渐变单位被声明为“用户使用空间”,因此根据线性渐变标记值和变换的边界框计算笔刷
  • 转换要填充的矩形坐标,并将其放入文档坐标系中
  • 使用先前创建的画笔,在变换后的坐标处绘制矩形
  • 应用上述过程,我希望达到以下结果:

    但我得到的结果是:

    如果我手动更改上述源文件中的所有值,以删除所有变换并应用文档坐标中的所有值,则矩形中的线性渐变将正确填充。因此,如果有人能向我解释,我会非常感激

  • 在我的过程中我做错了什么
  • 我应该如何计算线性渐变值
  • 如何将梯度矩阵应用于给定值?(也就是说,我希望将矩阵应用于值时应在文档系统坐标中进行转换,因此转换后的值应大致给出x1=0、y1=0、x2=90和y2=145的结果,但事实并非如此)
  • 注意首先欢迎以数学形式演示

    ,我认为使用术语“边界框”表示渐变是没有帮助的。四个值x1、x2、y1、y2描述了一个向量,梯度停止点匹配到该向量上,并且梯度法线垂直于该向量(在应用任何变换之前)。“长方体”与渐变特性没有任何意义的关系

    梯度向量可以可视化为线元素

    <line x1="74.658" y1="-398.92" x2="75.519" y2="-485.7" />
    
    (由于变换不引入倾斜,因此渐变法线仍然垂直于该线。)

    此时,渐变将应用于局部坐标系中的矩形

    请注意,如果转换已直接应用于rect,而不是封闭组,则这甚至是正确的。将变换应用于元素始终是要执行的最后一个操作

    我认为,您出错的地方是将
    userSpaceOnUse
    解释为对矩形应用变换后的最终坐标系。但它是什么呢

    在引用渐变元素时就位

    因此,在进一步变换之前。

    首先,我认为使用术语“边界框”作为渐变是没有帮助的。四个值x1、x2、y1、y2描述了一个向量,梯度停止点匹配到该向量上,并且梯度法线垂直于该向量(在应用任何变换之前)。“长方体”与渐变特性没有任何意义的关系

    梯度向量可以可视化为线元素

    <line x1="74.658" y1="-398.92" x2="75.519" y2="-485.7" />
    
    (由于变换不引入倾斜,因此渐变法线仍然垂直于该线。)

    此时,渐变将应用于局部坐标系中的矩形

    请注意,如果转换已直接应用于rect,而不是封闭组,则这甚至是正确的。将变换应用于元素始终是要执行的最后一个操作

    我认为,您出错的地方是将
    userSpaceOnUse
    解释为对矩形应用变换后的最终坐标系。但它是什么呢

    在引用渐变元素时就位


    因此,在进一步转换之前。

    感谢您提供的详细答案,它帮助我找到了错误所在。如何使用Matrix4(c++语言)将计算线信息(与渐变相关)添加到矩形?感谢您提供的详细答案,它帮助我找到了错误所在。如何添加计算线信息是否使用Matrix4(c++语言)将(与渐变相关)添加到矩形?
    <rect width="145" height="90" x="7.631" y="139.36"/>
    <line x1="76.6302" y1="235.055" x2="77.4972" y2="131.787" />
    
    <rect width="145" height="90" x="7.631" y="139.36"/>
    <line x1="70" y1="95.7" x2="69.87" y2="-7.57" />