我需要n个形状(在我的代码中它是“votingParticipants”)在半圆(形状为拱形)的周边上均匀分布。 n可以改变。
以下代码令人满意地适用于13个形状/点。看起来好像它们具有相等的角度,但是当我将其改变为12时,形状不再沿着半圆的周长均匀分布。我还没有尝试其他数量,但需要为任意数量的形状工作。
有谁可以指出我做错了什么?
(另外,如果你正在接受挑战:我真的希望在圆圈的顶部有一个形状,一边可以比另一边更好一个形状)
这是我的代码: 注意:线条形状仅用于显示角度正在做什么
// 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);
}
}
答案 0 :(得分:0)
您对角度的计算是错误的。 正确是
var angle = -Math.PI / (votingParticipants - 1);
这将使用恰好半个圆圈。如果您将for循环更改为:
for (var i = 0; i < votingParticipants; i++)
这个半圆将是一条直线。
否则,如果您想获得与公式相同的结果。只需将角度计算更改为:
var angle = -Math.PI / (votingParticipants + 1)
让for-loop不受影响