Конвертировать NSString в 4 на 4 матрицы с плавающей запятой - PullRequest
1 голос
/ 20 января 2012

Мне было интересно, есть ли удобный метод или что-то, например, для замены строки NSSt на массив с плавающей точкой.

У меня есть строка, которая выглядит так:

{{-0.528196, -0.567599, -0.631538, 0}, {0.0786662, -0.773265, 0.629184, 0}, {-0.845471, 0.282651, 0.453086, 0}, {0, 0, 0, 1}}

Что я получил по методу:

NSStringFromGLKMatrix4()

И я хочу сделать это:

float test[4][4] = {{-0.528196, -0.567599, -0.631538, 0}, {0.0786662, -0.773265, 0.629184, 0}, {-0.845471, 0.282651, 0.453086, 0}, {0, 0, 0, 1}};

return GLKMatrix4MakeWithArray(*test);

Любая помощь будет оценена, спасибо.

Ответы [ 4 ]

1 голос
/ 20 января 2012

Это немного уродливо, но должно работать:

// your string data
NSString* s = @"{{-0.528196, -0.567599, -0.631538, 0}, {0.0786662, -0.773265, 0.629184, 0}, {-0.845471, 0.282651, 0.453086, 0}, {0, 0, 0, 1}}";

// remove uneccessary characters from string.. 
s = [s stringByReplacingOccurrencesOfString:@"{" withString:@""];
s = [s stringByReplacingOccurrencesOfString:@"}" withString:@""];
s = [s stringByReplacingOccurrencesOfString:@" " withString:@""];

// build an NSArray with string components and convert them to an array of floats
NSArray* array = [s componentsSeparatedByString:@","];
float data[16];
for(int i = 0; i < 16; ++i){
    data[i] = [[array objectAtIndex:i] floatValue];
}

GLKMatrix4 matrix = GLKMatrix4MakeWithArray(data);

Если вы ориентируетесь на iOS 4.0 или выше, вы также можете использовать NSRegularExpression, чтобы получить числа из строки.

1 голос
/ 20 января 2012

Очевидно, что хороший старый Ansi C ... sscanf ... давно потерян и забыт.

sscanf(...,"{{%f,%f,%f,%f}, ...",...);

Вы можете проверить мой код sscanf в записи hexString какДобавлен пример.

0 голосов
/ 11 сентября 2014

Используйте NSValue, которая является лучшей альтернативой, предоставляемой Apple для преобразования между структурами типа C и объектами Objective-C.

кодирование

GLKMatrix4 encMatrix = /* your matrix */;
NSValue *encMatrixValue = [NSValue value:&encMatrix withObjCType:@encode(GLKMatrix4)];

декодирование

GLKMatrix4 decMatrix;
[encMatrixValue getValue:&decMatrix];

Это намного чище и стабильнее, чем преобразование GLKMatrix в NSString и обратно в GLKMatrix.

0 голосов
/ 20 января 2012

Получите значения в массиве, используя componentsSeparatedByString: метод NSString, а затем используйте GLKMatrix4MakeWithArray метод.

...