我正在尝试从表中创建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个星期,我能想到的每一个修复,我尝试计算中点角度,看它是否小于终点角度,我试着看看起点角度是否小于终点角度(有几个变化)这个数学是我的头脑!!
修改
我找到了一些信息Here 我想出了这个(在回报之上添加):
//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;
}
它似乎在很大程度上起作用,但如果我能得到数学主管的确认,那就太棒了
答案 0 :(得分:0)
我认为这是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个弧来不惜一切代价避免这种情况。