【问题标题】:How to implement a grapher in C#如何在 C# 中实现绘图仪
【发布时间】:2011-06-09 15:24:01
【问题描述】:

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

当前的实现(半伪代码)如下所示:

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

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

我尝试将 i 增加一些较小的值(如 0.1),这可行,但图表看起来非常粗糙。

我正在使用 C# 和 GDI+。我将 SmoothingMethod 设置为 AntiAlias,所以这不是问题,正如您从第一张图中看到的那样。绘制具有很多点的曲线是否存在某种问题?这些点是否应该精确定位在像素上?

我相信你们中的一些人以前也做过类似的工作,有什么建议吗?当你在做的时候,你对用渐近线绘制函数有什么建议吗?例如1/x^2

附:我不是在寻找能够完成所有这些工作的库 - 我想自己编写。

【问题讨论】:

  • “图表看起来很粗糙”是什么意思?增加点数是要走的路,让它看起来更流畅。并且使 X 步更小 (1 -> 0.1)确实会增加它们。
  • 我也不知道,你所说的“用渐近线绘制函数的建议”是什么意思。你期待什么?它们与其他图表的处理方式有何不同?他们不是。
  • 我进行了编辑以使其更清晰。

标签: c# math graphics gdi+ calculator


【解决方案1】:

在渲染图形时,您总是会出现舍入错误,因为位图是离散的,而图形不是。

有几种应对方式:

  1. 使用抗锯齿;它只是让图表看起来更平滑。
  2. 使用非线性插值。使用线性插值从 a 点绘制到 b 点会产生角度。计算每个点的图形斜率(不是线段的斜率!)并将斜率输入插值方法(双三次或贝塞尔曲线)

使用 WPF 或 Silverlight 等矢量 API 可能会使事情更容易实现。

处理渐近线非常困难。首先,您必须找到它们,然后跳过该值,以便您可以在图中制作“洞”。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-02-19
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 2015-07-08
      • 1970-01-01
      相关资源
      最近更新 更多