Имея r
в качестве радиуса круга с центром (0,0)
в декартовой системе координат, мы можем вычислить координату окружности на основе угла:
x = r * cos(degree)
и y = r * sin(degree)
В методах C # Sin
и Cos
примите радианы, поэтому мы должны преобразовать градусы в радианы, используя следующую формулу.
radians = Math.PI * degree / 180.0
Следующим шагом является преобразование значений декартовой системы координат в значения координат формы:
panel.X = x + center.X - panel.Width/2
panel.Y = center.Y - y - panel.Height/2
Следующим шагом является вычисление углов.Вы можете установить углы вручную или вычислить их, установив угол в качестве начального угла (например, 90) и добавив значение (например, 40, 360 / количество) в качестве шага к углам.
Пример
public partial class Form1 : Form {
Rectangle circle;
List<Panel> panels;
List<int> angles;
public Form1() {
InitializeComponent();
ResizeRedraw = true;
angles = Enumerable.Range(0, 9).Select(x => 90 + x * 40).ToList();
panels = Enumerable.Range(0, 9).Select(x => new Panel() {
Size = new Size(100, 40),
BackColor = Color.LightSkyBlue
}).ToList();
this.Controls.AddRange(panels.ToArray());
}
protected override void OnLayout(LayoutEventArgs levent) {
base.OnLayout(levent);
int padding = 50;
int radius = Math.Min(ClientSize.Width, ClientSize.Height) / 2 - padding;
Point center = new Point(ClientSize.Width / 2, ClientSize.Height / 2);
circle = new Rectangle(center.X - radius, center.Y - radius,
2 * radius, 2 * radius);
for (int i = 0; i < 9; i++) {
var x = (int)(radius * Math.Cos(Math.PI * angles[i] / 180.0)) + center.X;
var y = center.Y - (int)(radius * Math.Sin(Math.PI * angles[i] / 180.0));
panels[i].Left = x - (panels[i].Width / 2);
panels[i].Top = y - (panels[i].Height / 2);
}
}
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawEllipse(Pens.Red, circle);
}
}