CWinform下绘制笛卡尔坐标系(直角坐标系)

一赫技术 2024-08-08 15:15:34

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

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

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

绘制坐标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); } }}public Form1(){ InitializeComponent(); this.Paint += new PaintEventHandler(this.Form1_Paint);}private void Form1_Resize(object sender, EventArgs e){ this.Refresh();}解释代码在Form1的构造函数中,我们订阅了Paint事件。在Form1_Paint事件处理方法中,我们调用了DrawCartesianCoordinateSystem方法来绘制坐标系。Form1_Resize 用于自动刷新DrawCartesianCoordinateSystem方法负责绘制X轴、Y轴、网格和刻度。 使用Graphics对象的DrawLine方法绘制轴和网格。 使用DrawString方法在坐标轴和网格的交点处绘制刻度标签。

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

绘制坐标

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

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);}

调用

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

0 阅读:0

一赫技术

简介:感谢大家的关注