2013-03-18 2 views
1

왼쪽에 범례가있는 ViewController를 코딩합니다 (레이블 및 색칠 된 상자의 세로 목록 : Category1 : 노란색, Category2 : 초, 범주 3 : 파랑, 등 ...).)CoreGraphics는 타원의 교차점을 그립니다

사용자는 목록에서 항목을 탭한 다음 UIView 내에 타원을 그릴 수 있습니다. 나는 터치 이벤트를 추적하고 코어 그래픽을 사용하여 아무 문제없이 타원을 그릴 수 있습니다.

다음 단계는 두 세트의 교차를 그립니다. 사용자가 다소 겹치는 녹색 타원과 빨간색 타원을 그렸다고 가정합니다. 교차로 노란색 (빨간색 + 녹색 = 노란색)을 색칠하고 싶지만이를 수행하는 방법에 대한 아이디어가 없습니다.

난 다음 이미지로 < 1.0이 사용 알파 채널을 달성 할 수 있었다 : 추가적으로 다음 enter image description here

그리고, I는 사용자가있는 UIImage 한 지점을 탭하고 검색하도록 할 방법이 필요 해당 픽셀이있는 모든 세트의 교차점

+0

이것은 쉽게 타원 대신 직사각형을 사용하여 수행 할 수 있습니다. 사용자 측에서 무엇을 생각하겠습니까? 오히려 타원을 보시겠습니까? 비록 당신이 그들을 가다듬어도 직사각형을 사용하는 것처럼 곧바로 사용할 수는 없습니다. – VaporwareWolf

답변

1

코어 그래픽을 사용하여 타원을 그리는 경우 blend mode을 변경하여 다른 모양을 만들 수 있습니다. 원하는 블렌드 모드가 추가되었지만 Core Graphics에서 지원하지 않는 것 같습니다 (콴텔 특허로 인해 만료되었을 것으로 생각되었지만). 50 % 알파를 사용하고 일반 모드를 사용하면 비슷한 효과를 낼 수 있습니다. 아니면 다른 모드 중 하나가 더 잘 보이는 것을 제공 할 것입니다.

이것이 작동하지 않으면 additive blending을 사용하여 OpenGL에서 처리 할 수 ​​있습니다.

+0

안녕하세요, 제안 해 주셔서 감사합니다. 위 이미지에서 50 %의 알파를 사용하고 있습니다. 재미있는 방식으로 혼합되지 않는 색상 선택 때문에 실제로보기에는 좋지 않습니다. OpenGL이 작업을 수행 할 수 있다는 것을 알고 있지만 단순하게하기 위해 OpenGL을 CG로 유지하려고합니다. GLKit은 작업을 다소 단순하게 만들었지 만, CG와 같이 간단하지는 않습니다. – VaporwareWolf

+0

글쎄, 당신이 제안한 색상으로 시도해보십시오 (예 : 빨간색과 초록색은 노란색으로 만들어야합니다). 'CGContextSetBlendMode()'와 함께 사용할 수있는 다른 블렌드 모드가 괜찮습니까? 'kCGBlendModeScreen'은 이런 식으로 정말 좋은 선택입니다. – user1118321

0

대답은 user1118321에서 왔지만 인라인으로 회신하기보다는 인라인 그림이 있도록이 답변을 게시하고 있습니다. 우선은 벤 다이어그램 색상의 더 나은 세트를 선택 :

enter image description here

이러한 색상이 중복 서로를 숨 깁니다. 이 솔루션은 kCGBlendModeScreen을 사용하는 것이었다 :

enter image description here

그러나이 원래 색상을 증강. 여기에, 호기심 또는 게으른 그 코드를

enter image description here

코드의 일부입니다 : 이에 대한 해결책은 검은 색으로 배경을 설정하는 것이 었습니다. touchesBegan/Ended/Moved 이벤트에서 SMVennObjects를 만들고 나서 drawRect에서 그립니다. SMVennObject는 단지 두 개의 CGPoint와 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); 

} 
관련 문제