рисование шестиугольника с помощью UIBezierPath - PullRequest
1 голос
/ 29 марта 2012

Я рисую шестиугольник, используя UIBezierPath, в котором его точки (или пересечения) изменяются и управляются ползунком. Pls. смотрите скриншот здесь: http://postimage.org/image/tq8z8t9qb/

Проблема сейчас в том, что когда последняя точка нарисована или сдвинута, это уже неправильно (я пометил скриншот в кружке ). Я думаю, что нарисована дополнительная линия от начальной точки / центральной точки пути Безье. Надеюсь, вы можете проверить код:

- (void)drawRect:(CGRect)rect
{
   // Drawing code
   CGContextRef ctx = UIGraphicsGetCurrentContext();
   CGContextClearRect(ctx, rect);    
   CGPoint center = CGPointMake(150.0, 150.0);

   // line
   UIBezierPath *polyPath = [UIBezierPath bezierPath];
   polyPath.lineWidth = 5;
   [polyPath moveToPoint:CGPointMake(center.x, center.y + 60.0)];

   for (int i = 1; i <= 6; ++i) {
      CGFloat x, y;

      NSNumber *oNumb = [[self aIndexValues] objectAtIndex:i-1];
      fXValue_ = [oNumb floatValue];
      x = fXValue_ * sinf(i * 2.0 * M_PI / 6.0);
      y = fXValue_ * cosf(i * 2.0 * M_PI / 6.0);

      [polyPath addLineToPoint:CGPointMake(center.x + x, center.y + y)];
    }

    [polyPath closePath];
    [[UIColor redColor] setStroke];
    [polyPath stroke];

    // circle point
    for(int i = 1; i <= 6; ++i) {
       CGFloat x, y;
       NSNumber *oNumb = [[self aIndexValues] objectAtIndex:i-1];
       fXValue_ = [oNumb floatValue];            
       x = fXValue_ * sinf(i * 2.0 * M_PI / 6.0);
       y = fXValue_ * cosf(i * 2.0 * M_PI / 6.0);

       UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(center.x + x - 6, center.y + y - 6, 15, 15)];  
       circle.lineWidth = 5;
       [[UIColor whiteColor] setFill];
       [circle fill];
    }
 }

Pls. дайте мне знать, что не так. Спасибо

1 Ответ

0 голосов
/ 11 апреля 2012

Посмотрите внимательно здесь:

[polyPath moveToPoint:CGPointMake(center.x, center.y + 60.0)];

Это всегда обращается к максимальной нижней вершине шестиугольника, игнорируя настройку ползунка для этой вершины.Вероятно, следует использовать элемент approriate aIndexValues вместо 60.0.

Несколько других вещей, которые не мешают этой работе, но делают ваш код неопрятным:

  1. Вам не нужно звонить CGContextClearRect в drawRect.Контекст уже очищен для вас.
  2. Вы используете переменную с именем fXValue_, которая не определена в этом методе.Вам не нужно его значение из другого места, поэтому объявите переменную в этом методе для хранения радиуса вершины.
  3. Проверьте, можете ли вы найти чистый способ подсчета i от 0 до 5 вместо 1 до6, поэтому избегайте необходимости вычитать 1 всякий раз, когда вы получаете числа из aIndexValues.
...