0

Helix 3D ツールキットを使用してユーザー定義の円弧を作成しようとしています。ユーザーが円弧上の 3 点 (始点、中間点、終点) を選択すると、プログラムは円の中心を見つけ、始点から終点まで円弧を描きます。私の問題は、数学が苦手で、これを機能させるのに問題があることです。私の主な問題は、開始角度と終了角度を取得し、すべてのサイズの円弧を正確に描画することです。どんな助けでも大歓迎です。これが私のコードです:

private void Draw_Arc(object sender, MouseButtonEventArgs e)
    {
            linept = new List<Point3D>();
            linept.Add(startPoint);
            linept.Add(endPoint);
            linept.Add((Point3D)GetPoints(e));
            LinesVisual3D line = new LinesVisual3D();
            line.Thickness = 2;
            line.Color = Colors.Blue;
            line.Points = linept;
            port.Children.Add(line);

            double startAngle, sweepAngle;
            Point3D center = GetCenterOfArc(linept.ElementAt(0), linept.ElementAt(1), linept.ElementAt(2));
            GetAngles(linept.ElementAt(0), linept.ElementAt(1), linept.ElementAt(2), out startAngle, out sweepAngle);
            circle = new PieSliceVisual3D();
            double RadiusX = Math.Abs(startPoint.X - center.X);
            double RadiusY = Math.Abs(startPoint.Y - center.Y);
            circle.Center = center;
            if (RadiusX >= RadiusY)
                circle.OuterRadius = RadiusX;
            else
                circle.OuterRadius = RadiusY;
            circle.InnerRadius = circle.OuterRadius + 3;
            circle.StartAngle = (180 / Math.PI * Math.Atan2(startPoint.Y - circle.Center.Y, startPoint.X - circle.Center.X));
            circle.EndAngle = (180 / Math.PI * Math.Atan2(linept.ElementAt(2).Y - circle.Center.Y, linept.ElementAt(2).X - circle.Center.X));
            port.Children.Add(circle);
    }
4

1 に答える 1

2

円弧の開始角度と終了角度を知るには、円の中心を知る必要があると思います。

3 つの点だけがあり、3 つすべてを通る円を見つけたいとします。基本的に、3 つの変数を持つ 3 つの方程式があります。

(x-x0)^2 + (y-y0)^2 = R^2

(x-x1)^2 + (y-y1)^2 = R^2

(x-x2)^2 + (y-y2)^2 = R^2

それを自分でプログラムしようとして、平均的な数学の知識がある場合、それを解くのは少し難しいかもしれませんが、行列を使用するとかなり簡単に解くことができます。ここで少し情報を読んでください。

3 つの方程式を解くと、X、Y、R が得られます。

X と Y は円の中心点、R は半径です。

今、私が覚えている限りでは、正の X 軸から上に向かって円弧の角度を数えます。したがって、2 つの線の間の角度を計算する必要があります。つまり、中心から浮動小数点まで伸びる線と、中心点から「無限」の右に伸びる線です。Google で「2 つの線の間の角度を計算」するだけでかまいません。始点と終点の両方でこのプロセスを繰り返すと、それぞれの出入り角度が得られます。

中間点は実際には使用されなくなりましたが、半径は使用されます。それを半径に設定するだけで、準備完了です。

私は実際には何も実装していません - 公正な方向性を示しているだけです。(そして、もっとクリーンで使いやすいソリューションがあると思います)

于 2012-07-17T00:51:55.517 に答える