iOS中的胶粘效应

iOS中的胶粘效应,ios,animation,Ios,Animation,我正在做一个小项目,我希望两个圆圈通过胶粘效果连接起来。我在网上搜索了很多,遇到了一些以tabbar或边栏菜单形式出现的例子,但这些都是固定的,不是我想要的 我基本上想要的是。所以有一个圆,如果我把它拉近到另一个圆上,它会弹在一起,也称为胶粘效应 一个代码示例是最好的,但是如何做到这一点的方向/方法也会帮助我解决这个问题。有趣的问题 在我的脑海中,以下是我可能会如何处理它: 计算两个圆的交点(我找到了这个链接:) 计算每个圆相交部分的圆弧范围 将这些圆弧范围扩大几度。定义每个圆其余部分的圆弧(将

我正在做一个小项目,我希望两个圆圈通过胶粘效果连接起来。我在网上搜索了很多,遇到了一些以tabbar或边栏菜单形式出现的例子,但这些都是固定的,不是我想要的

我基本上想要的是。所以有一个圆,如果我把它拉近到另一个圆上,它会弹在一起,也称为胶粘效应

一个代码示例是最好的,但是如何做到这一点的方向/方法也会帮助我解决这个问题。

有趣的问题

在我的脑海中,以下是我可能会如何处理它:

计算两个圆的交点(我找到了这个链接:)

计算每个圆相交部分的圆弧范围

将这些圆弧范围扩大几度。定义每个圆其余部分的圆弧(将绘制为“非粘性”的部分)

使用trig和,为每个圆的外部“非粘性”部分创建闭合路径

Catmull Rom算法应该使用平滑曲线填充两部分圆之间的间隙,这些曲线看起来很像您显示的“粘性”圆

我在github上有一个项目,其中包括从一系列点创建Catmull Rom样条线的Swift代码:

该项目将创建开放曲线,而不是闭合路径。使用Catmull Rom样条曲线创建平滑闭合路径的技术略有不同。我有另一个名为(用Objective-C编写)的Github项目,它创建平滑的闭合路径。您应该能够了解如何更改Swift代码以从Objective-C代码创建闭合路径。我已经很久没有写过RandomBlobs代码了,我不记得我到底做了什么


我不确定我上面描述的方法是否足够快,可以实时绘制,但我打赌它会。Trochoidemo项目正在为每个动画帧执行大量的trig,它的动画非常平滑。如果您的项目不够顺利,您可能需要进行一些优化。

因此,您希望在用户与该圆圈交互时产生这种效果,然后在两个圆圈相遇或离开时产生这种效果。对吗?计算bezier曲线的当前形状点可以通过以下方式完成:;我推荐阅读作为一个好的开始。也许你可以从这项技术中得到启发:@holex,你是说你有一种从曲线推导贝塞尔曲线控制点的通用方法吗?我可以看到你发布的链接如何让你找到两个圆的区域,这两个圆将被“画向”另一个圆(假设两个圆在实际重叠之前开始扭曲)。但我一直想知道是否有一种方法可以从“局部最大值和最小值”导出三次Bézier曲线的控制点曲线上的点。你的帖子暗示了有这样一种方法,@holex,我可以看到你如何使用外切线来找到每个圆上的点,从圆弧过渡到“粘性”圆开始遇到的曲线,但是你如何计算bezier控制点以确保没有“扭结”从每个圆过渡到圆相交的曲线的点的形状?听起来像是一个有趣的数学方法。我将仔细阅读这篇文章,看看我是否能找到一些解决方案。我不太确定我的编程是否如此先进,但我想看看我是否能想出一些解决方案。没想到会变得这么困难,在网络上,它只是一些svg过滤器哈哈。谢谢你给我一些把手!我真的很感激,因为这个问题太宽泛了,我不知道如何使它更具体,所以我会把你的答案标记为正确答案。:)我注意到在你的例子中,两个圆在实际接触之前就开始扭曲。正如@holex所建议的那样,使用内部切线为贝塞尔曲线选择端点将是获得这种效果的一个好方法,尽管我不确定如何在没有扭结的情况下从圆平滑过渡到贝塞尔曲线。@Duncac,是的,这是一个很好的开始,但实际的最终解决方案要简单得多;贝塞尔需要什么?四个中心点,三个半径;然后你将写出连接中心的线性方程,然后你可以通过按比例分割向量来计算这些直线上的四个切点;如果你有所有这些,构建贝塞尔曲线只是小菜一碟,你甚至不需要贝塞尔曲线的控制点,因为你只需要绘制4条有起始角和终止角的规则圆弧。初等几何。你的随机猜测会让这部作品疯狂。