C#在面板

时间:2018-03-27 21:47:47

标签: c# geometry

A spoked circle with 8 smaller numbered circles along its edge

我试图在面板中绘制上面的图像。我正在使用C#。 我希望用户能够输入他们想要的较小圈数。 现在它有1-8但用户可以添加更多像 1-20或只做1-4。 这是我的代码: 更新2 !!!

 const double Deg2Rad = Math.PI / 180d;
        const int circle_count = 20;

        int cubePanelSize = Math.Min(this.Cube_Panel.Width, this.Cube_Panel.Height);

        int innerSize = cubePanelSize / 3;
        int outerSize = cubePanelSize / 10;

        int centre_X = this.Cube_Panel.Width / 2 ;
        int centre_Y = this.Cube_Panel.Height / 2;

        float centre_X2 = this.Cube_Panel.Width / 2F - 10F;
        float centre_Y2 = this.Cube_Panel.Height / 2F - 10F; 
        float outerSize_x = 4F;
        float outerSize_y = 4F;

        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        Pen p1 = new Pen(Color.Black, 1);
        double step = 360d / circle_count;

        for (double angle = 0; angle < 360d; angle += step)
        {
            int X = (int)(centre_X + Math.Cos(angle * Deg2Rad) * innerSize);
            int Y = (int)(centre_Y + Math.Sin(angle * Deg2Rad) * innerSize);

            e.Graphics.FillEllipse(Brushes.Green, new Rectangle(X - (outerSize / 2), Y - (outerSize / 2), outerSize / 2, outerSize / 2));
            e.Graphics.DrawLine(p1, centre_X2, centre_Y2, X - (outerSize / outerSize_x) , Y - (outerSize / outerSize_y) );
        }

        Graphics l = e.Graphics;
        Pen p = new Pen(Color.Gray, 5);
        int temp1 = centre_X - (innerSize + -20);
        int temp2 = centre_Y - (innerSize + -20);
        int temp3 = Convert.ToInt16(innerSize * 1.55);
        int temp4 = Convert.ToInt16(innerSize * 1.55);
        l.DrawEllipse(p,temp1 , temp2, temp3 , temp4);
        l.Dispose();

This is how C# is drawing the picture

它好多了,但还是有些...... 线应停在内圈内 ,我一直试图让它工作,但那 pic是我似乎得到的最好的。

我该如何添加数字?

1 个答案:

答案 0 :(得分:0)

不知道这对你有帮助。我玩了一下你的代码。我不确定Cube_Panel是什么,所以我只是将它替换为(这个。),这是我正在测试的形式。还有一些其他变化,但希望它们不会太激烈。

我不完全确定你在尝试用Math.Sin和Math.Cos做什么,但提供固定的180度可能无济于事。您需要计算出需要计算的圆周围的角度。请记住,Math.Sin和Math.Cos的角度是弧度而不是度(180弧度= ~10313.2度)。

我没有使用圆圈计数循环,而是使用了我希望绘制圆圈的角度。使用预先计算的角度步长递增。这有意义吗?

编辑:我已经在表单中添加了一个停靠的Cube_Panel面板控件,让它处理绘画。我还更改了代码,以便它适应Cube_Panel的大小(如果调整Form的大小,它应该会改变)。

EDIT2:嗯。我在之前的代码中犯了一些错误。它碰巧工作,但仍有问题。我已经更新了我的代码,希望你能理解我正在做的事情,并且能够适应你的代码。

你会注意到我改变了一些变量的名称。这是为了更好地(希望)了解他们实际在做什么。

所以,对于这些行......我会提请你注意这段代码:

int dotCentreX = (int)(centre_X + Math.Cos(angle * Deg2Rad) * outerEllipseRadius);
int dotCentreY = (int)(centre_Y + Math.Sin(angle * Deg2Rad) * outerEllipseRadius);

我们正在做的是计算外点的中心点。 centre_Xcentre_Y提供整体偏移量(整个图表的中心)。 Math.CosMath.Sinangle一起使用,为您提供规范化(值介于-1和1之间)的圆圈。然后我将其乘以outerEllipseRadius,将圆圈的大小扩展到我们想要的位置。

对于这些行,我们不希望一直走到outerEllipseRadius。我们想要停在内半径(innerEllipseRadius)。所以我们计算这些点的位置:

int lineEndX = (int)(centre_X + Math.Cos(angle * Deg2Rad) * innerEllipseRadius);
int lineEndY = (int)(centre_Y + Math.Sin(angle * Deg2Rad) * innerEllipseRadius);

然后我们可以从中心绘制线到那一点。

对于数字,您需要以点的偏移量绘制文本。你有点的中心,你知道它有多大。所以你只需要计算 dotCentreX + (whateverOffsetWorksForYouX)dotCentreY + (whateverOffsetWorksForYouY)

希望有所帮助。

namespace WindowsFormsApp1
{
    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Cube_Panel.Paint += Cube_Panel_Paint;
            this.Cube_Panel.Resize += (s, e) => { this.Cube_Panel.Refresh(); };
        }

        private void Cube_Panel_Paint(object sender, PaintEventArgs e)
        {
            const double Deg2Rad = Math.PI / 180d;
            const int circle_count = 9;

            int cubePanelSize = Math.Min(Cube_Panel.Width, Cube_Panel.Height);

            int innerEllipseRadius = cubePanelSize / 4;
            int outerEllipseRadius = cubePanelSize / 3;
            int outerDotDiameter = cubePanelSize / 14;

            int centre_X = Cube_Panel.Width / 2;
            int centre_Y = Cube_Panel.Height / 2;

            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            Pen p1 = new Pen(Color.Black, 1);

            double step = 360d / circle_count;

            for (double angle = 0; angle < 360d; angle += step)
            {
                int dotCentreX = (int)(centre_X + Math.Cos(angle * Deg2Rad) * outerEllipseRadius);
                int dotCentreY = (int)(centre_Y + Math.Sin(angle * Deg2Rad) * outerEllipseRadius);

                e.Graphics.FillEllipse(Brushes.Green, new Rectangle(dotCentreX - (outerDotDiameter / 2), dotCentreY - (outerDotDiameter / 2), outerDotDiameter, outerDotDiameter));

                int lineEndX = (int)(centre_X + Math.Cos(angle * Deg2Rad) * innerEllipseRadius);
                int lineEndY = (int)(centre_Y + Math.Sin(angle * Deg2Rad) * innerEllipseRadius);

                e.Graphics.DrawLine(p1, centre_X, centre_Y, lineEndX, lineEndY);
            }

            Graphics l = e.Graphics;
            Pen p = new Pen(Color.Gray, 5);
            l.DrawEllipse(p, centre_X - innerEllipseRadius, centre_Y - innerEllipseRadius, innerEllipseRadius * 2, innerEllipseRadius * 2);
            l.Dispose();
        }
    }
}