将opentype转入paper.js,贝塞尔曲线问题

Posted

技术标签:

【中文标题】将opentype转入paper.js,贝塞尔曲线问题【英文标题】:transfer opentype to paper.js, bézier curve problem 【发布时间】:2019-09-24 14:23:27 【问题描述】:

我正在尝试将字体从 opentype 传输到 paper.js 路径对象。我正在使用 opentype.js 从信中获取要点,然后尝试从这些要点中创建新的纸张路径。

听起来很简单,但不知何故我无法计算出这条曲线。我正在尝试通过示例和 paper.js 的参考来了解如何做到这一点。但我找不到它。

从 opentype.js 我得到这样的路径:

type: "C", x: 56.3, x1: 58.4, x2: 56.3, y: 111.9, y1: 90, y2: 97.80000000000001

(这里x/y是基本点,x1/y1和x2/y2是其相关的点处理程序。)

现在我尝试将其放入 paper.js 路径:

var segments = [];

    segments.push(new Segment(
        new Point(119,111.30000000000001)
        ));
    segments.push(new Segment(
        new Point(119,284.1)
        ));
    segments.push(new Segment(
        new Point(139.7,302.7),
        new Point(119,300),
        new Point(125.89999999999999,302.7)
        ));
    segments.push(new Segment(
        new Point(161,284.1),
        new Point(150.2,302.7),
        new Point(161,300.3)
        ));

        var path = new Path(segments);
        path.strokeColor = "black"

所有非弯曲路径都是正确的。但是处理程序显示没有逻辑位置...

有人有什么想法吗?

【问题讨论】:

路径是documented well enough,您显示的是curveTo 指令,从“无论我们在哪里”到“x/y”,超过两个控制点x1/y1 和x2 /y2。鉴于此,我不知道您要使用其他 sn-p 代码显示什么:它根本没有显示您如何尝试绘制它,它只是显示显然不是来自硬编码的值字体? @Mike'Pomax'Kamermans 感谢您的回答。是的,我知道上面不是一封信,它只是我尝试制作路径的一个示例。所以我在这里上传了我的草图(kajetansom.ch/opentype)以便更好地理解。在示例中,我仅使用 paper.js 进行绘制,我仅使用 opentype.js 从字体中获取点。 halder 点似乎是正确的。 (我用红色和蓝色的圆圈和线条标记了它们)。但是,如果我尝试在 paper.js 中使用此句柄,它不会正确使用它们,正如您在蓝色处理程序上看到的那样。希望这能更清楚地描述我的问题。 【参考方案1】:

Segment.handleInSegment.handleOut 是相对于锚点的坐标。确保为手柄提供相对坐标,而不是绝对坐标。

一个简单的解决方案是使用 OpenType.js 将字体转换为 SVG 宽度 Path.toSVG(decimalPlaces),然后使用 importSVG(svg[, options]) 将其导入 paper.js。

【讨论】:

谢谢!它与 SVG 解决方法完美配合 :) 只是为了澄清,我想知道如何从绝对坐标中获取手柄的相对坐标。有办法吗? 当然,要获得相对坐标,只需将绝对值(手柄点的绝对位置)减去锚点位置即可。这将为您提供一个从锚点到手柄点的向量。 谢谢,试试看! :)

以上是关于将opentype转入paper.js,贝塞尔曲线问题的主要内容,如果未能解决你的问题,请参考以下文章

如何比较贝塞尔曲线的形状

如何将大纲数据写入 .otf 文件?

iOS 路径如下:将坐标列表转换为贝塞尔曲线

IOS 贝塞尔曲线详解

用几何画板怎样制作贝塞尔曲线

如何将 gl_lines 与贝塞尔曲线相结合?