如何细分UIBezierPath并将其存储在两个不同的对象中 [英] How to subdivide UIBezierPath and store it in two different objects

查看:80
本文介绍了如何细分UIBezierPath并将其存储在两个不同的对象中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在应用程序中有UIBezierPath.当手指触摸到路径时,我想细分该曲线并将这两个曲线存储到两个不同的对象中.因此,触摸坐标将作为一条曲线的终点,而作为第二条曲线的起点.

I have UIBezierPath in the application. When the finger touch on the path is recognized i want to subdivide that curve and store that two curves into two different objects. So touch co-ordinates will work as end-point for one curve and start-point for second curve.

如果我再触摸任何一条曲线,该曲线将细分为另外两条曲线,依此类推.

Again if i touch on any of this curve, that curve will subdivide into two other curves and so on.

我搜索了很多.但是找不到任何好的解决方案.

I searched for this a lot. But could not find any good solution.

我也不知道是否还有其他方法可以做到这一点.任何帮助将不胜感激. 谢谢

Also I do not have idea if there is any other way to do this. Any help would be greatly appreciated. Thanks

推荐答案

您可以使用 de Casteljau 算法执行此操作.如果您真的很喜欢它的数学方法,请在此处查看Wikipedia页面,但是如果您并不是数学上的困惑者,但实际上却很简单,它会让您比其他任何事情都感到困惑……

You can do this with the de Casteljau algorithm. If you're really into the maths of it check out the Wikipedia page here, but if you're not that into the maths it will probably confuse you more than anything when it's actually quite simple...

  1. 沿着触摸曲线(在0.0到1.0之间)计算参数化的值.为此,您可以按固定的时间间隔(0.1、0.2、0.3等)计算一组点,然后找到与您的触摸点最接近的两个点,如果需要更高的精度(0.21、0.22, 0.23等).沿曲线段将产生一个介于0.0到1.0之间的数字,代表您触摸的位置.
  2. 这一点很难用文字解释,但是位于标题细分贝塞尔曲线下大约一半.使用图表下方的滑块查看其工作原理,这是我的文字解释:您需要按照与在步骤1中计算出的参数化值成比例的方式细分曲线段控制点之间的直线.有四个点(A,B,C,D),加上曲线上最靠近您的触摸点的分割点,该分割点沿着曲线位于0.4处,我们将其称为S点:
    • 计算沿B→ C线的临时点T,该点为0.4
    • 让点A1等于点A
    • 计算沿线A→ B的点B1为0.4
    • 计算沿线B1→ T的点C1为0.4
    • 让点D1等于分割点S
    • 让D2点等于D点
    • 计算沿C→ D线的点C2为0.4
    • 计算沿T→ C2线的0.4点B2
    • 让点A2等于分割点S
  1. Calculate the parameterized value along the curve (between 0.0 and 1.0) of the touch. To do this you can calculate a set of points at regular intervals (0.1, 0.2, 0.3 etc.) and then find the two closest points to your touch points and repeat the parameterization between these points if you want more accuracy (0.21, 0.22, 0.23, etc.). This will result in a number between 0.0 and 1.0 along the curve segment representing where you touched.
  2. This bit is difficult to explain in text, but there's a good visualization on this page about half-way down under the heading Subdividing a Bezier curve. Use the slider under the diagram to see how it works, here's my textual explanation: You need to subdivide the straight lines between the control points of your curve segment proportional to the parameterized value you calculated in step 1. So if you calculated 0.4, you have four points (A, B, C, D) plus the split-point on the curve closest to your touch at 0.4 along the curve, we'll call this split-point point S:
    • Calculate a temporary point T which is 0.4 along the line B→C
    • Let point A1 be equal to point A
    • Calculate point B1 which is 0.4 along the line A→B
    • Calculate point C1 which is 0.4 along the line B1→T
    • Let point D1 be equal to the split point S
    • Let point D2 be equal to point D
    • Calculate point C2 which is 0.4 along the line C→D
    • Calculate point B2 which is 0.4 along the line T→C2
    • Let point A2 be equal to the split point S

现在您有两条新的Bezier曲线,第一条使用控制点A1,B1,C1,D1,第二条使用A2,B2,C2,D2.

Now you have two new Bezier curves, the first using control points A1, B1, C1, D1 and the second using A2, B2, C2, D2.

这篇关于如何细分UIBezierPath并将其存储在两个不同的对象中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆