如何在Objective C中形成CGPoint数组

时间:2009-06-03 10:04:57

标签: objective-c

我想得到这个结构

CGPoint addLines1[] =
{
    CGPointMake(30.0, 150.0),
    CGPointMake(41.67, 145.19),
    CGPointMake(53.33, 103.25),
    CGPointMake(65.0, 131.67),
    CGPointMake(76.67, 106.11),
    CGPointMake(88.33, 110.20),
    CGPointMake(100.0, 111.54),
    CGPointMake(111.67, 112.13),
    CGPointMake(123.33, 115.66),
    CGPointMake(135.0, 123.7),
    CGPointMake(146.67, 125.53),
    CGPointMake(158.33, 115.1),
    CGPointMake(170.0, 69.38),
    CGPointMake(181.67, 112.47),
    CGPointMake(193.33, 65.1),
    CGPointMake(205.0, 103.33),
    CGPointMake(216.67, 92.6),
    CGPointMake(228.33, 54.76),
    CGPointMake(240.0, 79.66),
    CGPointMake(251.67, 53.81),
    CGPointMake(263.33, 56.81),
    CGPointMake(275.0, 88.19),
    CGPointMake(286.67, 74.81),
    CGPointMake(298.33, 28.1),
    CGPointMake(310, 20.0),
};

为了进行一些计算和绘制数据。

我有CGPoint *lines = appDelegate.averageResponseTimePoints;

如何从addLines[]制作数组*lines

5 个答案:

答案 0 :(得分:51)

对于iOS:

创建数组:

NSArray *myCGPointArray = @[[NSValue valueWithCGPoint:CGPointMake(30.0, 150.0)],[NSValue valueWithCGPoint:CGPointMake(41.67, 145.19)]];

获取第一个CGPoint对象:

CGPoint myPoint = [myCGPointArray[0] CGPointValue];

答案 1 :(得分:50)

C数组在运行时并不是真正的数组,它们只是指向相同类型的连续对象块的指针。当你看到items[n]时,这只是*(items+n)的语法糖。

在您的示例中,addLines[1]*(lines+1)addLines[0]*(lines+0),即*lines。因此,addLines只是lines而没有指针解除引用。 *lines是数组中的第一项,lines是整个数组。

在编译时,数组与指针有一些差异。例如,sizeof(addLines)将为您提供整个数组的大小。

一旦将数组传递给大小可能变化的数组,Array-ness就会丢失,但您仍然可以使用下标运算符。例如:

#include <Foundation/Foundation.h>

#define showsize( expr ) ( printf(#expr " = %zd\n", ( expr ) ) )

CGPoint *
pass_back(CGPoint points[4])
{
    showsize(sizeof(points));
    return points;
}

int
main(void)
{
    CGPoint square[] = {CGPointMake(-1.0,  1.0),
                        CGPointMake( 1.0,  1.0),
                        CGPointMake( 1.0, -1.0),
                        CGPointMake(-1.0, -1.0)};
    CGPoint* returned;
    int i;

    showsize(sizeof(CGPoint));
    showsize(sizeof(CGPoint*));
    showsize(sizeof(square));
    returned = pass_back(square);
    showsize(sizeof(returned));

    for (i = 0; i < 4; ++i) {
        printf("returned[%d] = {%0.1f, %0.1f}\n", i, (float) returned[i].x,
                                                 (float) returned[i].y);
    }

    return 0;
}

这会在我的Mac上输出以下内容:

sizeof(CGPoint) = 8
sizeof(CGPoint*) = 4
sizeof(square) = 32
sizeof(points) = 4
sizeof(returned) = 4
returned[0] = {-1.0, 1.0}
returned[1] = {1.0, 1.0}
returned[2] = {1.0, -1.0}
returned[3] = {-1.0, -1.0}

在这里,square是四个CGPoint的大小,但是一旦发送到pass_back函数,它只是一个指针的大小,因为它就是它。当指针返回(并命名为returned)时,它仍然可以像数组一样使用。

注意循环中的幻数4。指针不知道它指向的数组的长度。

无法使用=运算符重新分配数组。如果您真的必须使用addLines中的点填充lines,则可以使用以下内容填充{

}

memcpy(addLines, lines, sizeof(CGPoint) * numberOfPoints);

你必须从某个地方获得numberOfPointsaddLines必须足够大才能处理这些点。如果点的数量是常数,那就没关系,但如果点的数量在运行时可能会有所不同,那么它将 bad ,特别是如果这些点来自外部世界(想想任意代码执行)。

我要更改averageResponseTimePoints以返回NSArray而不是C样式数组。您需要将CGPoint封装在对象中 - 您自己的对象或NSValue

以下是您如何撰写averageResponseTimePoints

的示例
- (NSArray*) averageResponseTimePoints
{
    NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease];

    for (int i = 0; i < numberOfPoints; ++i) {
        NSValue* point = [NSValue value:points+i
                           withObjCType:@encode(CGPoint)];
        [result addObject:point];
    }

    return result;
}

如果您的代码使用CocoaTouch运行,您可以使用它来创建点值:

NSValue* point = [NSValue valueWithCGPoint:points[i]];

要从数组中获取CGPoint,您可以编写如下内容:

for (NSValue* value in result) {
    NSPoint pt;
    [value getValue:&pt];
    NSLog(@"%f %f", pt.x, pt.y);
}

或者使用CocoaTouch:

CGPoint pt = [value CGPointValue];

答案 2 :(得分:4)

试试这个

CGPoint A[10];
A[0] = CGPointMake(10.0, 10.0);
A[1] = CGPointMake(10.0, 12.0);
float x = A[1].y;
NSLog(@"%.0f", x);

有效。祝你好运。

答案 3 :(得分:3)

我尝试过Tibidabo的答案,但这对我没用。它说[myCGPointArray objectAtIndex:0]的类型为id,所以我无法在其上调用CGPointValue。 HM。

然而,这有效:

NSArray *points = [NSArray arrayWithObjects:
                   [NSValue valueWithCGPoint:CGPointMake(5.5, 6.6)],
                   [NSValue valueWithCGPoint:CGPointMake(7.7, 8.8)],
                   nil];

NSValue *val = [points objectAtIndex:0];
CGPoint point = [val CGPointValue];
float X = point.x;
NSLog(@"cgpoint value is: %f", X);

NSArray *points = [NSArray arrayWithObjects:
                        [NSValue valueWithCGPoint:CGPointMake(20, 6.6)],
                        [NSValue valueWithCGPoint:CGPointMake(7.7, 8.8)],
                        nil];
float xCoordinate = [[points objectAtIndex:0] CGPointValue].x;

我在这里找到了它:How can I add CGPoint objects to an NSArray the easy way?,由Jarret Hardie发布。

答案 4 :(得分:2)

我解决了下一个问题:


NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:[NSValue valueWithCGPoint:myPoint]];

感谢michael-jensensolution