2011-10-14 1 views
1

У меня есть NSArray, который содержит большое количество объектов NSNumber (в тысячах). Я использую эти числа для построения красивого линейного графика. Проблема в том, что граф использует каждое значение, что делает график очень резким. Это становится еще хуже, чем больше значения у меня есть:Objective-C: Smooth NSArray объектов NSNumber

enter image description here

Я хочу, чтобы иметь возможность сделать это в более гладкий график, возможно, выбрасывая эти цифры, которые делают его зазубренным смотреть. Я хочу, чтобы выглядеть следующим образом:

enter image description here

Может быть, это поздно, но я не думаю о пути, чтобы сделать это. Возможно, зациклились на моих ценностях и выбрасывали некоторые из них? График не должен быть на 100% точным, он просто должен быть достойным представлением значений.

EDIT:

Вот метод, который я придумал, используя ответ jrturton в:

- (NSArray *)smoothedArray:(NSArray *)items { 

    int average = 0; 
    int i = 0; 
    int numberToAverageBy = 10; 

    NSMutableArray *newItems = [[[NSMutableArray alloc] init] autorelease]; 
    // Loop 
    for (NSNumber *elevation in items) { 

     average += [elevation intValue]; 
     i++; 

     if (i == numberToAverageBy) { 
      [newItems addObject:[NSNumber numberWithInt:average/numberToAverageBy]]; 
      i = 0; 
      average = 0; 
     }//end 
    }//end for 

    return [NSArray arrayWithArray:newItems]; 

}//end 

Он работал отлично!

ответ

3

Вы можете взять среднее значение каждые 10 (или все, что вы выбираете) элементов в массиве и использовать их для определения точек на график. Это сделает рисунок еще более быстрым.

+0

Мне нравится это направление усреднения ... проверит некоторые вещи в этом направлении. –

+0

Большое спасибо, он отлично работал. Я обновил свой ответ с помощью метода, который я написал. –

3

Посмотрите на скользящие средние.

Чем короче скользящая средняя, ​​тем ближе она обнимает кривую, но она сглаживает ее.

Например, проверить 10 дневную экспоненциальную скользящую среднюю здесь:

http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages

+0

Да, это именно то, что я ищу делать. Предполагая, что такие вычисления могут быть сложными? –

+0

Я так не думаю - вы повторяете, вспоминая последнее n, а затем вы просто усредняете их. Должно быть просто ... – bryanmac

+0

Спасибо, я просто разместил свое решение. –

1

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

Перед отображением графика вместо того, чтобы выбрасывать некоторые элементы, почему бы вам не установить каждый элемент в среднем на некоторые из элементы вокруг него? Например, если ваш массив содержит (2, 1, 3, 5, 4, 3, 8), который превратится в (2, 2, 3, 4, 4, 5, 8). Чтобы получить эти значения, я взял среднее значение для каждого элемента и его ближайших соседей, чтобы получить новый элемент (за исключением конечных элементов, которые я оставил как есть). Играя с количеством элементов, которые вы усредняете вместе на каждом шаге, ваш график будет выглядеть так гладко, как вы этого хотите.

 Смежные вопросы

  • Нет связанных вопросов^_^