Основная графика — рисование линии под углом

#iphone #objective-c #core-graphics

#iPhone #objective-c #ядро-графика

Вопрос:

Я уже некоторое время пытаюсь разобраться с этим и нуждаюсь в некоторой помощи. Я просто хочу нарисовать 25 линий от центра моего дисплея (160 200) на расстоянии 14,4 градусов. Я использовал эту строку кода в цикле for, где x — множитель в 14,4 градуса —

     UIImage*backgroundImage = [UIImage imageNamed:@"Primate Background Only.png"];
[backgroundImage drawInRect:CGRectMake(0, 0, 320, 480)];
  

// Рисуем внешний круг

 rect = CGRectMake(0.0, 35.0, 320.0, 320.0);     
CGContextRef contextRef = UIGraphicsGetCurrentContext();                // Get the contextRef
CGContextSetLineWidth       (contextRef, 0.5);                  // Set the border width
CGContextSetRGBFillColor    (contextRef, (219.0f/255.0f), (219.0f/255.0f), (219.0f/255.0f), 0.05f);             // Set the circle fill color to GREEN
CGContextSetRGBStrokeColor  (contextRef, 0.0, 0.0, 0.0, 0.2);           // Set the circle border color to BLACK     
CGContextFillEllipseInRect      (contextRef, rect);                 // Fill the circle with the fill color
CGContextStrokeEllipseInRect    (contextRef, rect);                 // Draw the circle border
  

// Рисуем внутренний круг

 rect = CGRectMake(25.0, 60.0, 270.0, 270.0);                        // Get the contextRef
CGContextSetLineWidth       (contextRef, 0.5);                  // Set the border width
CGContextSetRGBFillColor    (contextRef, (219.0f/255.0f), (219.0f/255.0f), (219.0f/255.0f), 0.25f);
CGContextSetRGBStrokeColor  (contextRef, 0.0, 0.0, 0.0, 0.2);           // Set the circle border color to BLACK     
CGContextFillEllipseInRect      (contextRef, rect);                 // Fill the circle with the fill color
CGContextStrokeEllipseInRect    (contextRef, rect);     
  

// Рисуем сегменты

 CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, 0.0);           
    for (x=1; x<26; x  ) {  

        CGContextSetLineWidth       (context, 0.5);
        CGContextSetRGBStrokeColor  (context, 0.0, 0.0, 0.0, 0.25);
        CGContextMoveToPoint        (context, 160, 200);                
        CGContextAddLineToPoint     (context, (160.0 * (cos((x*14.4)*(M_PI/180)))), (160.0 * (sin((x*14.4)*(M_PI/180)))));                      //  The angle is in degrees
        CGContextAddLineToPoint     (context, 200, 65);
        CGContextAddLineToPoint     (context, 160, 200);            
        CGContextStrokePath(context);                           // Why is this not showing both line color and infill?
        CGContextSetFillColorWithColor   (context, [UIColor whiteColor].CGColor);       
        CGContextFillPath           (context);
        CGContextRef context = UIGraphicsGetCurrentContext();
    }           
  

(Я намеревался опубликовать изображение здесь, но это мне не позволяет!)

Может кто-нибудь, пожалуйста, исправить мои тригонометрические функции. Это предназначено для рисования 25 линий по часовой стрелке с 12:00 до 24:00. Вместо этого он рисует в обратном направлении только на 90 градусов, а затем возвращается, все линии также имеют большую длину.

Очень благодарен

Выше приведен увеличенный пример кода, используемого для рисования внешних окружностей tow и внутренних сегментов в соответствии с запросом. Я попытаюсь загрузить изображение следующим.

введите описание изображения здесь

Комментарии:

1. Тригонометрия выглядит нормально, не могли бы вы показать нам больше вашего кода? Цикл, который повторяется x и т.д.

2. Густав прав. Кроме того, если вы можете загрузить изображение в другое место и предоставить ссылку на него, то кто-нибудь с достаточной репутацией сможет отредактировать ваш пост, чтобы поместить его в строку.

3. Я бы переформатировал ваш код, но это слишком много… не могли бы вы переформатировать это, пожалуйста, чтобы оно было читабельным? За исключением того, что вы пытаетесь намеренно запутать это 🙂

4. Итак, вы заставили это работать. Если нет, опубликуйте немного больше информации, чтобы кто-нибудь мог вам помочь. Если это сработало, пожалуйста, примите ответ.

Ответ №1:

Ваша главная проблема заключается в этой строке кода:

 CGContextAddLineToPoint(context, (160.0 * (cos((x*14.4)*(M_PI/180)))), 
                                (160.0 * (sin((x*14.4)*(M_PI/180)))));
  

это должно быть:

 CGContextAddLineToPoint(context, 160   (160.0 * (cos((x*14.4)*(M_PI/180)))), 
                                200   (160.0 * (sin((x*14.4)*(M_PI/180)))));
  

Как вы изначально написали, линии должны были быть нарисованы относительно 0,0, но вы хотите нарисовать относительно вашей центральной точки (160, 200).

Следующие 2 строки также немного подозрительны:

         CGContextAddLineToPoint     (context, 200, 65);
        CGContextAddLineToPoint     (context, 160, 200);
  

Мне непонятно, что вы пытались здесь сделать, но в конечном итоге это привело бы к рисованию линии от конца каждого плеча до фиксированной точки (200,65), а оттуда обратно к вашей центральной точке, что почти наверняка не то, что вы намеревались! Попробуйте прокомментировать эти линии, убедитесь, что «руки» нарисованы правильно, и продолжайте…

Надеюсь, это понятно

Если вы внесете эти исправления, ваш экран будет выглядеть примерно так: Скриншот

Комментарии:

1. @Frank, добро пожаловать в stackoverflow! Предлагаемая вами правка, вероятно, должна быть просто комментарием к этому ответу или комментарием к вашему вопросу. 🙂 Редактирование вопросов и ответов других людей — это прекрасно, но хорошо, если они уточняют моменты, исправляют опечатки и т.д. Продолжение обсуждения изменений быстро приводит к нечитаемому контенту. (Вы когда-нибудь пробовали читать первую в мире wiki ? Непонятно. 🙂