c# - 使用 LINQ 确定 2 个图的相对位置

标签 c# linq math .net-3.5 diagram

我有两个点数组:double[] minusdouble[] 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 图表:

http://i.stack.imgur.com/NEhcs.png

很容易判断哪个在上面,哪个在下面。

如何确定红色(加号)与蓝色(减号)有交集?也许使用 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

alt text

编辑:

我做了两种不同的方法来区分碰撞的类型(即索引之间或索引上),但如果您的目的只是检测是否存在碰撞,只需执行以下操作:

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/

相关文章:

python - 3D 中点和圆弧之间的距离

math - 计算 x mod y,其中 y 不能表示为 float

c# - 以正确格式将 Ajax 数据转换为 FLOT 图表?

c# - 我可以在构造函数运行之前使用对象初始化语法为属性赋值吗?

c# - 用于多级查询的动态 Linq 表达式

c# - 根据匹配的列表返回包含列表的对象

c# - 有什么方法可以在 Sql Profiler 或类似工具中获取 .net 堆栈跟踪?

c# - 如何从 Outlook 2010 插件中以编程方式显示对话框(回复/转发/等)

c# - 按表达式树进行多列分组

algorithm - 按位整数立方根算法