Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2010, 23:39   #1
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию Рисование гистограмм

Доброго времени суток уважаемые эксперты. Пишу программу, в которой, по ходу дела, должны строиться гистограммы. И вот натолкнулся на один маленький подвох с подготовкой данных(((.
Делаю так:
Код:
...
    QVector<mpf_class> data;
    srand(time(0));
    for(int i=0; i<100000; ++i){
        data.push_back(rand()%10);//СМОТРИ СЮДА
    }
   w->SetData(data,10);//СМОТРИ СЮДА
....
void QHistogram::SetData(const QVector<mpf_class> &Data, int IntervalCount)
{
    QwtArray<QwtDoubleInterval> intervals(IntervalCount);
    QwtArray<double> values(IntervalCount);
    if (!Data.isEmpty()){
       mpf_class max = Data[0];
       mpf_class min = Data[0];

       for(int i=1; i<Data.count(); ++i){
           if (Data[i] > max){
               max = Data[i];
           } else {
               if (Data[i] < min){
                   min = Data[i];
               }
           }
       }

        double delta = mpf_class((max - min)/IntervalCount).get_d();
        double pos = min.get_d();
        for(int i=0; i<IntervalCount; ++i, pos += delta){
            intervals[i] = QwtDoubleInterval(pos, pos+delta);
        }

        mpf_class left,right,tmp;
        int count1 = 0;
        int count2 = 0;

    for(int i=0; i<Data.count(); ++i){
        tmp = Data[i];
        left = min;
        right = left+delta;
        for(int j=0; j<IntervalCount; j++){
            if ((tmp >= left) && ((tmp < right)||(j==IntervalCount-1))){           //СМОТРИ СЮДА
                values[j]+=1;
                count2++;
                break;
            } else {
                left += delta;
                right += delta;
            }
        }
    }
    cout<<count1<<" - "<<count2<<endl;
    SetData(QwtIntervalData(intervals, values));
}
1.jpg
Второй вариант. Вот тут уже косяк:
Код:
    QVector<mpf_class> data;
    srand(time(0));
    for(int i=0; i<100000; ++i){
        data.push_back(rand()%11);//СМОТРИ СЮДА
    }
    w->SetData(data,10);//СМОТРИ СЮДА

2.png
В принципе, я понимаю, что все дело в этой строчке: if ((tmp >= left) && ((tmp < right)||(j==IntervalCount-1))), но я не могу вкурить, как нужно делать, дабы все это работало. Если делать такую строку: if ((tmp >= left) && (tmp < right)), то происходит потеря некоторых данных (вместо 100 000 чисел, получается примерно 99 000).
Не совсем внятно, но по другому объяснить не могу.
Собственно вопрос понятен: помогите кто чем может))
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование Masip Общие вопросы Delphi 10 08.06.2010 22:16
Рисование Granus Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 32 30.06.2009 23:23
рисование TaTT DoGG Общие вопросы .NET 3 14.05.2009 18:36
Рисование TriCERATOP Помощь студентам 5 28.11.2008 15:09
Рисование... HunterMan Win Api 10 30.04.2008 23:46