Программно предоставить аргумент cgpointmake или cgpoint для создания контрольных точек из пары координат - PullRequest
1 голос
/ 12 июля 2020

Пожалуйста, простите этот наивный вопрос, но есть ли какой-либо прямой способ создать контрольные точки из пары координат без отдельного извлечения значений x и y.

Я знаю, что вы можете:

CGPoint point = CGPointMake(2, 3);

или

float x = 2;
float y = 3;

CGPoint p  = CGPointMake(x,y);

Есть ли способ создать точку непосредственно из (2,3) без извлечения каждого x и y отдельно?

Я спрашиваю, почему Мне нужно создать много CGPoints из массива координат, которые выглядят как [(2,3),(4,5),(6,7)] et c.

Заранее спасибо за любые предложения.

Ответы [ 4 ]

3 голосов
/ 12 июля 2020

Используйте map и CGPoint init с параметрами x и y.

let coordinates = [(2,3),(4,5),(6,7)]
let points = coordinates.map { CGPoint(x: $0, y: $1) }
print("\(type(of: points)): \(points)") // You'll get an `[CGPoint]` although they print as normal [(x, y)] tuples array.
0 голосов
/ 12 июля 2020

Swift может определить правильный инициализатор, если вы сопоставите массив кортежей одного и того же типа с доступным инициализатором результирующего типа:

let points = [(2,3),(4,5),(6,7)].map(CGPoint.init)
0 голосов
/ 12 июля 2020

Ну, если у тебя чутье на драматизм c, может быть что-то вроде этого

        // 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 );
        }
0 голосов
/ 12 июля 2020

Решение для цели 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 }
};
...