当前位置:  开发笔记 > IOS > 正文

如何在Objective C中形成CGPoint数组

如何解决《如何在ObjectiveC中形成CGPoint数组》经验,为你挑选了2个好方法。

我想得到这个结构

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



1> Tibidabo..:

对于iOS:

创建数组:

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

获取第一个CGPoint对象:

CGPoint myPoint = [myCGPointArray[0] CGPointValue];



2> Will Harris..:

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

在你的例子addLines[1]中将是*(lines+1),addLines[0]将来*(lines+0),是*lines.所以,addLines就是lines没有指针取消引用.*lines是数组中的第一个项目,lines是整个数组.

数组在编译时与指针有一些差异.例如,sizeof(addLines)会给你整个数组的大小.

一旦将数组传递到可能变量大小的某个位置,Array-ness就会丢失,但您仍然可以使用下标运算符.例如:

#include 

#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是四个CGPoints 的大小,但是一旦发送到pass_back函数,它只是一个指针的大小,因为它就是它.当指针返回(并命名returned)时,它仍然可以像数组一样使用.

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

无法与=运算符重新分配数组.如果你真的必须填充addLineslines,你可以使用以下内容:

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

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

我会averageResponseTimePoints改为返回NSArray而不是C风格的数组.您需要将CGPoints 封装在对象中 - 您自己的对象或NSValues.

以下是您可以编写的示例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数组中获取s,您可以编写如下内容:

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

或者使用CocoaTouch:

CGPoint pt = [value CGPointValue];

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有