我正在编写一个ViewController,它左边会有一个图例(标签和彩色框的垂直列表:Category1:黄色,Category2:gree,类别3:蓝色等等)
用户可以点击列表中的项目,然后在UIView中绘制一个椭圆。我正在跟踪触摸事件,可以使用核心图形绘制省略号没问题。
下一步是绘制两组的交集。假设用户绘制一个有点重叠的绿色椭圆和一个红色椭圆。我想把交叉点染成黄色(红色+绿色=黄色),但对如何做到这一点没有任何想法。
我已经能够使用< alpha通道完成此操作。 1.0如下图所示:
然后另外,我需要一种方法让用户点击UIImage中的一个点,然后检索该像素所在的所有集合的交集。
答案 0 :(得分:1)
如果您使用Core Graphics绘制省略号,则可以更改blend mode以创建不同的外观。您想要的混合模式是添加,但Core Graphics似乎不支持它(可能是由于Quantel专利,尽管我认为它已经过期)。您可以使用50%alpha并使用普通模式创建类似的效果。或者也许其他模式之一会提供看起来更好的东西。
如果这不起作用,你可以使用additive blending在OpenGL中完成。
答案 1 :(得分:0)
答案来自user1118321,但是我发布这个答案是为了拥有内联图片而不是内联回复。首先,我为维恩图选择了一组更好的颜色:
这些颜色重叠并相互隐藏。解决方案是使用kCGBlendModeScreen:
然而,这增强了原始颜色。解决方法是将背景设置为黑色:
对于那些好奇或懒惰的代码,这里有一些代码。在touchesBegan / Ended / Moved事件中,我正在创建SMVennObjects,然后在drawRect中绘制它们。 SMVennObject只包含两个CGPoints和一个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);
}