数学函数教程: 第 1 部分






4.71/5 (10投票s)
数学函数教程 - 第 1 部分
引言
我最近辅导的一位三角学学生对大量的三角恒等式感到困惑。“要是我能直观地证明它们就好了……”她叹息道。嗯,这个程序就是我试图帮助她可视化三角恒等式的结果。而且,既然她在学习编程,我想为什么不构建一个她可以修改的通用数学函数工具呢?
我创建了一个名为HelpFile.html的文件,解释了如何使用该程序。它位于Resources目录中,并在您单击“帮助->说明”时显示。在深入研究代码之前,我强烈建议您下载项目并使用Chrome、Firefox或您喜欢的浏览器打开HelpFile.html来仔细阅读它。
快速入门
如果您没有时间阅读HelpFile.html,只想快速了解我的学生如何使用数学函数教程程序来可视化三角函数,请按照以下步骤操作:
- 下载并按下文所述生成解决方案。
- 在Visual Studio中按F5运行它。程序应显示如上图所示的四个不同颜色的函数曲线。最初,第一个线性(直线)函数显示为紫色,比其他函数稍粗的线条。
- 在右上角的“选择函数”列表框中单击“我的余弦函数”。请注意,现在余弦曲线是活动函数,显示为深蓝色,比其他函数稍粗的线条。还要注意控件的标签是“幅度”、“频率”、“相位偏移”和“幅度偏移”。
- 使用相位偏移滑块控件(或“滑轨”)来更改相位偏移值,然后观察余弦波如何移动以“对齐”正弦波(绿色)。当相位偏移值为pi/2,或大约1.57时,这两个函数对齐,直观地证明了cos(x) = sin(pi/2 - x)的三角恒等式。
- 除了滑块控件,您还可以单击数字向上向下控件上的向上和向下箭头按钮来更改相位偏移(或幅度、频率和幅度偏移)的值。或者,您也可以直接在文本框中键入值,然后按“应用”按钮。
- 或者,您可以单击相位偏移组框右侧的“开始计时器”按钮来开始增加相位偏移的值,并在值达到1.6(接近pi/2)时单击“停止计时器”。
Using the Code
下载并使用Visual Studio打开解决方案。它包含两个项目:
MathTutor
- 解决方案的主窗体ControlLib
- 一个库(DLL),包含一个.NET用户控件
按F6键构建解决方案。
主要类是MathFunction
public class MathFunction
{
public Func<double, double=""> MyFunc { get; set; }
public String Name { get; set; }
public String Formula { get; set; }
public Color ActiveColor { get; set; }
public Color InactiveColor { get; set; }
public Color LightColor { get; set; }
public double Amplitude { get; set; } // also known as parameter "A"
public double Frequency { get; set; } // also known as parameter "B"
public double HorizontalShift { get; set; } // also known as parameter "C"
public double VerticalShift { get; set; } // also known as parameter "D"
public String[] Labels { get; set; }
public double[] InitValues { get; set; }
public bool Visible { get; set; }
}</double,>
正如HelpFile.html中所解释的,有四个预定义的数学函数,此程序的主要目的是在MathTutorForm
上的.NET Picture Box(名为picCanvas
)上显示它们的图形。与每个函数相关联的是四个参数,称为A
、B
、C
和D
,它们的值可以通过右侧的控件进行更改。这四个预定义的数学函数存储在一个列表中。
private List<MathFunction> mathFunctions
代码非常直观,因为大多数操作都是针对mathFunctions
列表中的项。例如,要设置一个给定的函数使其不显示,我们只需在“数学函数详细信息对话框”中将其Visible
字段设置为false
。在“数学函数教程窗体”(上面屏幕截图中的窗体)中,更改函数参数控件的值会更改关联的参数(Amplitude
、Frequency
、HorizontalShift
或VerticalShift
)。我们必须确保当我们更改一个控件时,另外两个控件也随之更新。例如,以下是单击第一个数字向上向下框时的回调。请注意,函数在MathFunction
类中的Amplitude
值是如何更新的,以及文本框和滑块/滑轨控件中的值。
private void numericUpDownAmplitude_ValueChanged(object sender, EventArgs e)
{
int ndx = listBoxMathFunctions.SelectedIndex;
if (ndx < 0) return;
mathFunctions[ndx].Amplitude = (double)numericUpDownAmplitude.Value;
textBoxAmplitude.Text = mathFunctions[ndx].Amplitude.ToString("f2");
trackBarAmplitude.Value = (int)(mathFunctions[ndx].Amplitude);
this.picCanvas.Invalidate();
}
在左侧画布上绘图的任务由picCanvas_Paint
完成,它调用DrawScene
方法。LabelControls
、DrawAxes
、DrawCurve
和DrawPoint
方法执行其名称所暗示的功能。
private void DrawScene(Graphics graphics)
{
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.Clear(this.BackColor);
LabelControls();
DrawAxes(graphics);
DrawCurve(graphics);
DrawPoint(graphics);
graphics.Transform = transformation;
}
我在Stack Overflow(SO)上发现了一个有趣的功能,即能够为ListBox
着色自定义颜色;请参阅listBoxMathFunctions_DrawItem
以获取SO链接。我对其进行了一些修改,也更改了字体。正如HelpFile.html中所解释的,该ListBox
用于选择活动函数。当函数不可见时(也已在HelpFile.html中说明),ListBox
中的文本将以斜体显示,以提供函数不可见的视觉提示。
数学函数详细信息对话框
ControlLib
包含一个派生自UserControl
的类,该类允许我们构建一个由GroupBox
、TextBox
es、Button
s等组成的复合控件。
public partial class MathFunctionUserControl : UserControl
{
...
}
当我们显示“数学函数详细信息对话框”时,会创建四个MathFunctionUserControls
,每个对应一个预定义的数学函数。这些又显示在一个FlowLayoutPanel
中。使用此对话框,您可以设置函数的名称、颜色以及它在画布(PictureBox
)上是否可见。如HelpFile.html中所述,此版本中的公式和控件标签是只读的。
在第二部分,将提供定义自己的函数的功能。我将展示如何使用递归下降解析器来评估函数的值。您还将能够将表达式键入文本框控件,并由解析器进行评估。
历史
- 2018年5月10日:版本1.0.0.0