使用 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
但是,我认为您真正想要做的是完全摆脱 tmp
和 elementPoints
并在最后一行写入:
Polyline(hdc,&Points[0],(int) Points.size()-1);
//Or probably rather:
Polyline(hdc,&Points[0],(int) Points.size());
顺便说一句:-1
的目的是什么?
所以我正在尝试绘制此 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
但是,我认为您真正想要做的是完全摆脱 tmp
和 elementPoints
并在最后一行写入:
Polyline(hdc,&Points[0],(int) Points.size()-1);
//Or probably rather:
Polyline(hdc,&Points[0],(int) Points.size());
顺便说一句:-1
的目的是什么?