1

左側に凡例を持つ ViewController をコーディングしています (ラベルと色付きのボックスの垂直リスト: カテゴリ 1: 黄色、カテゴリ 2: 緑色、カテゴリ 3: 青色など...)。

ユーザーはリスト内の項目をタップして、UIView 内に楕円を描くことができます。私はタッチイベントを追跡しており、コアグラフィックスを使用して楕円を問題なく描画できます。

次のステップは、2 つのセットの交点を描画することです。ユーザーが、緑の楕円と赤の楕円を少し重ねて描いたとします。交差点を黄色 (赤 + 緑 = 黄色) にしたいのですが、これを行う方法についてのアイデアはありません。

次の画像のように、1.0 未満のアルファ チャネルを使用してこれを実現できました。 ここに画像の説明を入力

さらに、ユーザーが UIImage 内のポイントをタップし、そのピクセルが含まれるすべてのセットの交点を取得する方法が必要です。

4

2 に答える 2

1

Core Graphicsを使用して楕円を描画している場合は、ブレンドモードを変更してさまざまな外観を作成できます。必要なブレンドモードは加算ですが、Core Graphicsではサポートされていないようです(Quantelの特許が原因である可能性がありますが、有効期限が切れていると思います)。50%アルファを使用し、通常モードを使用することで、おそらく同様の効果を作成できます。または、他のモードの1つで、見栄えのするものが提供される場合もあります。

それがうまくいかない場合は、Additiveブレンディングを使用してOpenGLでそれを行うことができます。

于 2013-03-18T03:03:39.633 に答える
0

回答はuser1118321からのものですが、インラインで返信するのではなく、インラインの写真を掲載するためにこの回答を投稿しています。最初に、ベン図に適した色のセットを選択しました。

ここに画像の説明を入力

これらの色は互いに重なり合って隠れています。解決策は、kCGBlendModeScreen を使用することでした。

ここに画像の説明を入力

ただし、これにより元の色が増強されました。これに対する解決策は、背景を黒に設定することでした:

ここに画像の説明を入力

コードに興味がある、または怠惰なコードの場合は、コードの一部を次に示します。touchesBegan/Ended/Moved イベントでは、SMVennObjects を作成し、drawRect で描画しています。SMVennObject には、2 つの CGPoint と 1 つの UIColor (静的 int を使用して順番に割り当てられる) のみが含まれます。

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect{        
    for(NSUInteger index = 0; index < self.vennObjects.count; index++){
        NSLog(@"drawing index %d", index);
        SMVennObject* vo = [self.vennObjects objectAtIndex:index];
        [self drawVennObject:vo context:UIGraphicsGetCurrentContext()];
    }
}

-(void)drawVennObject:(SMVennObject*)vo context:(CGContextRef)cgContext{
    if((vo.pointBegin.x == 0 && vo.pointBegin.y == 0) ||
       (vo.pointEnd.x == 0 && vo.pointEnd.y == 0)){
        return;
    }

    CGContextBeginPath(cgContext);
    CGContextSetLineWidth(cgContext, 2.0f);

    // Convert UIColor to raw values
    CGFloat red = 0.0;
    CGFloat green = 0.0;
    CGFloat blue = 0.0;
    CGFloat alpha = 0.0;
    [vo.color getRed:&red green:&green blue:&blue alpha:&alpha];
    alpha = 1.0;
    CGFloat color[4] = {red, green, blue, alpha};


    CGContextSetBlendMode(cgContext, kCGBlendModeScreen);

    CGRect r = CGRectMake(MIN(vo.pointBegin.x, vo.pointEnd.x),
                          MIN(vo.pointBegin.y, vo.pointEnd.y),
                          fabs(vo.pointBegin.x - vo.pointEnd.x),
                          fabs(vo.pointBegin.y - vo.pointEnd.y));

    // Draw ellipse
    CGContextSetFillColor(cgContext, color);
    CGContextFillEllipseInRect(cgContext, r);

    // Draw outline of ellipse
    CGContextSetStrokeColor(cgContext, color);
    CGContextStrokeEllipseInRect(cgContext, r);

}
于 2013-03-19T16:06:19.270 に答える