【发布时间】:2020-06-18 14:19:33
【问题描述】:
总的来说,我对 C# 和编程非常陌生。我正在尝试计算一条线和一个椭圆的交点。 当椭圆的半径大于 1f 时,代码按预期工作。
当半径(大约)小于 1f 时,“t”返回 NaN。
我手动计算了这些数字,我注意到当半径下降到 1f 以下时,B * B = 30 亿+。
我尝试将“t”变成双精度,并且尝试使用 System.Math 而不是 Mathf。 当半径
非常感谢任何反馈!
public static Vector2 GetEllipseOuterIntersection(Vector2 ellipseCentre, float radius, Vector2 lightDot, Vector2 objectDot) {
lightDot.x -= ellipseCentre.x;
lightDot.y -= ellipseCentre.y;
objectDot.x -= ellipseCentre.x;
objectDot.y -= ellipseCentre.y;
// Get the semiminor axis.
float vertRadius = radius/2;
// Calculate the quadratic parameters.
float A = (objectDot.x - lightDot.x) * (objectDot.x - lightDot.x) / radius / radius + (objectDot.y - lightDot.y) * (objectDot.y - lightDot.y) / vertRadius / vertRadius;
float B = 2 * lightDot.x * (objectDot.x - lightDot.x) / radius / radius + 2 * lightDot.y * (objectDot.y - lightDot.y) / vertRadius / vertRadius;
float C = lightDot.x * lightDot.x / radius / radius + lightDot.y * lightDot.y / vertRadius / vertRadius - 1;
double t = (-B + System.Math.Sqrt(B*B - (4*A*C))) / 2 / A;
print(t);
float x = (float) (lightDot.x + (objectDot.x - lightDot.x) * t + ellipseCentre.x);
float y = (float) (lightDot.y + (objectDot.y - lightDot.y) * t + ellipseCentre.y);
Vector2 outerIntersection = new Vector2(x, y);
return outerIntersection;
}
【问题讨论】:
-
你知道
NaN代表什么吗?如果不是,它表示一个不是数字的值。并尝试将NaN分配给数字类型将导致错误。恕我直言,您可以考虑使用BigInteger。 -
你能设置一个条件断点并回溯为什么你会得到 NaN 吗? msdn 中提到的一种情况是
0/0。这可以单独处理。