如何在C#中实现grapher

时间:2011-01-15 13:08:59

标签: c# math graphics gdi+ calculator

所以我正在写一个图形计算器。到目前为止,我有一个半功能的图示器,但是,我很难在精确的图形和平滑的曲线之间取得良好的平衡。

当前的实现(半伪代码)看起来像这样:

for (float i = GraphXMin; i <= GraphXMax; i++)
{
    PointF P = new PointF(i, EvaluateFunction(Function, i)
    ListOfPoints.Add(P)
}
Graphics.DrawCurve(ListOfPoints)

这个问题是因为它只在每个整数值上加一个点,当它们的转折点不落在整数上时,图形最终会失真(例如 sin(x)^ 2 )。

alt text

我尝试用更小的东西(比如0.1)递增 i ,这有效,但图表看起来非常粗糙。

alt text

我正在使用C#和GDI +。我将SmoothingMethod设置为AntiAlias,因此从第一张图中可以看出,这不是问题所在。绘制曲线有很多点是否存在某种问题?这些点是否应准确定位在像素上?

我相信你们中的一些人以前做过非常相似的事情,所以有什么建议吗?当你在这里时,你对使用渐近线绘制函数有什么建议吗?例如1 / X ^ 2

P.S。我不是在找一个能完成这一切的图书馆 - 我想自己写一下。

2 个答案:

答案 0 :(得分:2)

渲染图形时,您总是会产生舍入误差,因为位图是离散的而图形不是。

有几种应对方式:

  1. 使用抗锯齿;它只是让图表看起来更平滑。
  2. 使用非线性空间插值。使用lineair插值从点a到b绘制会导致角度。计算每个点的图形(不是线段!)的斜率,并将斜率馈入插值方法(双三次或贝塞尔曲线)
  3. 使用WPF或Silverlight等矢量API可以使事情更容易实现。

    照顾渐近线非常困难。首先,您必须找到它们,然后跳过该值,以便在图表中创建“洞”。

答案 1 :(得分:1)

好的,我解决了这个问题。在绘图过程的某个地方,我使用的是int而不是浮动。