笛卡尔坐标系(法语:système de coordonnées cartésiennes,英语:Cartesian coordinate system,也称直角坐标系)在数学中是一种正交坐标系,由法国数学家勒内·笛卡尔引入而得名。二维的直角坐标系是由两条相互垂直、相交于原点的数线构成的。在平面内,任何一点的坐标是根据数轴上对应的点的坐标设定的。在平面内,任何一点与坐标的对应关系,类似于数轴上点与坐标的对应关系。
在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();
}
Form1
的构造函数中,我们订阅了Paint事件。Form1_Paint
事件处理方法中,我们调用了DrawCartesianCoordinateSystem
方法来绘制坐标系。Form1_Resize
用于自动刷新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);
本文作者:rick
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!