Как мне получить доступ к массиву CGPoints, чтобы нарисовать график? - PullRequest
0 голосов
/ 06 апреля 2010

У меня есть код, в котором я хочу разработать график. Код:

NSArray *coordinate = [[NSArray alloc] initWithObjects: @"42,213", @"75,173", @"108,153", @"141,133", @"174,113", @"207,73", @"240,33", nil];
CGContextSetRGBFillColor(ctx, 255, 0, 0, 1.0);
CGContextSetLineWidth(ctx, 8.0);
for(int intIndex = 0; intIndex < [coordinate count]; fltX1+=33, intIndex++)
{
    CGContextMoveToPoint(ctx, fltX1+37, fltY2+18);
    CGPoint point = [[coordinate objectAtIndex:intIndex] CGPointValue];
    CGContextAddLineToPoint(ctx, point);
    CGContextStrokePath(ctx);
}

Приведенный выше код переходит к отладчику в строке CGPoint point = [[координатный объектAtIndex: intIndex] CGPointValue]. Как я рисую линию на графике, используя приведенный выше код ????????

Теперь я изменяю приведенный выше код как поток,

Привет, прославленный хакер, я уже угадал предложение выше. Но теперь я изменил свой код, как,

    CGContextSetRGBFillColor(ctx, 255, 0, 0, 1.0);
CGContextSetLineWidth(ctx, 8.0);
NSArray *coordinate1 = [[NSArray alloc] initWithObjects:@"42",@"75",@"108",@"141",@"174",@"207",@"240",nil];
NSLog(@"The points of coordinate1: %@", coordinate1);
NSArray *coordinate2 = [[NSArray alloc] initWithObjects:@"213",@"173",@"153",@"133",@"113",@"73",@"33",nil];
for(int intIndex = 0; intIndex < [coordinate1 count], intIndex < [coordinate2 count]; fltX1+=33, intIndex++)
{
    CGContextMoveToPoint(ctx, fltX1+37, fltY2+18);
    NSString *arrayDataForCoordinate1 = [coordinate1 objectAtIndex:intIndex];
    NSString *arrayDataForCoordinate2 = [coordinate2 objectAtIndex:intIndex];
    CGContextAddLineToPoint(ctx, (float *)arrayDataForCoordinate1, (float *)arrayDataForCoordinate2);
    //NSLog(@"CGPoints of drawing the bar: %@", point);
}
CGContextClosePath(ctx);    
CGContextStrokePath(ctx)

Но это все равно дало мне ошибку в той же строке.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2010

В вашем графическом контексте, скорее всего, нет пути для добавления строк на данный момент. Попробуйте заключить цикл for в соответствующие вызовы функций «begin path» и «close path».

CGContextBeginPath(ctx);
for(int intIndex = 0; intIndex < [coordinate count]; fltX1 += 33, intIndex++) {
    CGContextMoveToPoint(ctx, fltX1+37, fltY2+18);
    CGPoint point = [[coordinate objectAtIndex:intIndex] CGPointValue];
    CGContextAddLineToPoint(ctx, point.x, point.y);
}
CGContextClosePath(ctx);
CGContextStrokePath(ctx);

Также обратите внимание, что я перемещал вызов «путь хода» за пределы цикла for, пока вы не закрыли путь.

1 голос
/ 14 апреля 2010

Вместо того, чтобы типизировать (NSString *) в (float *), попробуйте [myString doubleValue]. Если у вас есть строки вида "{x, y}", вы можете использовать CGPointFromString для преобразования непосредственно в точку. Если можете, избегайте строк и сохраняйте исходные данные в виде числовых типов. Если вы должны использовать NSArray, это могут быть пары NSNumber или NSValue CGPoint.

0 голосов
/ 08 апреля 2010

Приведенный выше код переходит к отладчику в строке CGPoint point = [[координировать objectAtIndex: intIndex] CGPointValue].

Поскольку строки NSS не отвечают на сообщения CGPointValue. Вы можете убедиться в этом сами, посмотрев документацию NSString (или консоль отладчика, которая будет содержать сообщение об исключении, сообщающее вам об этом).

Как рисовать линию на графике, используя приведенный выше код ????????

Выполните синтаксический анализ строк с помощью NSScanner, либо используйте функцию NSPointFromString , либо используйте массив C (не NSArray) из NSPoints / CGPoints.

На несвязанной ноте:

for(int intIndex = 0; intIndex < [coordinate count]; fltX1+=33, intIndex++)
{
    CGContextMoveToPoint(ctx, fltX1+37, fltY2+18);

Не просто добавляйте случайные числовые литералы в ваш код. Вы не будете знать, что означают эти числа через шесть месяцев, и если вы когда-нибудь захотите изменить, скажем, горизонтальное смещение графика, вам придется заменить число 37 повсюду в вашем приложении (кроме случаев, когда оно не является горизонтальным смещением графика), не говоря уже о числах 37 плюс некоторое другое смещение.

Вместо этого присвойте этим номерам имена примерно так:

enum {
    MyDistanceBetweenPoints = 33,
    MyGraphOffsetX = 37,
    MyGraphOffsetY = 18,
};

Таким образом, если вы хотите изменить горизонтальное смещение графика, вам не нужно искать каждый последний соответствующий числовой литерал; вам нужно только изменить определение MyGraphOffsetX.

Вы также можете использовать текущую матрицу преобразования для смещения графика, тем самым исключая добавления из каждого вызова CGContextMoveToPoint и исключая риск того, что вы забудете добавление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...