などという事をやっていたので。
例えば「この範囲から外に出たらgpsなどで調べて警告したい」とか合った場合のことなんですが。
範囲の点を複数書きます。ぽちぽちぽちぽちぽち。と。4画でもスタートとエンドも指定するので5点ね。んで、それを指定したら
-(bool)InsidePolygonLat:(float)lati Long:(float)longi {
int i;
double angle=0;
NSArray* polygonLati = [NSArray arrayWithObjects:@"1点目",@"2点目",@"3点目",@"4点目",@"5点目(終端は始点と同じ)", nil];
NSArray* polygonLongi = [NSArray arrayWithObjects:@"1点目",@"2点目",@"3点目",@"4点目",@"5点目(終端は始点と同じ)", nil];
float p1h,p1v,p2h,p2v;
for (i=0;i<[polygonLati count];i++) {
p1h = [[polygonLati objectAtIndex:i] floatValue] - lati;
p1v = [[polygonLongi objectAtIndex:i] floatValue] - longi;
p2h = [[polygonLati objectAtIndex:(i+1)%20] floatValue] - lati;
p2v = [[polygonLongi objectAtIndex:(i+1)%20] floatValue] - longi;
angle += [self angle2Dx1:p1h y1:p1v x2:p2h y2:p2v];
}
if (ABS(angle) < 3.141592)
return(FALSE);
else return(TRUE);
}
- (float)angle2Dx1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 {
double dtheta,theta1,theta2;
theta1 = atan2(y1,x1);
theta2 = atan2(y2,x2);
dtheta = theta2 - theta1;
while (dtheta > 3.141592)
dtheta -= 3.141592 * 2;
while (dtheta < -3.141592)
dtheta += 3.141592 * 2;
return(dtheta);
}
こんな事をして、今居るpointを [self InsidePolygonLat:lat Long:longt]; なんかでcheckすると 1か0が返ってきますので、それでcheck出来ます。
中に居れば1。外に出れば0ね。
他にも良い方法ありそうだけど、まぁとりあえずw