编辑
2025-02-03
C# 应用
00
请注意,本文编写于 92 天前,最后修改于 90 天前,其中某些信息可能已经过时。

目录

创建WinForms应用程序
处理窗体的Paint事件
绘制坐标
解释代码
绘制坐标

笛卡尔坐标系(法语:système de coordonnées cartésiennes,英语:Cartesian coordinate system,也称直角坐标系)在数学中是一种正交坐标系,由法国数学家勒内·笛卡尔引入而得名。二维的直角坐标系是由两条相互垂直、相交于原点数线构成的。在平面内,任何一点的坐标是根据数轴上对应的点的坐标设定的。在平面内,任何一点与坐标的对应关系,类似于数轴上点与坐标的对应关系。

创建WinForms应用程序

  1. 在Visual Studio中创建一个新的Windows Forms应用程序项目。
  2. 打开主窗体(Form1)的代码文件(Form1.cs)。

处理窗体的Paint事件

在Form1类中处理Paint事件,并在该事件中使用GDI+绘图。

绘制坐标

C#
private void DrawCartesianCoordinateSystem(Graphics g, Rectangle clientRectangle) { // 设置绘图参数 Pen axisPen = new Pen(Color.Black, 2); Pen gridPen = new Pen(Color.LightGray, 1); Brush labelsBrush = Brushes.Black; Font labelsFont = new Font("Arial", 6); int width = clientRectangle.Width; int height = clientRectangle.Height; // 原点(中心点) Point origin = new Point(width / 2, height / 2); // 画坐标轴 g.DrawLine(axisPen, 0, origin.Y, width, origin.Y); // X轴 g.DrawLine(axisPen, origin.X, 0, origin.X, height); // Y轴 // 画网格和刻度 int spacing = 20; // 网格间距,20像素 for (int x = origin.X; x < width; x += spacing) { g.DrawLine(gridPen, x, 0, x, height); g.DrawString(((x - origin.X) / spacing).ToString(), labelsFont, labelsBrush, x, origin.Y); } for (int x = origin.X; x > 0; x -= spacing) { g.DrawLine(gridPen, x, 0, x, height); g.DrawString(((x - origin.X) / spacing).ToString(), labelsFont, labelsBrush, x, origin.Y); } for (int y = origin.Y; y < height; y += spacing) { g.DrawLine(gridPen, 0, y, width, y); if (y != origin.Y) // 以免重叠 { g.DrawString((-(y - origin.Y) / spacing).ToString(), labelsFont, labelsBrush, origin.X, y); } } for (int y = origin.Y; y > 0; y -= spacing) { g.DrawLine(gridPen, 0, y, width, y); if (y != origin.Y) // 以免重叠 { g.DrawString((-(y - origin.Y) / spacing).ToString(), labelsFont, labelsBrush, origin.X, y); } } }
C#
public Form1() { InitializeComponent(); this.Paint += new PaintEventHandler(this.Form1_Paint); }
C#
private void Form1_Resize(object sender, EventArgs e) { this.Refresh(); }

解释代码

  1. Form1的构造函数中,我们订阅了Paint事件。
  2. Form1_Paint事件处理方法中,我们调用了DrawCartesianCoordinateSystem方法来绘制坐标系。
  3. Form1_Resize 用于自动刷新
  4. DrawCartesianCoordinateSystem方法负责绘制X轴、Y轴、网格和刻度。
    • 使用Graphics对象的DrawLine方法绘制轴和网格。
    • 使用DrawString方法在坐标轴和网格的交点处绘制刻度标签。

这种方法为你创建了一个带有网格和刻度标签的基础笛卡尔坐标系。你可以根据需要调整和扩展此代码,例如添加更多的功能(如交互、缩放等)。

绘制坐标

面绘制点 ( P(3, 5) ) 并从这个点绘制到坐标轴的虚线,我们可以继续在上面的代码基础上进行修改。需要用到虚线,并确保正确转换坐标,使得点的绘制与笛卡尔坐标系相对应。

C#
private void DrawPointAndDottedLines(Graphics g, Rectangle clientRectangle, Point point,Color penColor) { // 设置绘图参数 Pen dottedPen = new Pen(penColor, 1); dottedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; Brush pointBrush = Brushes.Red; int width = clientRectangle.Width; int height = clientRectangle.Height; // 原点(中心点) Point origin = new Point(width / 2, height / 2); // 坐标转换:笛卡尔坐标系 -> 窗体坐标系 int x = origin.X + point.X * 20; int y = origin.Y - point.Y * 20; // 绘制点 g.FillEllipse(pointBrush, x - 3, y - 3, 6, 6); // 绘制虚线 g.DrawLine(dottedPen, x, y, x, origin.Y); // 垂直虚线到X轴 g.DrawLine(dottedPen, x, y, origin.X, y); // 水平虚线到Y轴 // 绘制点的坐标标签 Font pointFont = new Font("Arial", 10); g.DrawString($"P({point.X}, {point.Y})", pointFont, pointBrush, x + 5, y - 15); }

调用

C#
DrawPointAndDottedLines(e.Graphics, this.ClientRectangle, new Point(3, 5),Color.Blue); DrawPointAndDottedLines(e.Graphics, this.ClientRectangle, new Point(-10, 10), Color.DarkGreen);

image.png

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!