【问题标题】:How to generate from one point a set of circle points?如何从一个点生成一组圆点?
【发布时间】:2015-05-14 09:28:21
【问题描述】:

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

【问题讨论】:

标签: c# algorithm math unity3d


【解决方案1】:

使用 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();
}

【讨论】:

    【解决方案2】:

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

    这是一个平面,但你可以使用另一个旋转矩阵来旋转它们。

    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 框架...不确定你使用的是什么

    编辑

    关于旋转和平移问题的示意图:

    【讨论】:

    • Servus :),我已经更新了我的代码,但它仍然无法正常工作。圆圈偏离中心很多。我正在使用统一。
    • @ahmedragia ???您需要做的就是计算从起点到平面的中心和旋转...从中创建一个矩阵并执行 points[i] = (vector + center).TransformNormal(theRotationMatrix) 并且您应该在那里跨度>
    • 我已经更新了图片,我有一个应该是中心的立方体,以及一个应该是圆上一个点的相机对象。我已经完成了你的计算,但这就是我得到的结果。这很奇怪
    • @ahmedragia err: points[i] = vector.TransformNormal(TheRotationMatrix) + center... 先旋转再平移
    • 那是我的错误!先旋转后平移
    【解决方案3】:

    要定义一个圆,无论是在 2D 空间还是 3D 空间中,您都需要位于圆上的三个独立点。

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

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

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

    编辑 2
    这类问题最好在与 StackExchange 网站相关的几何或游戏开发(我怀疑这就是您正在做的事情)上提出,因为该问题实际上是几何问题,而不是编码问题。

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

    但是,网上有一些资源可以帮助你对圆进行代数推导,你只需要把它写成代码。

    根据this earlier answer on SO,你可以在this reference page上找到非常详细的圆相关公式的解释。查找“3 点(2 维)圆的方程”

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

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

    This StackOverflow answer 解释了你想用代码做什么。它假设您知道中心点和半径,您可以按照我上面提到的方式推导出。
    我希望这是足够的信息来帮助你进一步:)

    【讨论】:

    • 半径是恒定的,我可以修改,并且只能在XZ平面内
    • 是否可以如果我还有一个点,那应该是除了给定点(红点)之外的生成圆的中心
    • 你需要三分。我刚刚在Paint中做了一个小demo来解释一下,现在上传...
    • 本网站不适用于“请编写我的代码”类型的问题。我现在将使用有用的链接更新我的问题,这将有助于设置圆的推导,请稍等。
    • 我的意思是假设在绿色圆圈中。我有一个点和中心,我可以从那个开始吗?
    猜你喜欢
    • 2011-08-15
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多