[英]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.