我试图在面板中绘制上面的图像。我正在使用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是我似乎得到的最好的。
我该如何添加数字?
答案 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_X
和centre_Y
提供整体偏移量(整个图表的中心)。 Math.Cos
和Math.Sin
与angle
一起使用,为您提供规范化(值介于-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();
}
}
}