首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 函數發生器圖表縮放:座標軸動態縮放實現

     編輯:程式設計綜合問答

核心思路

引入 縮放比例因子 double zoom = 1.0,繪圖時所有座標乘以此因子。

關鍵代碼

public partial class FunctionPlotter : Form {
    double zoom = 1.0;      // 1.0 = 原始大小
    const double ZOOM_STEP = 1.2;

    // 鼠標滾輪縮放
    protected override void OnMouseWheel(MouseEventArgs e) {
        if (e.Delta > 0) zoom *= ZOOM_STEP;
        else zoom /= ZOOM_STEP;
        zoom = Math.Clamp(zoom, 0.1, 10.0);
        Invalidate();  // 觸發重繪
    }

    // 繪圖邏輯
    protected override void OnPaint(PaintEventArgs e) {
        var g = e.Graphics;
        g.ScaleTransform((float)zoom, (float)zoom);  // 整體縮放

        // 繪製座標軸 (邏輯座標不變)
        DrawAxes(g);
        DrawFunction(g);
    }

    void DrawAxes(Graphics g) {
        // 邏輯座標:X: -10..10, Y: -5..5
        g.DrawLine(Pens.Gray, -10, 0, 10, 0);  // X軸
        g.DrawLine(Pens.Gray, 0, -5, 0, 5);    // Y軸
        // 刻度標籤同樣受縮放影響,自動放大
    }
}

進階:平移 + 縮放

PointF pan = new PointF(0, 0);  // 邏輯原點偏移

protected override void OnMouseDown(MouseEventArgs e) {
    if (e.Button == MouseButtons.Middle) {
        lastPan = e.Location;
        isPanning = true;
    }
}
protected override void OnMouseMove(MouseEventArgs e) {
    if (isPanning) {
        pan.X += (e.X - lastPan.X) / zoom;
        pan.Y += (e.Y - lastPan.Y) / zoom;
        lastPan = e.Location;
        Invalidate();
    }
}
protected override void OnPaint(PaintEventArgs e) {
    var g = e.Graphics;
    g.TranslateTransform(pan.X, pan.Y);  // 先平移
    g.ScaleTransform((float)zoom, (float)zoom);  // 再縮放
    DrawAxes(g);
    DrawFunction(g);
}

座標軸標籤自適應

  • 根據 zoom 動態計算刻度步長:double step = NiceStep(10 / zoom)。
  • 只繪製可視區域內的刻度:visibleRange = g.VisibleClipBounds 反變換到邏輯座標。

第三方圖表庫推薦

  • LiveCharts2:WPF/WinForms/Maui 原生,支持縮放平移、工具提示。
  • ScottPlot:高性能、無依賴、API 簡潔。
  • OxyPlot:成熟、支持導出 SVG/PDF。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved