始终从 3 点弧法返回 CCW 旋转

本文关键字:返回 CCW 旋转 | 更新日期: 2023-09-27 18:33:39

我正在尝试将表格中的 3 个点弧创建到 autocad (R12/lt2( DXF 文件中。问题是该文件似乎总是在 CCW 旋转中保存弧。因此,如果我输入的 pont 数据是 CCW,则下面的方法可以正常工作,但如果旋转是 CW,则弧的角度被"翻转"则不起作用。我似乎无法找到一种方法来检测何时检测到CW弧的数据以纠正错误

该方法计算弧周上有 3 个点(不是起点、中心点和终点(的弧

这是我的方法:

public static List<double> threePointArch(double startX, double startY, double midX, double midY, double endX, double endY)
{
    List<double> returnValues = new List<double>();
    //Calculate center point from 3 points on a circle
    //calculate Line R
    double lineR = (midY - endY) / (midX - endX);
    //Calculate Line T
    double lineT = (startY - midY) / (startX - midX);
    //calculate x Center
    double centerX = ((lineR * lineT * (startY - endY)) + (lineR * (midX + startX)) - (lineT * (endX + midX))) / (2 * (lineR - lineT));
    //calculate y Center by subsitution
    double centerY = ((endY + midY) / 2) + ((centerX - ((endX + midX) / 2)) * (-1 / lineR));
    //Calculate Raduis
    double raduis = Math.Sqrt((startX - centerX) * (startX - centerX) + (startY - centerY) * (startY - centerY));
    //Calculate Start Angle
    double startAngle = Math.Atan2(startY - centerY, startX - centerX) * (180 / Math.PI);
    //Calculate End Angle
    double endtAngle = Math.Atan2(endY - centerY, endX - centerX) * (180 / Math.PI);
    //if (endtAngle < 0)
    //{
    //    endtAngle = endtAngle + 360;
    //}
    returnValues.Add(centerX);
    returnValues.Add(centerY);
    returnValues.Add(raduis);
    returnValues.Add(startAngle);
    returnValues.Add(endtAngle);
    return returnValues;
}

我已经尝试了 3 周,我能想到的每一个修复,我尝试计算中点角度以查看它是否小于端点角度,我尝试查看起点角度是否小于端点角度(有几个变化(这个数学在我的头上!!

编辑:

我在这里找到了一些信息我想出了这个(在返回上方添加(:

  //calculate rotation
  double midAngle = Math.Atan2(midY - centerY, midX - centerX) * (180 / Math.PI);
  if (midAngle - startAngle > +180.0) midAngle -= 360.0;
  if (midAngle - startAngle < -180.0) midAngle += 360.0;
  if (endtAngle - midAngle > +180.0) endtAngle -= 360.0;
  if (endtAngle - midAngle < -180.0) endtAngle += 360.0;
  string dir = "none";
  if (midAngle - startAngle < 0)
      dir = "CW";
  if (midAngle - startAngle > 0)
      dir = "CCW";
  if (midAngle - startAngle == 0)
      dir = "none";
  if (dir == "CW")
  {
      double startAngletmp = startAngle;
      startAngle = endtAngle;
      endtAngle = startAngletmp;
  }

它似乎在大多数情况下都有效,但如果我能得到数学负责人的一些确认,那就太好了

始终从 3 点弧法返回 CCW 旋转

我假设这是 2D 的,所以使用交叉乘积来检测 CW/CCW

p0,p1,p2作为 3D 矢量的弧点,然后(x,y,z=0.0)

v0=p1-p0
v1=p2-p1

是边向量。 现在计算叉积

n=cross(v0,v1)

返回您的弧所在的平面的法向量n 现在只需测试其z坐标的符号:

if (n.z<0.0) CW else CCW

该符号取决于坐标系的配置,因此如果它不起作用,请使用

if (n.z>0.0) CW else CCW

如果(n.z==0.0)那么您就遇到了麻烦,并试图通过将此类实体划分为 2 Arc 来不惜一切代价避免这种情况。

另请参阅特定方向的 3 个点的弧形通孔