给出开始,中间和端点的3D弧

时间:2012-07-17 00:19:29

标签: c# wpf

我正在尝试使用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);
    }

1 个答案:

答案 0 :(得分:2)

我认为您必须知道圆的中心才能知道圆弧的起始和终止角度。

假设你只有三个点,并且想要找到一个遍历所有三个点的圆,你基本上有三个带有三个变量的方程:

  

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

     

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

     

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

如果您尝试自己编程并且掌握数学方面的平均知识,那么解决这个问题可能会有点棘手,但您可以使用矩阵相当容易地完成。请阅读here以获取位信息。

在你解决了这三个方程后,你应该有X,Y,R。

X和Y将是圆的中心点,R - 它是半径。

现在,据我记忆,它们从正X轴开始向上计算弧度。因此,您需要计算两条线之间的角度 - 从中​​心到浮点之间延伸的线,以及从中心点延伸到“无限”右侧的线。你可能只是谷歌“计算两行之间的角度”。对你的起点和终点重复这个过程,将给出各自的进入/退出角度。

中间点不再使用了,但是半径是。你只需将它设置为半径就可以了。

我没有真正实施任何东西 - 只是给你一个公平的方向。 (我敢打赌,有一个更清洁,更好用的解决方案)