尝试为半圆获得相等的角度

本文关键字:半圆 | 更新日期: 2023-09-27 18:31:29

我需要n个形状(在我的代码中是"votetingParticipants")均匀地分布在半圆(形状为拱形)的周长上。n 可以改变的地方。

以下代码适用于 13 个形状/点。看起来它们的角度相等,但是当我将其更改为 12 时,形状不再沿半圆的周长均匀分布。我还没有尝试过其他数量,但它需要适用于任意数量的形状。

谁能指出我做错了什么?

(另外,如果您愿意接受挑战:我真的很想让 1 个形状始终位于圆圈的顶部,一侧比另一侧多一种形状是可以的)

这是我的代码:注意:线条形状仅用于视觉显示角度

的作用
// test method with shapes
private void SetupShapes()
{         
var voteResultsParentVisual = VoteResultsCanvas.GetVisualParent<RadSplitContainer>();
var votingParticipants = 13;
var controlWidth = (voteResultsParentVisual.ActualWidth * .80) / votingParticipants;
var controlHeight = controlWidth * 1.2;
var radius = Math.Min(voteResultsParentVisual.ActualHeight, voteResultsParentVisual.ActualWidth/2); 
var angle = (double)votingParticipants * (Math.PI / -180.0f);
var center = new Point
{
    X = voteResultsParentVisual.ActualWidth / 2,
    Y = voteResultsParentVisual.ActualHeight / 2
};
for (var i = 1; i < votingParticipants+1; i++)
{
    var rec = new Rectangle { Width = controlWidth, Height = controlHeight, Fill = Brushes.Red };
    var x = (center.X + Math.Cos(angle * i)*radius) - (double)controlWidth / 2;
    var y = (center.Y + Math.Sin(angle * i) * radius) - (double)controlHeight / 2;
    var line = new Line
    {
        Stroke = Brushes.LightSeaGreen,
        X1 = center.X,
        Y1 = center.Y,
        X2 = x,
        Y2 = y,
        StrokeThickness = 1
    };
    Canvas.SetLeft(rec, x);
    Canvas.SetTop(rec, y);
    VoteResultsCanvas.Children.Add(rec);
    VoteResultsCanvas.Children.Add(line);
}
}

尝试为半圆获得相等的角度

你对角度的计算是错误的。正确的是

var angle = -Math.PI / (votingParticipants - 1);

这将使用正好半圆。如果您将 for 循环更改为:

for (var i = 0; i < votingParticipants; i++)

这个半圆将在一条直线上。

否则,如果您希望获得与公式相同的结果。只需将角度计算更改为:

var angle = -Math.PI / (votingParticipants + 1)

让 for 循环保持不变