0

n 個の形状 (私のコードでは "votingParticipants") が半円 (アーチの形) の周囲に均等に広がる必要があります。n を変更できる場所。

次のコードは、13 個の形状/点に対して十分に機能します。角度が等しいように見えますが、12 に変更すると、形状は半円の周囲に沿って均等に分布しなくなります。私はまだ他の量を試していませんが、どんな形状でも機能する必要があります.

誰かが私が間違っていることを指摘できますか?

(また、もしあなたが挑戦したいのであれば:私は常に円の一番上に1つの形を持ちたいと思っています。一方の側が他方よりも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);
}
}
4

1 に答える 1

0

角度の計算が間違っています。正しいのは

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

これは正確に半円を使用します。for ループを次のように変更すると、

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

この半円は直線になります。

それ以外の場合は、数式と同じ結果が必要な場合。角度の計算を次のように変更するだけです。

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

そして for ループはそのままにしておきます

于 2013-09-17T08:19:14.520 に答える