C++中的嵌套For循环

juud5qan  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(137)

你好,我是一个相对较新的程序员与C++。我有一个问题,我的代码
我有一个点2d类,它有两个x和y。
我正在尝试下面的嵌套循环:

Point2D Dec(float t)
{
    Point2D Temp;
    vector<Point2D>Bcopy=H->B;
    for(int p=0;p<Bcopy.size()-1;p++){
       for(int l=p;l<Bcopy.size();l++){
           Temp=(1-t)*Bcopy.at[p][l-1]+t*Bcopy.at[p+1][l-1];
       }
    }
    return Temp;
}

所以本质上还有另一个类,它有一个向量,点为2d,B,H,是指向它的指针,这些是存储鼠标交互等的点,然后画出它们,所以我只是创建了一个拷贝,然后做了上面的嵌套循环,然后我也用这些点来画它们。
我不断收到以下两个错误:

std::vector<Point2D,std::allocator<-Ty>>::at':function call missing argument list;use'&std::vector<Point2D,std::allocator<_Ty>>:at' to create a pointer to member

以及
下标需要数组或指针。
这两个错误都是针对行的

Temp=(1-t)*Bcopy.at[p][l-1]+t*Bcopy.at[p+1][l-1]

在法典中
我已经尝试了许多不同的事情,我要么不断得到更多的错误或只是这两个。我试图谷歌和理解的错误,但不能真的。任何帮助将不胜感激
谢谢

  • 编辑 * 经过多次尝试

我做了以下工作:

vector<2D>NewBcopy; 
 double Rx=0 ,Ry=0; 
 for(int p=0;p<Bcopy.size()-1;p++){ 
 for(int l=p;l<Bcopy.size();l++){ 
 if(l==p)
 {Newcopy.at(l)=Bcopy.at(l); 
 }
 else 
 {Rx=(1-t)*Bcopy.at(p).x+t*Bcopy.at(p+1).x; 
 Ry=(1-t)*Bcopy.at(p).y+t*Bcopy.at(p+1]).y:
 }
 Temp.x=Rx;
 Temp.y=Ry;
 }
 }
 return Temp;
 }
zrfyljdw

zrfyljdw1#

你可以通过添加一些函数来扩展表示二维点的类,这些函数在点和标量之间执行数学运算。一个最小的例子如下:

class Point2D
{
public:
    double x, y;

    Point2D(double xx = 0.0, double yy = 0.0) : x{xx}, y{yy} {}
};

Point2D operator*(const Point2D &p, double s)
{
    return Point2D{p.x * s, p.y *s};
}

Point2D operator+(const Point2D &a, const Point2D &b)
{
    return Point2D{a.x + b.x, a.y + b.y};
}

在此之后,实现像De Castleljau这样的算法就容易多了。下面是一个可能的(未优化的)实现:

Point2D De_Casteljau(std::vector<Point2D> B, double t)
{
    for ( int i = 0; i < B.size() - 1; ++i )
    {
        for ( int j = 0; j < B.size() - 1 - i ; ++j )
        {
            B[j] = B[j] * (1.0 - t) + B[j + 1] * t;
        }
    }
    return B[0];
}

我用这个简单的程序测试了它:

#include <iostream>
#include <vector>
#include <iomanip>

//... include here the preceding snippets... 

int main()
{
    using std::setw;
    std::vector<Point2D> B {
        {0,0}, {0,1}, {2,1}, {2,2}
    };

    std::cout << "   t      x       y\n";
    for ( double i = 0; i <= 1.0; i += 0.1 )
    {
        auto p = De_Casteljau(B, i);
        std::cout << std::fixed << std::setprecision(2) << setw(6) << i
                  << std::setprecision(4) << setw(8) << p.x
                  << setw(8) << p.y << '\n';
    }
    return 0;
}

其给出以下结果:

t      x       y
  0.00  0.0000  0.0000
  0.10  0.0560  0.2720
  0.20  0.2080  0.4960
  0.30  0.4320  0.6840
  0.40  0.7040  0.8480
  0.50  1.0000  1.0000
  0.60  1.2960  1.1520
  0.70  1.5680  1.3160
  0.80  1.7920  1.5040
  0.90  1.9440  1.7280
  1.00  2.0000  2.0000
y4ekin9u

y4ekin9u2#

你应该在学习复杂的算法之前先学习C++。你的(不工作的)代码应该看起来更像这样。

#include <vector>
using std::vector;

struct Point2D
{
    double x, y;
};

Point2D Dec(double t)
{
    Point2D Temp;
    vector<Point2D> Bcopy = H->B; // Fails: what is H?
    for (auto p = 0; p < Bcopy.size() - 1; p++)
    {
        for (auto l = p; l < Bcopy.size(); l++)
        {
            // Fails: Bcopy is not 2-dimensional
            Temp = (1 - t) * Bcopy[p][l - 1] + t * Bcopy[p + 1][l - 1];
        }
    }
    vector<Point2D> NewBcopy;
    double Rx = 0, Ry = 0;
    for (auto p = 0; p < Bcopy.size() - 1; p++)
    {
        for (auto l = p; l < Bcopy.size(); l++)
        {
            if (l == p)
            {
                NewBcopy[l] = Bcopy[l];
            }
            else
            {
                Rx = (1 - t)*Bcopy[p].x + t*Bcopy[p + 1].x;
                Ry = (1 - t)*Bcopy[p].y + t*Bcopy[p + 1].y;
            }
            Temp.x = Rx;
            Temp.y = Ry;
        }
    }
    return Temp;
}

相关问题