3

'すべて。私はiPhoneプログラミングの自称の初心者です(はるかに長いperlとWebのバックグラウンドを持っています-30年)...しかし先週思い切って2冊の良い本を購入しました。1000ページをはるかに超えて詰め込んで読んだ後、そしてそれをかなりよく理解した後、私は良い最初のネイティブiPhoneアプリに向かって順調に進んでいます。私の問題はこれです:Objective-Cで単純な地理(緯度/経度)ポイントインポリゴンルーチンを実行する方法がわかりません。これを行うには2つの方法があります。1つはC(最初のコード例)で、もう1つはJavaScript(2番目のコード例)です。

// 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;
}

(私がそれらを変換することができれば、どちらかが機能します)

それで、これを試すために...私はiPhoneプロジェクトで.hファイルと.cファイルをxcodeに入れました。今の唯一の質問は、Objective-Cからこれを呼び出して結果を取得する方法です。:)

ところで:私は昨夜グーグルでグレートゴッドを検索して答えを得ましたが、「Objective-C iPhoneアプリにCを含める」などを検索してみてください。非常に多くのエントリがあり、これとは関係ありません。 !!:)ここに投稿する前に私がグーグルを試したことをあなたに知らせてください。

さて、私の問題:

  1. Objective-Cからpnpolyを呼び出すにはどうすればよいですか?
  2. どのタイプを使用して呼んでいますか?(intは問題ありませんが、float * vertxは明らかにfloatの配列です。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ではintやfloatなどのCプリミティブ型も問題なく使用できます。したがって、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コードです(ただし、CocoaBOOLおよびNSPointCタイプを使用します)。Objective-CはCの厳密なスーパーセットであるため、有効なCコードはすべて有効なObjective-Cでもあります。これは、Objective-Cの独自の機能が特に役に立たない場合でもあります。(一般に、数値計算はそれほど複雑ではなく、プレーンCの方が読みやすくなっています。)

于 2010-02-03T21:26:22.270 に答える
1

Objective CはCのスーパーセットであるため、Cルーチンを呼び出すことができます。そのルーチンを頻繁に呼び出す場合は、インライン化するか、マクロにします。

于 2010-02-03T20:59:49.523 に答える