Question

'lo tout. Je suis un noob admis décrit lui-même dans la programmation iPhone (ayant un perl beaucoup plus et fond web - 30 ans) ... mais a pris le plongeon la semaine dernière et acheté quelques bons livres. Après la lecture de bachotage et plus de 1000 pages - et comprendre assez bien, je suis bien sur mon chemin à une bonne première application iPhone native. Mon problème est le suivant: Je ne sais pas comment faire simple géographique (latitude / longitude) de routine point dans un polygone en Objective-C. J'ai 2 façons de le faire. On en C (le premier exemple de code) et un en JavaScript (le second exemple de code):

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

ou ce (en 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;
}

(soit on va travailler si je pouvais les obtenir convertis)

Alors, pour essayer ... Je mets le fichier .h et .c dans Xcode avec mon projet iPhone. La seule question est maintenant comment appeler cela de Objective-C et obtenir le résultat ..:)

BTW: Je cherchai le Grand Dieu Google toute la nuit dernière pour obtenir la réponse à cela, mais juste essayer de chercher «y compris dans un C Objective-C iPhone app », etc .. vous obtenez tant d'entrées et ne doivent faire avec cela! :) Juste vous laisser savoir que j'ai essayé google avant de poster ici.

D'accord, mes questions:

  1. Comment appeler l'pnpoly de Objective-C?
  2. Quels types dois-je appeler à l'aide? (Int est très bien, mais le flotteur * VertX est évidemment un tableau de floats..which NSArray ne pas - que je peux trouver)

(EDIT:. VOICI PLUS D'INFO JE SUIS DEMANDER DE L'AIDE contructing LES ENSEMBLES QUI REPERCUTEES AINSI)

La question n'a pas été posée pleinement.

La routine (en c objectif) serait comme ceci: (partant du principe est codé à droite)

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);

Je l'ai dit clairement que je suis l'apprentissage Objective-c, mais a constaté que la routine C -. N'a donc pas été sûr de savoir comment construire soit les variables C pour l'appeler avec ou la routine d'appeler avec

Je sais que cela demande beaucoup ... mais il est vraiment déroutante pour moi. Quelqu'un peut-il m'aider? Merci beaucoup.

Jann

Était-ce utile?

La solution

Voici en exemple de la façon dont il serait utilisé:

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);

Notez qu'il n'y a rien de particulier à Objective-C ici. Ce code est C (bien qu'il n'utilise le cacao BOOL et types NSPoint C). Étant donné que Objective-C est un surensemble stricte de C, tout code valide C est également valable Objective-C. Ceci est également un cas où des caractéristiques uniques de Objective-C ne serait pas particulièrement utile. (Les calculs numériques sont en général moins complexes et plus lisible en C ordinaire.)

Autres conseils

Vous pouvez simplement l'appeler. Objective-C est juste une extrémité avant à une API C et un moyen de méthodes de réécriture comme des fonctions (dans une certaine approximation, de toute façon ...) afin que vous puissiez appeler une fonction C comme vous le feriez dans le code C.

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

Vous pouvez utiliser C types primitifs comme int et flotter dans Objective-C sans problème, aussi. Alors, appelez la fonction avec flotteurs :). Si vous avez besoin de stocker ces valeurs dans les classes de collection de la Fondation comme NSArray, vous pouvez les envelopper dans une classe appelée NSNumber.

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

C est une surcouche de C, de sorte que vous pouvez appeler des routines C. Si vous appelez cette routine beaucoup, en ligne ou en faire une macro.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top