如何从一点生成一组圆点?

时间:2015-03-12 09:36:17

标签: c# algorithm math unity3d

我处于一种情况,我有一个点Vector3(x,y,z),我需要从那个起点生成一个3D(一个环)的圆圈,从该点开始并以它结束。现在我可以生成一个vector3的圆圈,但我不知道如何使用一个点生成它。 例如,主要点是红色,其他点是黑色点:

3 个答案:

答案 0 :(得分:1)

要定义圆形,无论是在2D还是3D空间中,您需要在圆上放置三个独立的点。

否则,有无数(数学无限)的可能性。

如果你只有一个点,它位于圆圈(顶部,底部,......)的位置?圆的半径是多少?鉴于它是一个3D空间,它的倾向是什么?你无法从单个(x,y,z,)点推导出它。

编辑我在Paint中进行了一个小的可视化。请注意,这是一个2D平面,但同样适用于3D空间(三个点只需要共面,根据定义,任意三个点都是)

编辑2
这类问题可能更好地询问几何或游戏开发(因为我怀疑你正在做的事情)相关的StackExchange网站,因为这个问题实际上是一个几何问题,而不是编码问题。

enter image description here

编辑3
我不打算为你编写代码,因为“请写我的代码”不是StackOverflow的意图。

但是,有一些在线资源可以帮助进行圆圈的代数化处理,你只需要把它放在代码中。

根据this earlier answer on SO,您可以在this reference page上找到与圈子相关的公式的非常详细的说明。寻找“3点(2维)圆的方程式”

编辑4,最终修改
正如您所问,可以根据两个点定义一个圆圈,如果其中一个点是圆圈的中心点
然后可以根据这两个点之间的距离计算圆的半径 从那时起,如果您有中心点和圆半径,则可以计算圆上的任何点。请参阅我上面提到的相同参考链接,因为此页面包含许多从不同数据发送中派生圈子的方法。

编辑5,这次真的是最后的编辑:)

This StackOverflow answer解释了您希望在代码中执行的操作。它假设您知道中心点和半径,您可以如上所述得到它 我希望这是足够的信息来帮助你进一步:)

答案 1 :(得分:0)

下面是一个如何计算给定中心向量和半径的圆点的示例。

这适用于平面,但您可以使用其他旋转矩阵旋转它们。

class Program
{
    static void Main(string[] args)
    {
        int n = 22; //the number of points
        float radius = 22f;
        Vector3 vector = new Vector3(radius, 0, 0); //the vector you keep rotating
        Vector3 center = new Vector3(33,33,33); //center of the circle
        float angle = (float)Math.PI * 2 / (float)n;

        Vector3[] points = new Vector3[n];

        Matrix rotation = Matrix.RotationZ(angle);

        for (int i = 0; i < n; i++)
        {
            points[i] = vector + center;

            vector.TransformNormal(rotation);
        }
    }
}

我为项目使用了托管的directX框架......不确定你使用的是什么

修改

关于轮换和翻译问题的示意图:

Schematic about the rotation and translation problem

答案 2 :(得分:0)

使用GeoDesy和NetTopologySuite的C#。

static Geometry Circle(double lat, double lon, double meters)
{
    GeodeticCalculator geoCalc = new GeodeticCalculator(Ellipsoid.WGS84);
    GlobalCoordinates start = new GlobalCoordinates(new Angle(lat), new Angle(lon));
    int sides = 4;
    int degree_unit = 360 / sides;

    var c = new List<NetTopologySuite.Geometries.Coordinate>();

    for (int i = 0; i < sides; i++)
    {
        GlobalCoordinates dest = geoCalc.CalculateEndingGlobalCoordinates(start, new Angle(degree_unit * i), meters);
        c.Add(new NetTopologySuite.Geometries.Coordinate(dest.Longitude.Degrees, dest.Latitude.Degrees));
    }
    c.Add(c[0]);

    GeometryFactory gc = new GeometryFactory(new PrecisionModel(), 4326);
    var box = gc.CreatePolygon(c.ToArray());
    var mbc = new MinimumBoundingCircle(box);

    return mbc.GetCircle();
}