为有牺牲多壮志,敢教日月换新天。

3、检查,修改和构造绘图

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: https://www.cnblogs.com/strengthen/p/14088714.htmlfalse
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

  使Apple Pencil成为在应用程序内进行绘图和书写的更加有用的工具。使用PencilKit,您可以深入研究构成图形的笔触,墨水,路径和点,使用它们来构建使用识别的功能,并根据输入来修改图形。探索如何动态生成形状和图形,并了解有关PKDrawings和PKStrokes之类的API的更多信息。为了从本届会议中获得最大收益,我们建议您首先查看“ Incomducing PencilKit”,它在WWDC19的首次亮相中概述了PencilKit框架,并在WWDC20的“ PencilKit的新功能”中提供了概述。


 

您好,欢迎来到WWDC。

嗨,我是Will Thimbleby。我们将深入研究PencilKit绘图,了解它们的构成以及如何使用它们。PencilKit超级易于采用,可提供美观,逼真的墨水,最佳的低延迟绘图体验以及iOS 14中UI的一些重大新改进。有关这些改进的更多信息,请参见“ PencilKit的新增功能”。

在iOS 14中,我们还允许您查看PencilKit的数据模型:绘图,笔触,墨水,路径和点。这将使您能够使用PencilKit在应用程序中构建一些很棒的新功能。

通过访问数据模型,您将能够检查用户绘制的内容,对绘制的内容做出反应,处理现有图形或从头开始动态创建新图形。为了举例说明PencilKit的新功能,让我直接进入演示。

该演示也可以作为示例代码获得。我一直在开发一个应用程序,以帮助我七岁的儿子练习他的笔迹。这个应用程序的顶部是一个文本字段,上面有我要他练习的单词。

下面是同一文本的合成PencilKit绘图。我可以使用键盘更改此文本,但这是Pencil演示。我可以使用很棒的新Scribble功能,顺便说一句,它也使用PencilKit,可以将文本更改为我希望他练习的内容,也许更适合7岁的孩子。

输入文本时,下面的模板PencilKit绘图是由各个字母构成的。

在右上角,我还可以选择我想要他练习的大小和难度。

现在有了模板,我们开始练习手写。下一个要复制的笔画由该红点动画显示,该红点显示了如何写下一个字母。我要做的就是复制它。

如果我写的内容接近模板,则笔迹变为绿色,然后继续。如果我写的不好,笔画会消失,动画会重复。

我的分数显示在右上方。

让我们看看我该怎么做。

我们做得很好,所以我们得到了烟花,这是七岁孩子的主要激励工具。

但是我花了几年的时间来练习笔迹,所以为什么不尝试一些棘手的事情呢?我画了PencilKit连字,并将其添加到应用程序中。

现在我们可以练习书法了。

该应用程序正在从文本中合成PencilKit绘图,对它们进行动画处理,并对我写的内容进行识别。这只是您现在可以访问PencilKit数据模型的小例子因此,让我们看一下PencilKit绘图。在这里,我们有一个简单的花图。

如果将其拆分,我们可以看到该图形是由许多PencilKit笔划组成的。每个笔划代表用户绘制的单独线条。

这些笔画是按照用户绘制它们的顺序进行的,因此您可以看到先绘制了花朵的轮廓,然后绘制了茎,叶,最后整个物体都用记号笔着色了。

这里有我绘制的数据资产,其中包含我刚刚给出的演示的小写字母。为了能够生成文本,我们首先要将此绘图拆分为单个字母。

以后,将这些字母组合起来以生成用户用来练习的模板文本

为了拆分此绘图,我们采用小写字母绘图并获得其笔触。

我们对该数组进行切片以获得每个字母的笔划。

然后,我们可以为该切片中的每个字母创建新图形。对于字母表中的每个字母重复此操作。

如果要检查或修改工程图,可以通过访问工程图的笔划数组来完成。

您也可以使用笔触从头开始创建新图形。

那么,中风呢?什么构成了PencilKit笔划?对于笔画,主要特征是路径。这提供了笔触的形状。

您还可以使用一种墨水来描述笔触的外观:其颜色和类型。

变换给出笔划的方向和位置。

笔触也可以带有面具,我们将在本演讲的稍后部分讨论。

笔划的另一个有用的属性是renderBounds,这是一个边界框,在渲染时涵盖了整个笔划renderBounds考虑了所有笔触属性的效果,包括路径,墨水,变换和蒙版。

墨水描述笔画的外观,其中包含墨水的类型和颜色。

墨水没有宽度。笔划的宽度沿笔划路径是可变的。

笔触路径描述了笔触的形状以及该形状沿路径变化时的外观。例如,笔划路径为您提供了任意点的笔划宽度。

PencilKit笔划路径是PencilKit笔划点的统一三次B样条曲线现在,这是一个很大的嘴。那是什么意思?这意味着路径的内容实际上是B样条的控制点。

因此,如果我们遍历路径中的点...

然后依次画每个

结果点实际上不在笔画上。这些点是B样条控制点,可能不是您要绘制的点。

为了获得实际路径上的点,我们需要对样条曲线进行插值。

为了对样条进行插值,我们使用interpolatedPoints strideBy访问这些点

这提供了一系列点,我们可以像以前一样进行迭代。绘制这些为我们提供了路径上的一系列要点。

这里有几件事要注意。它们在路径上,它们更多,并且它们具有均匀的间距,在这种情况下,间距为50点,这是传递给该方法的跨步参数。

您可能还会注意到,最后一点的间距不均匀。这是因为无论步幅如何,都会始终生成笔划的最后一点您可以跨越距离,如本例中的时间或参数值。距离和时间不言自明。距离是图形坐标空间中的点,时间是以秒为单位的持续时间,这取决于用户绘制的速度。

参数值与B样条的参数插值有关。

为了解释什么是参数值,让我们重新绘制控制点。这与我们之前使用的代码相同。

如果不是绘制控制点,而是遍历路径的索引,该索引从零到控制点计数,并且在每次迭代中,我们都使用interpolatedPoint(at)获得参数值0、1、2、2的点。 3等等,画出...

我们得到等效点到控制点。但是这些要点实际上正在解决。

为什么这有用?让我们对要点进行编号,以便您了解发生了什么。参数值很有用,因为它是浮点值。

这意味着您可以要求任何值的插值点,包括控制点之间的非整数值,例如2.4或4.8 ...

等等。

这使您可以灵活地以任意方式插入笔划路径到目前为止,我们看到的所有插值都以统一的步长对路径进行插值。

使用参数值,PencilKit还可以使用parametricValue,offsetBy沿路径步距任意距离。

此功能使您可以在路径上向前或向后偏移任何时间或距离的参数值

进行动画制作时,非均匀步进有用的地方之一我之前提供的演示使用此功能为笔划上的红色标记点设置动画。

每帧,即笔画上的当前标记位置,都偏移了自上一帧以来的确切持续时间。

非均匀的步进是必要的,因为我们不能始终保证动画帧之间的时间均匀

要在演示中制作动画,首先要获得增量时间,即当前帧和上一帧之间经过的时间。

我们用它来使当前动画参数值沿路径偏移相同的时间。这会沿着笔画路径以与用户绘制时相同的速度进行动画处理

最后,我们更新标记位置,从新参数值获取路径上的新位置。

这就是道路。路径上的控制点和内插点都是PencilKit笔触点。这些是路径和笔触的原子构造块。它们在特定位置捕获笔画的外观和触摸信息这些点以有损压缩格式存储,因此您创建的任何点都不会捕获精确使用的值让我们仔细看一下笔画中的这些点之一。

PencilKit笔触点具有多个外观属性。

首先是该点的位置。

一个点也有一个大小,对于标记笔触,该大小将不是正方形。

旋转角度或方位角。

最后,不透明。这些属性组合起来描述笔划如何在特定位置出现。

笔触点还具有一些不是外观属性的属性。绘制笔划时,力和高度与UITouch中的值相同。时间偏移量是指该点所属笔划路径的创建日期以来的偏移量(以秒为单位)。这提供了有关用户如何绘制笔划的时间信息。

现在,我们将跳回去谈论未涵盖的PencilKit笔触的最后一个属性...

那就是掩盖。

当像素擦除器仅用于擦除笔划的一部分时,通常会创建蒙版的笔划。

大多数笔划通常不会被擦除,但是当它们被擦除时,将使用遮罩在渲染中剪切这些笔划并调整用户如何在画布上与它们交互。

口罩可能有孔。

或者他们可以将笔画切成多段。在此示例中,使用橡皮擦将笔划分为两个单独的笔划。

这些将成为唯一的独立笔画,并且对用户和API均如此。

例如,这两个新笔触中的每一个都有其自己单独的变换和蒙版。

用户可以选择一个笔画并在不影响另一个笔画的情况下四处移动

PencilKit笔划被遮盖,但笔划路径未被遮盖。这意味着如果我们采用之前使用的代码来绘制笔画路径,然后使用该代码来绘制蒙版笔画...

我们将获得比我们想要的更长的路。

相反,我们要使用笔触的maskedPathRanges属性。当将其裁剪到蒙版时,这是笔触路径上的参数值范围的数组。

在这里,我们遍历maskedPathRanges ...

并在每个范围内插入点。

这样可以正确地对笔画路径进行解释,这对于蒙版笔画是有意义的。

笔划的遮罩范围可以为零。

例如,如果用户擦除了笔划的一部分,则仅擦除了一部分,而该部分未与路径样条线相交,则生成的蒙版笔划将具有零maskedPathRanges。

笔触也可以具有多个遮罩范围。

在这种情况下,其中带有孔的笔划有四个单独的范围。

识别是可以使用PencilKit构建的许多出色功能的基础。基于样条的识别可以利用这些maskedPathRanges来提供对蒙版笔划的明智解释,这就是我们在Notes中进行手写识别的方式。

解释笔划时,可以使用maskedPathRanges获取一定范围的点,根据需要对其进行插值,并使用时间和力量等非外观属性来补充路径的形状。

您之前看到的演示提供了基于样条识别的简单示例。它使用匹配算法对用户绘制的内容与尝试复制的模板之间的相似性进行比较和评分

如果要进行基于图像的识别,请使用PKDrawing上的渲染API生成图像。

PencilKit提供了一种超级简单的方法,可以为您的应用程序添加强大的Pencil支持。现在,您可以查看图纸内部并访问笔划,墨水,路径和点,检查用户编写和绘制的内容,以构建功能,例如新的Scribble体验,该体验使用PencilKit在整个iPadOS的文本字段中实现手写。

修改工程图以创建可响应用户操作的交互式工程图体验并按程序创建新图形,就像示例代码那样生成用于练习的手写模板。

几乎所有应用程序都增加了对铅笔(我们最有表现力的输入设备之一)的支持PencilKit一直是向应用程序添加绘图的一种绝妙方式,现在您可以在绘图内部查看,它也是要构建的以Pencil为中心的新体验的强大基础

posted @ 2020-12-05 10:51  为敢技术  阅读(310)  评论(0编辑  收藏  举报