Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SVG-如何将变换矩阵应用于径向渐变? 我正在编写一个C++应用程序,它能够打开几个SVG文件并在屏幕上绘制它们。其中一些包含径向梯度,其中提供了变换矩阵。我需要计算最终的梯度值,以适用于执行绘图之前,但我有一些麻烦做到这一点 例如,考虑下面的SVG:_Svg_Matrix_Transform_Draw_Radial Gradients - Fatal编程技术网

SVG-如何将变换矩阵应用于径向渐变? 我正在编写一个C++应用程序,它能够打开几个SVG文件并在屏幕上绘制它们。其中一些包含径向梯度,其中提供了变换矩阵。我需要计算最终的梯度值,以适用于执行绘图之前,但我有一些麻烦做到这一点 例如,考虑下面的SVG:

SVG-如何将变换矩阵应用于径向渐变? 我正在编写一个C++应用程序,它能够打开几个SVG文件并在屏幕上绘制它们。其中一些包含径向梯度,其中提供了变换矩阵。我需要计算最终的梯度值,以适用于执行绘图之前,但我有一些麻烦做到这一点 例如,考虑下面的SVG:,svg,matrix,transform,draw,radial-gradients,Svg,Matrix,Transform,Draw,Radial Gradients,绘制后,此SVG应给出以下结果: 在我的应用程序中,只要忽略他提供的变换矩阵,我就可以绘制SVG。在这种情况下,我有一个连贯的结果,但当然,不符合预期的结果 现在我尝试将变换矩阵应用于径向梯度值。我得到的结果完全不一致 这里是我在C++代码中试图做的伪代码,以获得正确的转换梯度值: 矢量2笔刷半径笔刷.Radius.Width,笔刷.Radius.Height; 矢量2画笔中心画笔.Center.X,画笔.Center.Y; 矢量2笔刷焦点笔刷.Focus.X,笔刷.Focus.Y; brush

绘制后,此SVG应给出以下结果:

在我的应用程序中,只要忽略他提供的变换矩阵,我就可以绘制SVG。在这种情况下,我有一个连贯的结果,但当然,不符合预期的结果

现在我尝试将变换矩阵应用于径向梯度值。我得到的结果完全不一致

这里是我在C++代码中试图做的伪代码,以获得正确的转换梯度值:

矢量2笔刷半径笔刷.Radius.Width,笔刷.Radius.Height; 矢量2画笔中心画笔.Center.X,画笔.Center.Y; 矢量2笔刷焦点笔刷.Focus.X,笔刷.Focus.Y; brushRadius=brush.Matrix.TransformbrushRadius; brushCenter=brush.Matrix.TransformbrushCenter; brushFocus=brush.Matrix.TransformbrushFocus; brush.m_半径=SizeBrush半径.X,brush半径.Y; brush.m_Center=PointbrushCenter.X,brushCenter.Y; brush.m_Focus=PointbrushFocus.X,brushFocus.Y; 显然,这是行不通的


有人能解释一下我做错了什么,以及如何将变换矩阵应用于径向梯度值以获得正确的结果吗?

考虑Inkscape在其UI中表示径向梯度的方式:

我已经改变了你的例子,所以焦点与中心不同,它显示为中心下方的十字

您可以使用此UI以一种立即应用gradientTransform的方式操纵渐变,而不知道其确切参数。你看到的是中心和两个向量,或者,如果你想的话,是定义一个非退化平行四边形的点。缩放向量以使其长度不同,但它们也会旋转。虽然在这种情况下,它们是垂直的,但它们也可能是倾斜的

在最后绘制渐变时,需要的是所有三个点的坐标加上焦点。这将是八个独立的值,而您当前的定义只设置了六个


设置四个二维坐标在数学上与设置两个坐标加上一些额外的独立值(可能是宽度、高度、旋转和倾斜)完全相同。那将取决于你是如何画的。表示之间的转换是一个纯粹的数学问题。但正如你从线性代数中应该知道的那样:你总是需要八个独立的值。

如果我在浏览器或其他渲染器中打开你的SVG,我会得到你的第一张图像。这不是你的目标吗?您使用什么渲染器?我没有使用渲染器,我正在编写渲染器:-。我的目的是写一个C++应用程序,它在屏幕上画出一个SVG。为此,我需要了解数学在幕后是如何运作的。啊……从这个问题上我不清楚。没问题。在这个例子中,我将试图澄清我的帖子。最后我在代码中发现了这个问题,事实上,这是我计算焦点时的一个数学错误。谢谢你的回答,它帮助我找到了问题所在。