gpt4 book ai didi

math - 计算弧在空间中的边界坐标的公式

转载 作者:行者123 更新时间:2023-12-03 21:32:51 24 4
gpt4 key购买 nike

我有 2 条线与已知坐标点相交
- x1,y1
- x2,y2
- x3,y3

由此我计算了线之间给定半径处的弧。所以我现在知道
- 2 个圆弧端点 x4,y4 和 x5,y5
- 圆弧中心点 Cx,Cy
- 圆弧半径 r
- 极坐标中相对于 X 轴的起始角和终止角,因此是线之间的角度。

bounding coordinates of an arc in space

我想创建一个公式来计算弧的最大和最小 X 和 Y 值。 IE。包围弧的框的坐标。

在下面的示例中,我可以找出最小 X 值和最大 Y 值,它们是已知值,但不确定如何计算最大 X 和最小 Y。

在其他情况下,弧可以是任何坐标,因此已知的最小值和最大值会发生变化。

我知道如何以给定的角度或间隔计算沿弧的点,但不知道在特定方向上的最大值和最小值,在这种情况下是 X 和 Y 轴。

我将在编程中使用该公式。

最佳答案

假设我们有起始角 θ1 , 端角 θ2 (均以弧度表示),半径 r , 圆弧方向 逆时针 .我们想找 Xmax , Ymax , Xmin 亚敏 .将此值视为象限 q=f(θ) 的函数:

Xmax=f(q1,q2,r), Ymax=f(q1,q2,r), Xmin=f(q1,q2,r), Ymin=f(q1,q2,r)。

与其编写大量的“if”语句,不如将此函数表示为“极值矩阵”。评估函数 f(q1,q2,r) 我们最终会得到 this matrices .

所以这里是算法:

  • 查找 的象限 ( q1 , q2 ) θ1 θ2 ;
  • 转换 θ1 , θ2 , r 到笛卡尔坐标;
  • 查找不包括极值点的边界框;
  • 构建极值矩阵;
  • 选择 Xmax , Ymax , Xmin , Ymin 根据 q1 q2 从这个矩阵。

  • 这是我的 C#6 实现:
    using System;
    using System.Windows;
    using static System.Math;

    public static class GeomTools
    {
    public static Byte GetQuadrant(this Double angle)
    {
    var trueAngle = angle%(2*PI);
    if (trueAngle >= 0.0 && trueAngle < PI/2.0)
    return 1;
    if (trueAngle >= PI/2.0 && trueAngle < PI)
    return 2;
    if (trueAngle >= PI && trueAngle < PI*3.0/2.0)
    return 3;
    if (trueAngle >= PI*3.0/2.0 && trueAngle < PI*2)
    return 4;
    return 0;
    }
    public static Rect GetBounds(Double startAngle, Double endAngle, Double r)
    {
    var startQuad = startAngle.GetQuadrant() - 1;
    var endQuad = endAngle.GetQuadrant() - 1;

    // Convert to Cartesian coordinates.
    var stPt = new Point(Round(r*Cos(startAngle), 14), Round(r*Sin(startAngle), 14));
    var enPt = new Point(Round(r*Cos(endAngle), 14), Round(r*Sin(endAngle), 14));

    // Find bounding box excluding extremum.
    var minX = stPt.X;
    var minY = stPt.Y;
    var maxX = stPt.X;
    var maxY = stPt.Y;
    if (maxX < enPt.X) maxX = enPt.X;
    if (maxY < enPt.Y) maxY = enPt.Y;
    if (minX > enPt.X) minX = enPt.X;
    if (minY > enPt.Y) minY = enPt.Y;

    // Build extremum matrices.
    var xMax = new[,] {{maxX, r, r, r}, {maxX, maxX, r, r}, {maxX, maxX, maxX, r}, {maxX, maxX, maxX, maxX}};
    var yMax = new[,] {{maxY, maxY, maxY, maxY}, {r, maxY, r, r}, {r, maxY, maxY, r}, {r, maxY, maxY, maxY}};
    var xMin = new[,] {{minX, -r, minX, minX}, {minX, minX, minX, minX}, {-r, -r, minX, -r}, {-r, -r, minX, minX}};
    var yMin = new[,] {{minY, -r, -r, minY}, {minY, minY, -r, minY}, {minY, minY, minY, minY}, {-r, -r, -r, minY}};

    // Select desired values
    var startPt =new Point(xMin[endQuad, startQuad], yMin[endQuad, startQuad]);
    var endPt=new Point(xMax[endQuad, startQuad], yMax[endQuad, startQuad]);
    return new Rect(startPt,endPt);
    }
    }

    圆弧中心点位于 (0,0) 是公平的,但您可以轻松地将生成的边界框移动到您的 Cx,Cy。

    不像 Tim Buegeleisen的近似解决方案 这个解决方案是准确的,尽管它可能会更昂贵的内存。

    关于math - 计算弧在空间中的边界坐标的公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32365479/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com