在 .NET 環境中視覺化模糊數學的隸屬函數,是理解與應用模糊邏輯的重要步驟。本文提供一個完整的 Windows Forms 應用程式範例,示範如何使用 GDI+ 繪製六大類常見隸屬函數圖形,包含完整原始碼與核心邏輯解析。
程式中定義兩個關鍵參數控制繪圖品質與效能:
專案採用標準 WinForms 架構,主表單 Form1 包含:
TextBox 與 ComboBox)PictureBox)程式支援 type1 = 1~6 六種基本函數,每種再依 type2 = 1~3 切換左右/中間/完整三種變體:
以水平線段與垂直截斷組成,適合表示「小於」「大於」「約等於」等語意。
使用線性插值公式 (d-a)/(b-a) 計算隸屬度,a,b,c,d 為使用者輸入的四個關鍵節點。
引入冪次參數 k,公式為 ((d-a)/(b-a))^k,曲線彎曲程度可調。
核心公式 Exp(-((d-a)/k)^2),參數 k 控制寬度,呈現平滑鐘形曲線。
以有理函數 1/(1+k*(d-a)^l) 建模,參數 l 控制邊緣銳度。
利用 0.5 ± 0.5*Sin(...) 產生週期性平滑過渡,適合模擬週期性模糊概念。
以正態分布(高斯型)為例,pictureBox1_Paint 事件中採用「微段連線法」:
for (d = a; d <= 2 * a; d += interval) {
x1 = o.X + d * unit;
x2 = o.X + (d + interval) * unit;
y1 = o.Y - (float)(Math.Exp(-((d - a) / k) * ((d - a) / k)) * unit);
y2 = o.Y - (float)(Math.Exp(-((d - interval - a) / k) * ((d - interval - a) / k)) * unit);
p1 = new PointF(x1, y1);
p2 = new PointF(x2, y2);
e.Graphics.DrawLine(Pens.Blue, p1, p2);
}
步驟:
(x1, y1)。interval 後的 (x2, y2)。e.Graphics.DrawLine 繪製微小線段。因 PictureBox.Paint 非使用者自訂方法,需透過按鈕點擊事件手動取得繪圖表面並觸發:
private void button1_Click(object sender, EventArgs e) {
InitArray(); // 讀取 UI 參數
Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle);
PaintEventArgs e1 = new PaintEventArgs(g, this.pictureBox1.ClientRectangle);
this.pictureBox1_Paint(this.pictureBox1, e1);
g.Dispose();
}
此工具可用於:
若需整合至 WPF 或 ASP.NET Core,可將繪圖邏輯封裝為獨立函式庫,配合 System.Drawing.Common 或 SkiaSharp 實現跨平台渲染。