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