【问题标题】:Plotting Euler Integration using Polyline(), C++使用 Polyline()、C++ 绘制欧拉积分
【发布时间】:2015-02-20 01:12:07
【问题描述】:

所以我试图绘制这个欧拉积分函数的输出:

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) 在屏幕上绘制预期的线条,但由于某种原因,这些功能都不适用于我的vector&lt;POINT&gt; Points。有什么建议吗?

【问题讨论】:

    标签: c++ plot polyline gdi


    【解决方案1】:

    在我看来,有很多事情是错误的:

    1) 您应该通过引用或作为返回值传递向量:

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

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

    2) 不要在你的 for 循环头中比较双精度数的(不)相等性。双精度有限,所以如果 b 比 h 大得多,你的循环可能永远不会终止,因为 t 可能永远不会完全匹配 b。比较“更小”:

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

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

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

    4) 调用Polyline 时出现一个错误。如果你想坚持使用数组。

    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 的目的是什么?

    【讨论】:

    • 非常感谢!我是一个完全的初学者,你教会了我很多。我已经研究这个问题一段时间了。
    • 另外,要回答一些关于我糟糕代码的问题:tmp 的定义不会引发异常,因为我通常会定义任意大小的 Points 向量来保持它从这样做。 -1 是我的错,因为我误解了我之前遇到的问题,正如您所指出的,这可能是由于错误地使用了 elementPoints。只是为了澄清,&amp;Points[0] 是对 Points 中元素 0 的引用?
    • @Robbie:不用担心,指针、引用、数组和向量的组合在几行代码中一开始会变得相当混乱。在这个上下文中&amp; 表示“取地址”,所以&amp;Points[0] 基本上返回向量中第一个元素(“元素0”)的地址。由于向量在内部将其元素存储为数组,这相当于POINTs 的内部数组的起始地址,这是Polyline 所期望的。不过,我不得不承认,我不确定标准是否绝对保证了这一点。
    • @Robbie:我还更正了我对tmp 的建议中的语法错误。 &amp; 必须放在类型之后和变量名之前(与 * 相同)。
    • 嗯,它肯定会产生我想要的结果,至少是为了证明它可以工作。再次感谢。你真的帮助我更深入地理解了其中的一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2020-09-15
    • 2018-03-09
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多