以编程方式向 cgpointmake 或 cgpoint 提供参数以从坐标对创建 cgpoints
Programmatically supply argument to cgpointmake or cgpoint to create cgpoints from coordinate pair
请原谅这个幼稚的问题,但是有没有直接的方法从坐标对创建 cgpoints 而无需单独提取 x 和 y 值。
我知道你能做到:
CGPoint point = CGPointMake(2, 3);
或
float x = 2;
float y = 3;
CGPoint p = CGPointMake(x,y);
有没有办法直接从 (2,3) 创建一个点,而不用分别提取每个 x 和 y?
我问的原因是我必须从看起来像 [(2,3),(4,5),(6,7)]
等的坐标数组创建很多 CGPoints
提前感谢您的任何建议。
使用 map
和 CGPoint
初始化以及 x
和 y
参数。
let coordinates = [(2,3),(4,5),(6,7)]
let points = coordinates.map { CGPoint(x: [=10=], y: ) }
print("\(type(of: points)): \(points)") // You'll get an `[CGPoint]` although they print as normal [(x, y)] tuples array.
Objective C 的解决方案可能如下所示:
CGFloat pointValues[] = {
2, 3,
4, 5,
6, 7
};
for(int i = 0; i < sizeof(pointValues) / sizeof(CGFloat); i += 2) {
CGPoint p = CGPointMake(pointValues[i], pointValues[i + 1]);
// Do something with 'p'...
}
pointValues
数组是每个点的 x 和 y 值的一维数组。
或者,如果你可以使用 Objective C++,你可以简单地这样做:
CGPoint points[] {
{ 2, 3 },
{ 4, 5 },
{ 6, 7 }
};
好吧,如果你有戏剧天赋,也许是这样的
// One big array
float * p1 = ( float [] ){ 1, 2, 3, 4, 5, 6, 7, 8 };
float * end1 = p1 + 8;
while ( p1 < end1 )
{
CGPoint point = CGPointMake ( * p1, * ( p1 + 1 ) );
p1 += 2;
NSLog ( @"Point ( %f, %f )", point.x, point.y );
}
// Array of 2D tuples
// Not much difference though, maybe easier on the eyes?
float * p2 = ( float * )( float [][ 2 ] ){ { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
float * end2 = p2 + 8;
while ( p2 < end2 )
{
CGPoint point = CGPointMake( * p2, * ( p2 + 1 ) );
p2 += 2;
NSLog ( @"Point ( %f, %f )", point.x, point.y );
}
Swift 可以推断出正确的初始化器,如果你映射一个元组数组,这些元组的类型与结果类型的可用初始化器相同:
let points = [(2,3),(4,5),(6,7)].map(CGPoint.init)
请原谅这个幼稚的问题,但是有没有直接的方法从坐标对创建 cgpoints 而无需单独提取 x 和 y 值。
我知道你能做到:
CGPoint point = CGPointMake(2, 3);
或
float x = 2;
float y = 3;
CGPoint p = CGPointMake(x,y);
有没有办法直接从 (2,3) 创建一个点,而不用分别提取每个 x 和 y?
我问的原因是我必须从看起来像 [(2,3),(4,5),(6,7)]
等的坐标数组创建很多 CGPoints
提前感谢您的任何建议。
使用 map
和 CGPoint
初始化以及 x
和 y
参数。
let coordinates = [(2,3),(4,5),(6,7)]
let points = coordinates.map { CGPoint(x: [=10=], y: ) }
print("\(type(of: points)): \(points)") // You'll get an `[CGPoint]` although they print as normal [(x, y)] tuples array.
Objective C 的解决方案可能如下所示:
CGFloat pointValues[] = {
2, 3,
4, 5,
6, 7
};
for(int i = 0; i < sizeof(pointValues) / sizeof(CGFloat); i += 2) {
CGPoint p = CGPointMake(pointValues[i], pointValues[i + 1]);
// Do something with 'p'...
}
pointValues
数组是每个点的 x 和 y 值的一维数组。
或者,如果你可以使用 Objective C++,你可以简单地这样做:
CGPoint points[] {
{ 2, 3 },
{ 4, 5 },
{ 6, 7 }
};
好吧,如果你有戏剧天赋,也许是这样的
// One big array
float * p1 = ( float [] ){ 1, 2, 3, 4, 5, 6, 7, 8 };
float * end1 = p1 + 8;
while ( p1 < end1 )
{
CGPoint point = CGPointMake ( * p1, * ( p1 + 1 ) );
p1 += 2;
NSLog ( @"Point ( %f, %f )", point.x, point.y );
}
// Array of 2D tuples
// Not much difference though, maybe easier on the eyes?
float * p2 = ( float * )( float [][ 2 ] ){ { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
float * end2 = p2 + 8;
while ( p2 < end2 )
{
CGPoint point = CGPointMake( * p2, * ( p2 + 1 ) );
p2 += 2;
NSLog ( @"Point ( %f, %f )", point.x, point.y );
}
Swift 可以推断出正确的初始化器,如果你映射一个元组数组,这些元组的类型与结果类型的可用初始化器相同:
let points = [(2,3),(4,5),(6,7)].map(CGPoint.init)