using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Drawing.Imaging; namespace Draw2 { public partial class Form1: Form { public Form1() { InitializeComponent(); pictureBox1.BackColor = Color.Transparent; //pictureBox2.BackColor = Color.Transparent; //Point point = new Point(100, 140); //pictureBox2.PointToScreen(point); //pictureBox2.PointToClient(point); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen pen = new Pen(Color.Black); //初始半径 int r0 = 20; //圆心 int x0 = 140; int y0 = 140; //圆的宽度和高度 int width = 0; int height = 0; int x = 100; int y = 100; //圆半径的递增数量 int d = 2 * r0; //画圆 for (int i = 0; i < 3; i++) { //计算当前圆的宽度和高度 width = (r0 + d * i) * 2; height = (r0 + d * i) * 2; //计算当前圆的左上角顶点坐标 x = x0 - width / 2; y = y0 - height / 2; //画圆 //g.SmoothingMode = SmoothingMode.AntiAlias; g.DrawEllipse(pen, x, y, width, height); } //画黑弧线 //半径递增的数 int dd = 2 * r0 / 5; for (int j = 0; j < 13; j++) { //计算当前圆的宽度和高度 width = j * dd * 2 + 6 * r0 / 5; height = j * dd * 2 + 6 * r0 / 5; //计算当前圆的左上角顶点坐标 x = x0 - width / 2; y = y0 - height / 2; if (width % r0 != 0) { g.DrawEllipse(pen, x, y, width, height); } } SolidBrush myBrush=new SolidBrush(Color.Transparent); for (int i = 0; i < 13; i++) { Point[] arcPath = CreateArcPath(x0, y0, 2*x0, 2*y0, 3+i*45, (i+1)*45-3); e.Graphics.FillPolygon(myBrush, arcPath); } pen.Color = Color.Blue; for (int i = 0; i < 3; i++) { //计算当前圆的宽度和高度 width = (r0 + d * i) * 2; height = (r0 + d * i) * 2; //计算当前圆的左上角顶点坐标 x = x0 - width / 2; y = y0 - height / 2; //画圆 //g.SmoothingMode = SmoothingMode.AntiAlias; g.DrawEllipse(pen, x, y, width, height); } pen.Color = Color.Black;//黑笔画线 //画中间的十字 g.DrawLine(pen, x0 - r0 / 5, y0, x0 + r0 / 5, y0); g.DrawLine(pen, x0, y0 - r0 / 5, x0, y0 + r0 / 5); //画刻度条 //线条1(以9点处为第一条线段,然后顺时针旋转10点半为第二条) //线条1(以9点处为第一条线段,然后顺时针旋转10点半为第二条) g.DrawLine(pen, (int)(x0 - (5 * r0 + 2 * r0 / 5)), (int)(y0), (int)(x0 - (3 * r0 / 5)), (int)(y0)); //画刻度 for (int i = 0; i < 13; i++) { g.DrawLine(pen, x0 - 5 * r0 - 2 * r0 / 5 + 2 * r0 * i / 5, y0 - r0 / 5, x0 - 5 * r0 - 2 * r0 / 5 + 2 * r0 * i / 5, y0 + r0 / 5); } //线条3 g.DrawLine(pen, (int)(x0), (int)(y0 - (5 * r0 + 2 * r0 / 5)), (int)(x0), (int)(y0 - (3 * r0 / 5))); //画刻度 for (int i = 0; i < 13; i++) { g.DrawLine(pen, y0 - r0 / 5, x0 - 5 * r0 - 2 * r0 / 5 + 2 * r0 * i / 5, y0 + r0 / 5, x0 - 5 * r0 - 2 * r0 / 5 + 2 * r0 * i / 5); } //线条7 g.DrawLine(pen, (int)(x0), (int)(y0 + (5 * r0 + 2 * r0 / 5)), (int)(x0), (int)(y0 + (3 * r0 / 5))); //画刻度 for (int i = 0; i < 13; i++) { g.DrawLine(pen, y0 - r0 / 5, x0 + 3 * r0 / 5 + 2 * r0 * i / 5, y0 + r0 / 5, x0 + 3 * r0 / 5 + 2 * r0 * i / 5); } //线条5 g.DrawLine(pen, (int)(x0 + (3 * r0 / 5)), (int)(y0), (int)(x0 + (5 * r0 + 2 * r0 / 5)), (int)(y0)); //画刻度 for (int i = 0; i < 13; i++) { g.DrawLine(pen, x0 + 3 * r0 / 5 + 2 * r0 * i / 5, y0 - r0 / 5, x0 + 3 * r0 / 5 + 2 * r0 * i / 5, y0 + r0 / 5); } //线条2 double i2 = (double)(x0 - ((5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2)); int r2 = (int)(2 * r0 / 5 * Math.Sqrt(2) / 2); g.DrawLine(pen, (int)(x0 - ((5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2)), (int)(x0 - (5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2), (int)(x0 - (3 * r0 / 5) * Math.Sqrt(2) / 2), (int)(x0 - (3 * r0 / 5) * Math.Sqrt(2) / 2)); //线条6 int i6 = (int)(x0 + (3 * r0 / 5) * Math.Sqrt(2) / 2); g.DrawLine(pen, i6, i6, (int)(x0 + ((5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2)), (int)(x0 + ((5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2))); //线条4 int i4x1 = (int)(x0 + ((5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2)); int i4y1 = (int)(x0 - ((5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2)); int i4x2 = (int)(x0 + (3 * r0 / 5) * Math.Sqrt(2) / 2); int i4y2 = (int)(x0 - (3 * r0 / 5) * Math.Sqrt(2) / 2); g.DrawLine(pen, i4x1, i4y1, i4x2, i4y2); //线条8 int i8x1 = (int)(x0 - (3 * r0 / 5) * Math.Sqrt(2) / 2); int i8y1 = (int)(x0 + (3 * r0 / 5) * Math.Sqrt(2) / 2); int i8x2 = (int)(x0 - ((5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2)); int i8y2 = (int)(x0 + ((5 * r0 + 2 * r0 / 5) * Math.Sqrt(2) / 2)); g.DrawLine(pen, i8x1, i8y1, i8x2, i8y2); } #region 建立弧形路径的基本方法 /// <summary> /// 绘制弧形//用背景色覆盖圆形得到弧线 /// </summary> /// <param name="x">弧形的圆心X</param> /// <param name="y">弧形的圆心Y</param> /// <param name="width">弧形所在圆外接矩形的宽度</param> /// <param name="height">弧形所在圆外接矩形的高度</param> /// <param name="startAngle">起始角度</param> /// <param name="sweepAngle">结束角度</param> public static Point[] CreateArcPath(int x, int y, int width, int height, Single startAngle, Single sweepAngle) { Single[] xAngle = new Single[12];//这里的数组的大小实际上决定了建立的弧形的平滑度 Single[] yAngle = new Single[12]; Point[] anglePoints = new Point[12]; Single angle = startAngle; Single angleIncrement = (sweepAngle - startAngle) / 10; for (int i = 0; i < 11; i++) { xAngle[i] = (float)(x + (Math.Cos(angle * (Math.PI / 180)) * (width / 2))); yAngle[i] = (float)(y + (Math.Sin(angle * (Math.PI / 180)) * (height / 2))); angle += angleIncrement; } xAngle[11] = (float)(x + (Math.Cos(sweepAngle * (Math.PI / 180)) * (width / 2))); yAngle[11] = (float)(y + (Math.Sin(sweepAngle * (Math.PI / 180)) * (height / 2))); anglePoints[0] = new Point(x, y); for (int i = 0; i < 11; i++) { anglePoints[i + 1] = new Point((int)xAngle[i], (int)yAngle[i]); } return anglePoints; } #endregion } }