作业帮 > 综合 > 作业

用C# 在面板上画以下图形.要求全代码计算

来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/07/30 16:58:28
用C# 在面板上画以下图形.要求全代码计算
要求用C#代码画出以下图形,外圆和内圆都是正圆,内圆大小相等,已知外圆直径和内圆的个数,要计算出内圆的直径和每个内圆的坐标.
用C# 在面板上画以下图形.要求全代码计算
上面兄台是把坐标算出来画,我的是画了再算,差不多,他的题目要求坐标的时候比我的好,但是如果不求坐标,用坐标系旋转更好,因为那样没有矩形位置计算,粘贴运行不了,在构造里面加this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);因为这句是vs事件添加的时候  后台自己 加上的 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }
        /// <summary>
        /// 外圆半径
        /// </summary>
        private float radius = 0;
        /// <summary>
        /// 内圆数量
        /// </summary>
        private uint circlesCount = 0;
        /// <summary>
        /// 重写了paint响应
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (radius > 0 && circlesCount > 0)
            {
                Graphics g = e.Graphics;
                Pen pen = new Pen(Color.Black);
                g.DrawEllipse(pen, 0, 0, radius * 2, radius * 2);
                //获得小圆半径  r=R*sin(a/2)/[1+sin(a/2)] a为角度360.0f / circlesCount
                //这个我不会算,百度出来的,一个扇形内最大圆半径
                //而且函数要的是弧度,不是角度,还需要转换 弧度 = 角度 * PI / 180
                float angle = 360.0f / circlesCount;
                double radian = angle / 2 * Math.PI / 180f;
                float innerRadius = (float)(radius * (Math.Sin(radian) / (1 + Math.Sin(radian))));
                //内圆直径
                float innerDiameter = innerRadius * 2;

                PointF[] centers = new PointF[circlesCount];
                //把坐标系原点放在外圆圆心
                g.TranslateTransform(radius, radius);

                //这里完全是为了你要的求坐标,否则没这么复杂的转换坐标点
                for (int i = 0; i < circlesCount; i++)
                {
                    //在当前坐标系最底部画一个圆
                    g.DrawEllipse(pen, 0 - innerRadius, radius - innerDiameter, innerDiameter, innerDiameter);

                    //这个圆当前坐标系的圆心
                    PointF[] center = { new PointF(0, radius - innerRadius) };
                    //转换坐标点
                    g.Transform.TransformPoints(center);
                    centers[i] = center[0];
                    //把坐标系偏转对应角度
                    g.RotateTransform(angle);

                }

                //刚好转弯以后坐标系又成正常正北,正东 坐标系,
                //横纵坐标轴
                pen.Color = Color.Blue;
                g.DrawLine(pen, new PointF(0, -radius), new PointF(0, radius + 50));
                g.DrawLine(pen, new PointF(-radius, 0), new PointF(radius + 50, 0));

                //这样再转换一次坐标系就能得到正常0,0为圆心的坐标
                g.ResetTransform();
                g.TranslateTransform(-radius, -radius);
                g.Transform.TransformPoints(centers);

                g.ResetTransform();
                String s = "";
                for (int i = 0; i < circlesCount; i++)
                {
                    s += String.Format("第{0}个坐标是:{1},{2}\r\n", i + 1, centers[i].X, centers[i].Y);

                }
                g.DrawString(s, new Font("宋体", 10), Brushes.Red, new Point((int)radius + 10, (int)radius * 2 + 10));
            }

        }

        private void btnDraw_Click(object sender, EventArgs e)
        {
            radius = float.Parse(radiusTextbox.Text);
            circlesCount = uint.Parse(circlesCountTextBox.Text);
            this.Invalidate();
        }
    }