一个围绕 CGGeometry 类型(CGPoint
、CGSize
、CGRect
和 CGVector
)的扩展和函数集合。它还包括一些用于 FloatingPoint
和 Comparable
类型的函数。
clamp
是一个接受三个参数的函数:value
(值)、min
(最小值)和 max
(最大值)。如果 value <= min
,它将返回 min
;如果 value >= max
,它将返回 max
;在任何其他情况下,它将返回 value
。
lerp
是线性插值函数。给定两个值 start
(开始)和 end
(结束),以及一个 progress
(进度,通常在 [0, 1]
范围内),它将执行 start
和 end
之间的线性插值,并返回该值。
您可以在 此处阅读更多关于线性插值的信息,但它的基本要点是,当 progress
为 0
时,它将返回 start
;当 progress 为 1
时,它将返回 end
;对于 [0, 1]
中的任何值,它将返回 end
和 start
之间差异的百分比。 例如,lerp(start: 5, end: 15, progress: 0.5)
将返回 10
,正好在 5
和 15
之间,因为 progress 为 0.5
。
此方法可以采用 [0, 1]
范围之外的 progress
值,这在某些情况下可能很有用,例如在制作弹性动画时,但是您可以通过在调用该函数之前对进度使用 clamp()
来防止这种情况。
inverseLerp
与 lerp
相反。 给定三个值:start
(开始)、end
(结束)和一个 value
(值,通常在 [start, end]
范围内),它将返回一个 progress
(进度)值,这样在 lerp
中使用它与相同的 start
和 end
值时,它将返回 value
。 例如,lerp(start: 5, end: 15, value: 10)
将返回 0.5
,因为 10
正好在 5
和 15
之间。
remap
接受两个范围,并将该值从一个范围转换为另一个范围。 例如,如果您在 [20, 40]
范围内有一些值,并且您希望它们在 [50, 100]
范围内,您将调用 value.remap(from: (20, 40), to: (50, 100))
。 20
将变为 50
,40
将变为 100
,30
将变为 75
。
四种 CGGeometry
类型:CGPoint
、CGSize
、CGRect
和 CGVector
符合 DoubleListRepresentable
协议。 这意味着它们可以被初始化并转换为双精度列表。 对于 CGRect
,此列表恰好为四个元素长;在所有其他情况下,该列表应恰好有两个元素。
DoubleListRepresentable
添加了 magnitude
变量以及 normalize
和 lerp
方法,这些方法应该是不言自明的。 它还添加了四个基本算术函数:+
、-
、*
和 /
。 对于乘法和除法,这是通过标量 (Double
) 完成的,该标量乘以或除以元素的每个组件。
除了 DoubleListRepresentable
提供的函数和变量之外,四种 CGGeometry
类型中的每一种都包含至少一个方便的初始化器,这应该很容易理解,并且 CGPoint
、CGSize
和 CGVector
包含将值从一种类型转换为其他两种类型中的任何一种类型的变量。