PDF线宽如何在水平和垂直方向上与CTM相互作用?

Adr*_*aty 5 pdf graphics

我试图在给定当前变换矩阵(CTM)的情况下确切地弄清楚线宽如何影响PDF中的描边线.两个问题......

第一:如何使用CTM将线宽转换为设备空间?PDF 1.7参考中的页面208 描述了如何使用CTM转换点,假设输入数据是(x,y)点.线宽只是一个值,所以我该如何转换它?我是否像(lineWidth,lineWidth)一样创建一个"虚拟"点?

第二:一旦我进行了计算,我将得到另一个(x,y)点.如果CTM具有不同的水平与垂直比例因子,则会给出两种不同的线宽.这些线宽实际上是如何应用的?第一个(x)是否仅在绘制水平线时应用?

第二个问题的具体示例:如果我使用线宽(2,1)从(0,0)到(4,4)绘制/描边水平线,得到的矩形的边界框的坐标是什么(即,包含线宽的矩形)?

这是参考文献中的第215页,但实际上并没有解释描边线的粗细如何变化:

在设备空间中产生的效果取决于在描边路径时有效的当前变换矩阵(CTM).如果CTM通过水平和垂直维度中的不同因素指定缩放,则设备空间中的描边线的厚度将根据其方向而变化.

mkl*_*mkl 3

\n

如何使用 CTM 将线宽转换为设备空间?

\n
\n\n

线宽本质上是垂直于其方向的线尺寸。因此,要使用 CTM 计算变换后的宽度,请选择垂直于原始线的平面向量,其长度为当前图形状态的线宽,应用 CTM(不进行平移,即将 e 和 f 设置为 0)该向量(通过将第三个坐标设置为 1 嵌入到三维空间中)并计算所得 2D 向量的长度(投影在前两个坐标上)。

\n\n

例如,在当前用户空间坐标中有一条从 (0,0) 到 (1,4) 的线,宽度为 1。您必须找到垂直于它的向量,例如 (-4,1) 通过旋转 90\xc2 \xb0 逆时针,并将其缩放到长度 1,即 ( -4/sqrt(17), 1/sqrt(17) ) 在这种情况下。

\n\n

如果 CTM 是 @Tikitu\'s 答案中的那个

\n\n
\n

CTM 的水平缩放因子为 2,垂直缩放因子为 1

\n
\n\n

这将是

\n\n
2 0 0\n0 1 0\n0 0 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

该矩阵将使上面示例中的线从 (0,0) 到 (2,4) 并且“宽度向量”( -4/sqrt(17), 1/sqrt(17) )将转换为 ( -8/sqrt(17), 1/sqrt(17) )(CTM 已经没有翻译部分),长度为 sqrt(65/17),约为 1.955。即生成的线的宽度(垂直于其方向的尺寸)接近 2。

\n\n

如果原始线为 (0,0) 到 (4,1),宽度为 1,则宽度向量选择将为 ( -1/sqrt(17), 4/sqrt(17) )。在这种情况下,变换后的线将从 (0,0) 到 (8,1),宽度向量将变换为 ( -2/sqrt(17), 4/sqrt(17) ),长度为 sqrt( 20/17) 约为 1.085。即生成的线的宽度(垂直于其方向)略大于 1。

\n\n

您似乎对线路的“角落”感兴趣。为此,您必须获取转换后的线的开头和结尾,并添加或减去转换后的宽度向量的一半。在上面的示例中:

\n\n
    \n
  1. (原始行从 (0,0) 到 (1,4)): ( -4/sqrt(17), 1/(2*sqrt(17)) ), ( 4/sqrt(17), -1/( 2*sqrt(17)) ), ( 2-4/sqrt(17), 4+1/(2*sqrt(17)) ), ( 2+4/sqrt(17), 4-1/(2*开方(17)));

  2. \n
  3. (原始行从 (0,0) 到 (4,1)): ( -1/sqrt(17), 2/sqrt(17) ), ( 1/sqrt(17), -2/sqrt(17) ) , ( 8-1/sqrt(17), 1+2/sqrt(17) ), ( 8+1/sqrt(17), 1-2/sqrt(17) )。

  4. \n
\n\n

但不要忘记,PDF 行通常不会在末尾被切断,而是有一些上限。另外还要记住线宽0的特殊含义。

\n