我有两个点数组:double[] minus
和 double[] plus
,例如:
double[] minus = new[]
{
24.043414306636713,
26.521399902043807,
23.049167719142361,
24.473177606966754,
18.238281854192408,
};
double[] plus = new[]
{
8.31219054269323,
9.5909890877229582,
11.066525870449567,
22.769068312057193,
24.733540360065991,
};
我需要根据这个数字绘制 2 个图表并确定它们相对于彼此的位置:是否有交叉点,哪个在另一个下面?
我该怎么做?时间差
(请随意重新标记问题或更改主题,我不确定是否使用了正确的数学术语)
编辑:这是一张 Excel 图表:
很容易判断哪个在上面,哪个在下面。
如何确定红色(加号)与蓝色(减号)有交集?也许使用 LINQ?
最佳答案
这段代码可以找到所有的碰撞:
double[] minus = new double[]
{
3, 24, 26, 23, 25, 18, 5, 5, 1, 10,
};
double[] plus = new ![alt text][1]double[]
{
3, 8, 9, 11, 22, 25, 5, 5, 3, 7
};
var collisionsBetweenIndices =
Enumerable.Range(1, minus.Length - 1)
.Where(i => ((minus[i - 1] - plus[i - 1] < 0) && (minus[i] - plus[i] > 0)) ||
((minus[i - 1] - plus[i - 1] > 0) && (minus[i] - plus[i] < 0)) ||
((minus[i - 1] - plus[i - 1] == 0) && (minus[i] - plus[i] == 0)))
.ToArray();
var collisionsOnIndices =
Enumerable.Range(0, minus.Length)
.Where(i => minus[i] == plus[i])
.ToArray();
foreach (var idx in collisionsBetweenIndices)
Console.WriteLine("Collision between {0} and {1}", idx - 1, idx);
foreach (var idx in collisionsOnIndices)
Console.WriteLine("Collision on {0}", idx);
// RESULTS:
// Collision between 4 and 5
// Collision between 6 and 7
// Collision between 8 and 9
// Collision on 0
// Collision on 6
// Collision on 7
编辑:
我做了两种不同的方法来区分碰撞的类型(即索引之间或索引上),但如果您的目的只是检测是否存在碰撞,只需执行以下操作:
var collisionDetected =
Enumerable.Range(0, minus.Length).Any(i =>
{
if (minus[i] == plus[i])
return true;
if (i > 0 &&
(((minus[i - 1] - plus[i - 1] < 0) && (minus[i] - plus[i] > 0)) ||
((minus[i - 1] - plus[i - 1] > 0) && (minus[i] - plus[i] < 0)) ||
((minus[i - 1] - plus[i - 1] == 0) && (minus[i] - plus[i] == 0))))
{
return true;
}
return false;
});
此代码会在发现碰撞后立即返回,因此通常比上述方法更快。
关于c# - 使用 LINQ 确定 2 个图的相对位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4348370/