在Objective-C中使用C函数(适用于iPhone)

‘好吧。 我是一个自我描述的iPhone编程招执的人(拥有更长的perl和网络背景 – 30年)……但上周冒了一大笔钱买了几本好书。 在填写并阅读了超过1000页之后 – 并且非常了解它,我正在前往一个良好的第一个原生iPhone应用程序。 我的问题是:我不知道如何在Objective-C中做一个简单的Geographic(lat / long)多边形点例程。 我有两种方法可以做到这一点。 一个在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 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调用它并得到结果.. 🙂

顺便说一句:昨晚我搜索了大神Google以获得答案但只是尝试搜索“在Objective-C iPhone应用程序中包含C”等等。你得到了这么多条目,没有任何关系! :)只是让你知道我在发布之前试过谷歌。

好的,我的问题:

  1. 如何从Objective-C调用pnpoly?
  2. 我称之为什么类型? (int很好,但float * vertx显然是一个浮点数组…… NSArray没有 – 我能找到)

(编辑:这里是更多信息。我要求帮助解决那些将被传递的arrays)

没有完全问到这个问题。

例程(在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变量来调用它或者用例程来调用它。

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

Jann

以下是如何使用它的示例:

 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的独特function不会特别有用的情况。 (一般来说,数值计算在简单的C中不那么复杂和可读性。)

你可以打电话给它。 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]; 

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