我正在寻找一个三角形,我知道三边的长度(一个SSS三角形)。因此,我想确定由3行组成的形状的3个“内”角是否= 180.如果是,则形状必须是三角形。
我正在使用此The Law of Cosines页面上的公式来解决角度问题。 在我的代码中,我执行以下操作:
private bool CalculateIfTriangle(float line1Length, float line2Length, float line3Length)
{
double angle1 = MathHelper.ToDegrees((float)Math.Cos(((line2Length * line2Length) + (line3Length * line3Length) - (line1Length * line1Length)) / (2 * line2Length * line3Length)));
double angle2 = MathHelper.ToDegrees((float)Math.Cos(((line3Length * line3Length) + (line1Length * line1Length) - (line2Length * line2Length)) / (2 * line3Length * line1Length)));
double angle3 = MathHelper.ToDegrees((float)Math.Cos(((line1Length * line1Length) + (line2Length * line2Length) - (line3Length * line3Length)) / (2 * line1Length * line2Length)));
double total = angle1 + angle2 + angle3;
if (total == 180)
return true;
else return false;
}
然而,我没有得到正确答案(即使形状肯定是三角形)。
我正在使用C#(XNA)对我的应用程序进行编码,我不确定我是否正确使用了MathHelper.ToDegrees方法。
答案 0 :(得分:5)
法律
c 2 = a 2 + b 2 - 2abcos(C)
重新排列:
cos(C)=(a 2 + b 2 - c 2 )/ 2ab
C = cos -1 [(a 2 + b 2 - c 2 < / sup>)/ 2ab]
那你为什么要使用Math.Cos而不是Math.Acos?
无论如何,这是你的一个错误,就像其他人所说的那样,你正在使用浮点数,因此由于舍入误差,比较相等是有点击中和错过。
此外,您无需转换回180度degees == pi radians。
此外,您只需比较两侧的长度。在一个真正的三角形中,一边的长度总是短于另一边的长度之和(参见罗林的回答)。我怀疑,你的公式可能会给NaN作为非三角形的答案,因为你最终会尝试取一个不在[-1 .. 1]范围内的数字的cos -1 。即
(a 2 + b 2 - c 2 )/ 2ab&gt; 1或者&lt; -1
事实上,我怀疑上述公式的条件恰好在
时c&lt; = a + b
答案 1 :(得分:3)
要检查三个长度是否可以形成三角形,您只需要检查
A + B > C
A + C > B
B + C > A
(或等于三角形的等式)。
计算由这种三角形形成的角度是不必要的。如果三个长度不形成三角形,我不确定角度是否有意义。
答案 2 :(得分:1)
我看到总数是一个浮点数,你将它与180比较。 因为这通常不是一个好主意,因为浮点数可以有精确的舍入问题。
因此,使用带范围检查的检查,即if ((total > 179.9) && (total < 180.1))
或一般:
accuracy = 0.1;
if ((total > 180.0 - accuracy) && (total < 180.0 + accuracy))
答案 3 :(得分:1)
如果有3条线相交2到2,则不需要使用三角法来确定它们是否形成三角形。通过不使用trig,可以避免比较浮点值的相等性(例如total==180
)。由于您没有指定错误的性质,只是您没有得到正确的答案,并且由于您的代码看起来没问题,这可能是您问题的根源。
Unasked-for advice:为什么还要转换到学位直到你绝对必须?如果你以弧度工作,你可以让事情更简洁(也更容易理解),直到你想以度数呈现结果。
答案 4 :(得分:-1)
所有fp数学都不太可能产生180度。会出现少量错误。