在Objective-C(iPhone开发)中使用一个C函数

3

'大家好。我承认自己是一名 iPhone 编程的新手(拥有 30 年的 Perl 和 Web 背景)...但上周我决定跳进这个领域,并购买了几本好书。经过阅读超过 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变量或调用它的例程。

我知道这很困惑...但有人能帮帮我吗? 非常感谢。

Jann


1
Objective-C是建立在普通C语言之上的一种编程语言。因此,在Objective-C代码中,您可以直接使用int i = pnpoly(...);或者[NSNumber numberWithInt:(pnpoly(...))](只要类型匹配)。 - ExitToShell
3个回答

7

您可以直接调用它。Objective-C只是C API的前端,并将方法重写为函数(在某种程度上),因此您可以像在C代码中一样调用C函数。

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

你可以在Objective-C中使用C语言的基本类型,如int和float,没有问题。因此,可以使用浮点数调用该函数 :)。如果需要将这些值存储在Foundation集合类(如NSArray)中,则可以将它们包装在一个名为NSNumber的类中。

NSNumber *someFloat = [NSNumber numberWithFloat: f];
float usefulValue = [someFloat floatValue];

你需要将这些值提取到一个C数组中,以便在C中使用。 - Georg Schölly

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语言中更简单易读。)

我们需要在你的Objective-C类中#include "poly.h",对吗? - Satyam

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接