簡體   English   中英

如何在 C# 中實現繪圖器

[英]How to implement a grapher in C#

所以我正在寫一個圖形計算器。 到目前為止,我有一個半功能繪圖儀,但是,我很難在准確的圖形和平滑的曲線之間取得良好的平衡。

當前的實現(半偽代碼)看起來像這樣:

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

PS我不是在尋找一個可以完成所有這些的庫-我想自己編寫它。

渲染圖形時,您總是會出現舍入錯誤,因為位圖是離散的,而圖形不是。

有幾種應對方式:

  1. 使用抗鋸齒; 它只是使圖形看起來更平滑。
  2. 使用非線性插值。 使用線性插值從 a 點繪制到 b 點會產生角度。 計算每個點的圖形(不是線段!)的斜率並將斜率提供給插值方法(雙三次或貝塞爾曲線)

使用 WPF 或 Silverlight 等矢量 API 可能會使事情更容易實現。

處理漸近線非常困難。 首先,您必須找到它們,然后跳過該值,以便您可以在圖表中創建“洞”。

好的,我解決了問題。 在繪圖過程中的某個地方,我使用了 int 而不是 float。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM