3

'所有。我自称是 iPhone 编程中公认的菜鸟(拥有更长的 perl 和网络背景——30 年)……但上周冒险购买了几本好书。在死记硬背并阅读了 1000 多页之后——并且很好地理解了它,我正朝着一个好的第一个 Native iPhone 应用程序迈进。我的问题是:我不知道如何在 Objective-C 中做一个简单的地理(纬度/经度)多边形点例程。我有两种方法可以做到这一点。一个在 C 中(第一个代码示例)和一个在 JavaScript 中(第二个代码示例):

// this is the poly.h file

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy);


// this is the poly.c file

#include "poly.h"
int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy){
 int i, j, c = 0;
 for (i = 0, j = nvert-1; i < nvert; j = i++) {
 if ( ((verty[i]>testy) != (verty[j]>testy)) &&
  (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
    c = !c;
 }
 return c;
}

或者这个(在 Javascript 中):

function _isPointInPoly(poly, pt){
 for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
  ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))
  && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
  && (c = !c);
 return c;
}

(如果我能让它们转换,任何一个都可以)

所以,要试试这个……我把 .h 文件和 .c 文件和我的 iPhone 项目一起放到 xcode 中。现在唯一的问题是如何从 Objective-C 调用它并获得结果.. :)

顺便说一句:我昨晚整晚都在谷歌搜索大神来得到这个答案,但只是尝试搜索“在 Objective-C iPhone 应用程序中包含 C”等。你得到了这么多条目,但与此无关!:) 只是让你知道我在这里发帖之前尝试过谷歌。

好的,我的问题:

  1. 如何从 Objective-C 调用 pnpoly?
  2. 我用什么类型称呼它?(int 很好,但是 float *vertx 显然是一个浮点数组。NSArray 没有这个数组——我可以找到)

(编辑:这里有更多信息。我请求帮助构建也将通过的数组)

这个问题没有被完全问到。

例程(在objective-c中)将是这样的:(假设编码正确)

NSMutableArray *latitudeArray = [[NSMutableArray alloc] init];
NSMutableArray *longitudeArray = [[NSMutableArray alloc] init];

// coordinates surrounding 1 inifite loop.

[latitudeArray addObject:@"37.32812557141369"];
[longitudeArray addObject:@"-122.0320253896318"];
[latitudeArray addObject:@"37.32821852349916"];
[longitudeArray addObject:@"-122.0289014325174"];
[latitudeArray addObject:@"37.33021046381746"];
[longitudeArray addObject:@"-122.0289300638158"];
[latitudeArray addObject:@"37.33042111092124"];
[longitudeArray addObject:@"-122.0279574092159"];
[latitudeArray addObject:@"37.33395972491337"];
[longitudeArray addObject:@"-122.0279263955651"];
[latitudeArray addObject:@"37.33363270879559"];
[longitudeArray addObject:@"-122.0320527775551"];
[latitudeArray addObject:@"37.32812557141369"];
[longitudeArray addObject:@"-122.0320253896318"];


int nvert = [[latitudeArray count] intvalue];

// 37.33189399206268 x -122.0296274412866 should return true

float testx =37.33189399206268;
float testy =-122.0296274412866;

int y_or_n = pnpoly(int nvert, float *vertx, float *verty, float testx, float testy);

我应该明确表示我正在学习 Objective-c,但发现了 C 例程——所以不知道如何构造 C 变量来调用它或调用它的例程。

我知道这要求很多......但这对我来说真的很令人费解。谁能帮我?非常感谢。

4

3 回答 3

7

你可以打电话给它。Objective-C 只是 C API 的前端,也是一种将方法重写为函数的方式(无论如何,近似于......),因此您可以像在 C 代码中一样调用 C 函数。

- (int)doWhatever {
  // ...
  int hitTest = pnPoly(/*blah*/);
  return hitTest;
}

您也可以在 Objective-C 中使用 C 原始类型(如 int 和 float)而不会出现问题。所以用浮点数调用函数:)。如果您需要将这些值存储在像 NSArray 这样的 Foundation 集合类中,那么您可以将它们包装在一个名为 NSNumber 的类中。

NSNumber *someFloat = [NSNumber numberWithFloat: f];
float usefulValue = [someFloat floatValue];
于 2010-02-03T17:19:10.950 回答
3

这是如何使用它的示例:

int nCoords = 4;
float vertexXCoords[n] = {0.0, 0.0, 20.0, 20.0};
float vertexYCoords[n] = {0.0, 20.0, 20.0, 0.0};
NSPoint testPoint = NSMakePoint(5, 10);

BOOL testPointIsInPoly = pnpoly(nCoords, xCoords, yCoords, testPoint.x, testPoint.y);

请注意,这里没有特定于 Objective-C 的内容。这是 C 代码(尽管它确实使用了 Cocoa BOOL 和 NSPoint C 类型)。由于 Objective-C 是 C 的严格超集,任何有效的 C 代码也是有效的 Objective-C。这也是 Objective-C 的独特功能不会特别有用的情况。(一般的数值计算在普通 C 中不太复杂且更易读。)

于 2010-02-03T21:26:22.270 回答
1

目标 C 是 C 的超集,因此您可以调用 C 例程。如果您经常调用该例程,请将其内联或使其成为宏。

于 2010-02-03T20:59:49.523 回答