使用 Polyline() 绘制欧拉积分,C++

Plotting Euler Integration using Polyline(), C++

所以我正在尝试绘制此 Euler 积分函数的输出:

typedef double F(double,double);
using std::vector;

void euler(F f, double y0, double a, double b, double h,vector<POINT> Points)
{

POINT Pt;
double y_n = y0;
double t = a;
for (double t = a; t != b; t += h )

{
    y_n += h * f(t, y_n); 

    Pt.x = t; // assign the x value of the point to t.
    Pt.y = y_n; // assign the y value of the point to y_n.
    Points.push_back(Pt);

}


}


// Example: Newton's cooling law
double newtonCoolingLaw(double, double t) 
{
    return t; // return statement ends the function; here, it gives the time derivative y' = -0.07 * (t - 20)
}

我试图在 Win32 应用程序中使用 Polyline() 函数,所以我在 WM_PAINT:

的情况下这样做
case WM_PAINT:
    {

    hdc = BeginPaint(hWnd, &ps);

  //Draw lines to screen.

    hPen = CreatePen(PS_SOLID, 1, RGB(255, 25, 5));
    SelectObject(hdc, hPen);


    using std::vector;
    vector<POINT> Points(0);

    euler(newtonCoolingLaw, 1, 0, 20, 1,Points);

    POINT tmp = Points.at(0);
    const POINT* elementPoints[1] = { &tmp };

    int numberpoints = (int) Points.size() - 1 ;


    Polyline(hdc,elementPoints[1],numberpoints);

当我将 I/O 重新路由到控制台时,以下是变量的输出:

我可以使用 MovetoEx(hdc,0,0,NULL)LineTo(hdc,20,20) 在屏幕上绘制预期的线条,但由于某些原因 none 这些功能将与我的 vector<POINT> Points.有什么建议吗?

有很多地方对我来说是错误的:

1) 您应该通过引用或作为 return 值传递矢量:

void euler(/*...*/,vector<POINT>& Points)

目前您只是将一个副本传递给函数,因此不会修改原始向量。

2) 不要在 for-loop header 中比较双打的(不)平等。双打精度有限,所以如果 b 比 h 大很多,您的循环可能永远不会终止,因为 t 可能永远不会与 b 完全匹配。比较 "smaller" 而不是:

for (double t = a; t < b; t += h )

3) 为什么将 elementPoints 声明为大小为 1 的指针数组?一个简单的指针不会做:

const POINT* elementPoints =  &tmp ; //EDIT: see point 5)

4) 调用 Polyline 时出现 of-by-one 错误。如果你想坚持使用数组,请使用。

Polyline(hdc,elementPoints[0],numberpoints);

编辑:抱歉,我忘记了一个重要的:

5) 在您的代码中,elementPoints[0] 指向单个 double (tmp) 而不是向量内部的数组。如果您声明 tmp 作为参考,这可能会起作用:

POINT& tmp = Points.at(0); //I'm wondering why this doesn't throw an exception, as the vector should actually be empty here

但是,我认为您真正想要做的是完全摆脱 tmpelementPoints 并在最后一行写入:

Polyline(hdc,&Points[0],(int) Points.size()-1);
//Or probably rather:
Polyline(hdc,&Points[0],(int) Points.size());

顺便说一句:-1 的目的是什么?