3

latlong( CLLocationCoordinate2D) が MKMapview に描画された MKPolygon 内にあるかどうかを検証しています。

以下のコードを使用して、MKMapview に MKPolygon を描画しています。

MKPolygon *polygon = [MKPolygon polygonWithCoordinates:coordinates count:count];
[mapviewcontroller.mapview addOverlay:polygon];

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    MKPolygonRenderer *renderer = [[MKPolygonRenderer alloc] initWithPolygon:overlay];
    renderer.fillColor   = [[UIColor grayColor] colorWithAlphaComponent:0.2];
    renderer.strokeColor = [[UIColor blackColor] colorWithAlphaComponent:0.7];
    renderer.lineWidth   = 2;
    return renderer;
}

MKPolygon 内の latlong を検証しています。

CLLocationCoordinate2D sampleLocation = CLLocationCoordinate2DMake(13,80);//13,80 is the latlong of clear colored area of the MKPolygon in the below image.
MKMapPoint mapPoint = MKMapPointForCoordinate(sampleLocation);
CGPoint mapPointAsCGP = CGPointMake(mapPoint.x, mapPoint.y);

for (id<MKOverlay> overlay in mapview.overlays) {
    if([overlay isKindOfClass:[MKPolygon class]]){
        MKPolygon *polygon = (MKPolygon*) overlay;

        CGMutablePathRef mpr = CGPathCreateMutable();

        MKMapPoint *polygonPoints = polygon.points;

        for (int p=0; p < polygon.pointCount; p++){
            MKMapPoint mp = polygonPoints[p];
            if (p == 0)
                CGPathMoveToPoint(mpr, NULL, mp.x, mp.y);
            else
                CGPathAddLineToPoint(mpr, NULL, mp.x, mp.y);
        }

        if(CGPathContainsPoint(mpr , NULL, mapPointAsCGP, FALSE)){
            isInside = YES;
        }

        CGPathRelease(mpr);
    }
}

通常のケースではうまく機能しますが、ユーザーが以下のようなポリゴンを描画すると、MKpolygon には交差するいくつかのポイントがあり、ある領域では色が塗りつぶされ、ある領域では色がクリアされます。

ここに画像の説明を入力

MKPolygon 内の透明な色の部分の緯度経度を渡すと、NO が返されるはずです。しかし、それはYESを返しています。つまり、if(CGPathContainsPoint(mpr , NULL, mapPointAsCGP, FALSE))TRUE です。

MKPolygon が交差している間にこの問題を修正するにはどうすればよいですか? 誰かがそのクリアな色の領域に色を塗りつぶすことを提案した方が良い. どんな提案でも大歓迎です。

4

2 に答える 2

1

示されている図は、偶奇塗りつぶし規則を示しているように見えます。FALSEの最後のパラメーターとして指定するCGPathContainsPointことで、巻き数規則を適用するように求めました。を渡してみてくださいTRUE

teo ルールの詳細については、Apple の Quartz ドキュメント、特に「Filling a Path」(半分以下) を参照してください。

于 2014-11-13T05:09:38.393 に答える