簡體   English   中英

c# 繪制z軸

[英]c# draw the z axis

我在圖片框中繪制坐標軸

    void draw_cor()
    {
        int w = pictureBox1.ClientSize.Width / 2;
        int h = pictureBox1.ClientSize.Height / 2;
        Refresh();
        Graphics e = pictureBox1.CreateGraphics();
        e.TranslateTransform(w, h);
        DrawXAxis(new Point(-w, 0), new Point(w, 0), e);
        DrawYAxis(new Point(0, h), new Point(0, -h), e);
        DrawZAxis(new Point(-pictureBox1.ClientSize.Width , pictureBox1.ClientSize.Height), new Point(pictureBox1.ClientSize.Width, -pictureBox1.ClientSize.Height ), e);

    }

以 x 軸的標記和文本為例

    private void DrawXAxis(Point start, Point end, Graphics g)
    {
        for (int i = Step; i < end.X; i += Step)
        {
            g.DrawLine(Pens.Black, i, -5, i, 5);
            DrawText(new Point(i, 5), (i / Step).ToString(), g, false);
        }

        for (int i = -Step; i > start.X; i -= Step)
        {
            g.DrawLine(Pens.Black, i, -5, i, 5);
            DrawText(new Point(i, 5), (i / Step).ToString(), g, false);
        }
        g.DrawLine(Pens.Black, start, end);
        g.DrawString("X", new Font(Font.FontFamily, 10, FontStyle.Bold), Brushes.Black, new Point(end.X - 15, end.Y));

    }

    private void DrawText(Point point, string text, Graphics g, bool isYAxis)
    {
        var f = new Font(Font.FontFamily, 6);
        var size = g.MeasureString(text, f);
        var pt = isYAxis
            ? new PointF(point.X + 1, point.Y - size.Height / 2)
            : new PointF(point.X - size.Width / 2, point.Y + 1);
        var rect = new RectangleF(pt, size);
        g.DrawString(text, f, Brushes.Black, rect);
    }

有人可以解釋如何制作一種標記 z 軸的方法嗎? 我知道 x 和 y 的偏移都應該是對角線的,但是對我來說沒有任何結果,屏幕上也沒有出現任何標記。(到目前為止,我只設法在對角線上畫了一條直線)

更新:

    private void DrawZAxis(Point start, Point end, Graphics g)
    {
        

        for (int i = -Step, j=Step ; i > start.X; i -= Step,j += Step)
        {
            g.DrawLine(Pens.Black, new Point(i-5, j), new Point(i+5, j));
           
            DrawText(new Point(i, j), (i / -Step).ToString(), g, false);
        }
...
}

我似乎成功了,但我遇到了這樣一個問題:

在此處輸入圖像描述

在此處輸入圖像描述

也就是說,標記並不總是在坐標軸上。 如何避免這種情況? 數字必須始終在軸上(我想我應該在縮放 window 時計算系數,但只在哪里添加它或乘以什么?)

您正在處理 3D 數據,因此您應該使用 3D 工具來轉換您的軸,以及您的數據。

所以你需要定義一個從 3D 空間到二維空間的投影。 這通常通過定義投影矩陣來完成。 有多種 投影可供選擇,看起來您的投影是傾斜的,但正交投影和透視投影也很常見。 System.Numerics.Vectors 庫包含Matrix4x4和 vector2/3/4 的類,以及創建投影和變換向量的方法。

轉換矢量后,您可以簡單地保留 x/y 值並丟棄 z 值以獲取圖像坐標。 請注意,如果使用透視變換,您需要一個向量 4 並將 x/y/z 元素除以 W。

有了這些工具,為每個軸生成起點/終點,並在 3D 中創建刻度線,然后將所有內容投影到 2D 以進行繪圖,這應該是一件相當簡單的事情。

另一種選擇是在Wpf3D中開始做所有事情,這可能會使旋轉相機等一些功能更簡單。

暫無
暫無

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

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