計算器新增變數支援、更多函數、邏輯短路運算後,進一步實作「輸入函數表達式即繪製波形」的功能,效果如示波器般直觀。
採用靜態字典 DicVariable 儲存變數(Key 為名稱,Value 為 TokenValue)。解析表達式時,非關鍵字識別字視為變數。關鍵在於保留完整語法樹:賦值運算子 = 保持樹結構,不像括號只做分隔。繪圖時只需修改變數節點的 TokenValue,再呼叫根節點 Execute(),避免重複解析,大幅提升效能。
定義參數變數 n、X/Y 兩個表達式(含 n)。先解析得三棵語法樹,再迴圈遞增 n 計算座標點,最後用 Graphics.DrawLines 連線:
// 偽代碼
strN = "n=0";
strX = "n*sin(n)";
strY = "n*cos(n)";
TokenN = Analyse(strN);
TokenX = Analyse(strX);
TokenY = Analyse(strY);
for (int n = 1; n < 360; n++)
{
TokenN.TokenValue = n;
TokenX.Execute();
TokenY.Execute();
points.Add(new Point(TokenX.TokenValue, TokenY.TokenValue));
}
g.DrawLines(pen, points.ToArray());
設計 DrawInfo 類別封裝單一波形的表達式 X/Y、線條顏色/寬度、點集合,並提供 InitialToken(解析)、Execute(計算點)方法。UI 透過 PropertyGrid 編輯波形清單。
Bitmap、取得 Graphics,設定 SmoothingMode.HighQuality。TranslateTransform),繪製 X/Y 軸與刻度。DrawLines。RotateFlip 修正 Y 軸方向。
| 名稱 | 表達式 X | 表達式 Y |
|---|---|---|
| 相位1 | n | a=100*sin(n) |
| 相位2 | n | b=100*sin(n+120) |
| 相位3 | n | c=100*sin(n-120) |
| 三相整流 | n | abs(a)+abs(b)+abs(c) |
| 李沙育圖 | 100*sin(n*2) | 100*cos(n*3+90)-200 |
| 阿基米德螺旋線 | n*sin(abs(n))/20-240 | n*cos(abs(n))/20-180 |
同樣的 GDI+ 技巧也可延伸繪製統計圖表(折線、柱狀、橫條、餅圖),文末附贈多張成果圖。