Reputation: 12924
-(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();
}
Above is my pseudo code for what I'd like to have happen. I am still having issues understanding vectors. As you can see above with the yVal = "..." theres an issue with binary expressions with vector<CGPoint>
and vector<double>
.
what this algorithm is supposed to do is take a drawn line on two graphs x(t)
and y(t)
then grabs the x(t)
's y
coords and turned it into a new vector. After that in the second while, it takes the x(t)
's x
coords to compare to the y(t)
x
coords to grab y
coords. When x(t)
's x and y(t)
x
don't match it needs to do the yVal
= algorithm.
Can some one help me turn my pseudo code into working code? Cheers
Upvotes: 0
Views: 196
Reputation: 80041
There are some mysteries in your code, but something like this hopefully gets you started. I removed the use of pointers-to-vector
and put some comments in line to explain my changes.
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]);
}
}
}
Upvotes: 2
Reputation: 96177
yVal = xp[c-1] + ....
yVal is a point to a vector of doubles (which you almost certainly don't to be using btw) not a value
Upvotes: 1