查找n元组的最小值和最大值?

时间:2018-11-27 22:14:50

标签: c# f#

我有一个表示x-y坐标的元组。然后,这些元组用于定义两个盒子的大小,如此处here所示。然后,我想围绕这两个框创建一个边界框,然后有两个点。一个用于左下,一个用于右上。机器人右点的x坐标为min(p1.x,p3.x),y坐标为min(p1.y,p3.y)。如果我没有记错的话,右上角的点将为x = max(p2.x,p4.x),y = max(p2.y,p4.y)。

我必须要解决的主要问题是找到一种获取n元组的最小值和最大值的方法,并以一种相当漂亮的方式为外边界框导出这两个新点。

2 个答案:

答案 0 :(得分:1)

如果不对上下文有更多了解并且看不到到目前为止的任何示例代码,就很难给出有用的答案。但是,您的四个点大概是四个元组:

let p1 = (0, 5)
let p2 = (10, 15)
let p3 = (5, 0)
let p4 = (15, 10)

现在,如果您只想获得最小的X和Y值,则可以创建所有点的列表并使用minBy

let ps = [p1; p2; p3; p4] 
let minX = ps |> List.minBy fst
let minY = ps |> List.minBy snd

答案 1 :(得分:1)

在类似于@TomasPetricek的答案中,您可以在C#中使用LINQ:

var p1 = (0, 5);
var p2 = (10, 15);
var p3 = (5, 0);
var p4 = (15, 10);

var ps = new[] { p1, p2, p3, p4 };

var minX = ps.Select(p => p.Item1).Min();
var minY = ps.Select(p => p.Item2).Min();

滥用LINQ Aggregate方法,您可以立即计算答案:

var ps = new[] { p2, p3, p4 };

var ans = ps.Aggregate((p1, p1), (rect, p) => ((Math.Min(rect.Item1.Item1,p.Item1),Math.Min(rect.Item1.Item2,p.Item2)),
                                               (Math.Max(rect.Item2.Item1,p.Item1),Math.Max(rect.Item2.Item2,p.Item2))));