Как заполнить цвет в пробелах с помощью сенсорного события? - PullRequest
8 голосов
/ 28 декабря 2011

enter image description here

хочу заполнить все пробелы другим цветом, используя сенсорные события

Прямо сейчас я могу заполнять круги, выбирая цвета из подборщика, но как заполнить интегрированную часть другим цветом ......

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UIColor *cl=[UIColor clearColor];
    UITouch *tuch=[touches anyObject];
    if ([clr isEqualToString:@"Red"]) {
        cl=[UIColor redColor];
    }
    else if ([clr isEqualToString:@"Blue"]) {
        cl=[UIColor blueColor] ;
    }
    else if ([clr isEqualToString:@"Green"]) {
        cl=[UIColor greenColor];
    }


    CGPoint p = [tuch locationInView:self];
    float xsq1=p.x -50;
    xsq1=xsq1*xsq1;
    float ysq1=p.y-110;
    ysq1=ysq1*ysq1;
    float h1 = ABS(sqrt(xsq1 + ysq1));

    float xsq2=p.x -100;
    xsq2=xsq2*xsq2;
    float ysq2=p.y-110;
    ysq2=ysq2*ysq2;
    float h2 = ABS(sqrt(xsq2 + ysq2));

    float xsq3=p.x -50;
    xsq3=xsq3*xsq3;
    float ysq3=p.y-190;
    ysq3=ysq3*ysq3;
    float h3 = ABS(sqrt(xsq3 + ysq3));

    if (h1<=40) {
        NSLog(@"touches inside of first circle");
        CGContextSetFillColorWithColor(context, cl.CGColor);
        CGRect cir1 = CGRectMake(10,266,80,80);
        CGContextFillEllipseInRect(context, cir1);
        [self setNeedsDisplayInRect:cir1];
    }
    else if (h2<=40) {
        NSLog(@"touches inside of second circle");
        CGContextSetFillColorWithColor(context, cl.CGColor);
        CGRect cir2 = CGRectMake(60,266,80,80);
        CGContextFillEllipseInRect(context, cir2);
        [self setNeedsDisplayInRect:cir2];
    }
}

1 Ответ

1 голос
/ 23 февраля 2012

Здесь есть две задачи: первая - определить, какая область была затронута, вторая - заполнить эту область. Оба требуют, чтобы вы вычислили точки пересечения окружности вышеупомянутого изображения, используя тригонометрию, и знали их положения.

Простым решением для обнаружения области касания было бы проверить, содержится ли касание в каком-либо из кругов, это легко вычислить, рассчитав расстояние до точки касания от центра окружностей, если оно меньше радиуса это внутри круга. Если он находится внутри более чем одного круга, вы знаете, что он принадлежит этой области пересечения. Это если внутри нет окружностей, но компонент x находится между центром левого круга и правым кругом, он должен быть в области между всеми кругами. В противном случае точка касания должна находиться за пределами всех окружностей.

Чтобы заполнить различные разделы изображения выше, вы можете создать пути, содержащие области, которые вам нужно заполнить, и заполните их CGContextFillPath. Как то так:

// draw a path to contain the fill region
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, startx, starty);
CGContextAddArcToPoint(ctx, ...);

// lots of other CGContextAddArcToPoint or AddLineToPoint method calls here to define the clip region

// close the clip path
CGContextClosePath(ctx);

// now you can fill the region
CGContextFillPath(ctx);

Вы можете повторить это для любого количества путей. Вы можете рассчитать траектории дуг для использования из точек пересечения окружности и радиусов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...