Проблема написания алгоритма с векторами - PullRequest
0 голосов
/ 19 октября 2011
-(void)userShow{
    vector<CGPoint>::iterator it;
    vector<CGPoint>* xp = x.graphPoints;
    vector<CGPoint>* yp = y.graphPoints;
    xVal = new vector<double>();
    yVal = new vector<double>();
    xyVal = new vector<double>();
    xxVal = new vector<double>();
    value = new vector<double>();
    c = new vector<double>();   


    for(it = xp->begin(); it != xp->end(); ++it){
        xVal->push_back(it->y);
        xxVal->push_back(it->x);

    }
    for(it = yp->begin(); it != yp->end(); ++it){
        xyVal->push_back(it->x);
    }

    for (int i = 0; i < xVal->size(); i++){
        c = xVal[i];
        while (xyVal[c] < xxVal[i];){
            c++;
            if ((c-1)<=xxVal[i]<=c){
                double value = xp[c-1] + (xp[c] - yp[c-1])*(xxVal[i] - xyVal[c-1])/(xyVal[c] - xyVal[c-1]);
            }
            yVal->push_back(value);
        }
    }

   UserGraph->removeAllData();
   UserGraph->addDataSet(xVal, yVal, [UIColor redColor], 0, false, true, 2);
   UserGraph->updateAll();
}

Выше мой псевдокод того, что я хотел бы, чтобы произошло.У меня все еще есть проблемы с пониманием векторов.Как вы можете видеть выше с yVal = "...", существует проблема с двоичными выражениями с vector<CGPoint> и vector<double>.

то, что должен делать этот алгоритм, это взять нарисованную линию на двух графиках x(t) и y(t), затем захватить x(t) координаты y и превратить его в новый вектор.После этого во второй раз требуется x(t) 'x координаты для сравнения с y(t) x координатами, чтобы получить y координаты.Когда x(t) 'sx и y(t) x не совпадают, необходимо выполнить алгоритм yVal =.

Может ли кто-нибудь помочь мне превратить мой псевдокод в рабочий код?Приветствия

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

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

void userShow() {

    // I assume that x.graphPoints is just some `std::vector<CGPoint>` and you just want to use it locally

    // if x.graphPoints returns an "std::vector<CGPoint> *" (pointer-to-vector), 
    // you should probably modify the class/struct/whatever to just use the vector,
    // not a pointer-to-vector
    vector<CGPoint>& xp = x.graphPoints;

    // ditto for y.graphPoints
    vector<CGPoint>& yp = y.graphPoints;

    // You almost never use pointers to containers, nor allocate them with new - 
    // it's an atypical practice in C++
    /* 
    xVal = new vector<double>();
    yVal = new vector<double>();
    xyVal = new vector<double>();
    */

    // instead just create the vectors on the stack
    std::vector<double> xVal, yVal, xyVal;

    std::vector<CGPoint>::iterator it;

    // These have been changed to not use -> member notation, since we're not
    // using pointers anymore
    for(it = xp.begin(); it != xp.end(); ++it){
        xVal.push_back(it->y);
        xxVal.push_back(it->x); // I have no idea what xxVal is? I think it's xyVal?
        // xyVal.push_back(it->x); // like this?
    }

    // you can iterate through a vector with this type of loop, or
    // use an iterator as above
    for (int i = 0; i < xp.size(); ++i){
        int c = 1;
        while (xyVal[c] < xxVal[i]) {
            ++c;

            // (c-1)<=xxVal[i]<=c; // ??? 

            // I think the previous line means...c gets the value of xyVal[i], and
            // xxVal gets c-1? You'll have to explain this, otherwise it it just a
            // free-standing conditional comparison

            // EDIT: I think I understand what you mean
            // this was a conditional check to do the yVal stuff
            /**
            if ( (c-1) <= xxVal[i] && xxVal[i] <= c) {
                // yVal = xp[c-1] + (xp[c] - yp[c-1])*(xxVal[i]-xyVal[c-1])/(xyVal[c] - xyVal[c-1]);
            } */

            // as mentioned, yVal is a vector, so what do you want?
            yVal = xp[c-1] + (xp[c] - yp[c-1])*(xxVal[i]-xyVal[c-1])/(xyVal[c] - xyVal[c-1]);

        }
    }
}
1 голос
/ 19 октября 2011

yVal = xp[c-1] + ....

yVal - это точка к вектору двойных чисел (которую вы почти наверняка не используете btw), а не значение

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