如果满足条件,则合并列表中的点

时间:2019-06-26 13:11:03

标签: c# linq

我有一个列表,该列表存储来自三角形(x1,y1),(x2,y2),(x3,y3)的点。 这些三角形中的一些像矩形一样存储,这意味着它们的一些点是相等的。 我需要迭代列表并合并行,以便它们返回矩形点的新列表。

当三角形具有与另一个三角形完全相同的两个点时,矩形便会成形。

我已经尝试了分组。

我需要一个新的四点矩形对象。与三角形中的四个点。 我确定列表中有相交的三角形。

RxReactiveFormsModule

我的结果应该是带有(x1,y1)...(x4,y4)的新Rectangle Object。 其中两个点应该是给定三角形的相交点。

需要做什么。 用一个对象遍历列表。 查找三角形是否与两个点匹配。 如果有两个匹配点,则返回具有合并三角形(如矩形)的新对象。

不考虑极端情况。

如果对三角形的思考令人困惑。这样思考问题。 如果列表中的一个对象在列表中的两个点等于列表中的另一个对象,则将两个对象合并到一个新的对象Rectangle中,并合并两个点和两个三角形中剩余的两个点。

2 个答案:

答案 0 :(得分:1)

这里是一种方法:

class Point
{
    public double x { get; set; }
    public double y { get; set; }

    public Point(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public override bool Equals(object obj) => obj is Point other && x == other.x && y == other.y;

    public override int GetHashCode() => x.GetHashCode() ^ y.GetHashCode();
}

class Triangle {
    public double x1 {get; set;}
    public double x2 {get; set;}
    public double x3 {get; set;}
    public double y1 {get; set;}
    public double y2 {get; set;}
    public double y3 {get; set;}    

    protected virtual IEnumerable<Point> Points => new []{
         new Point(x1, y1),
         new Point(x2, y2),
         new Point(x3, y3),
    };

    public Point HasTwoMatchingPoints(Triangle other){
        var notMatchingPoints = Points.Except(other.Points);

        return notMatchingPoints.Count() == 1
            ? notMatchingPoints.First() // it means another 2 points are identical
            : null;
    }
}

class Rectangle : Triangle
{
    public Rectangle(Triangle triangle, Point point)
    {
        x1 = triangle.x1;
        x2 = triangle.x2;
        x3 = triangle.x3;
        x4 = point.x;
        y1 = triangle.y1;
        y2 = triangle.y2;
        y3 = triangle.y3;
        y4 = point.y;
    }

    public double x4 { get; set; }
    public double y4 { get; set; }
}

用法:

var list = new List<Triangle>();
// populate your list of triangles somehow, e.g. using JsonConvert    
var result = new List<Rectangle>();

for(int i = 0; i < list.Count - 1; i++){
    for(int j = i + 1; j < list.Count; j++){
        var point = list[i].HasTwoMatchingPoints(list[j]);
        if(point != null) {
            // create a rectangle from the triangle and the 4th point
            var rect = new Rectangle(list[j], point);
            result.Add(rect);
        }
    }
}

处理数据的示例: https://dotnetfiddle.net/u61s36

答案 1 :(得分:0)

下面的代码会在您的三角形中加载并找到具有单个共享边的一对三角形(joinTriangles变量)

从这些成对的三角形中,您可以构建矩形(四边形)。

var json = File.ReadAllText(@".\Triangles.json");
var triangles = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<Triangle>>(json).ToArray();

var joinedTriangles = new List<Tuple<Triangle, Triangle>>();

for (var i = 0; i < triangles.Length; i++)
{
    for (var j = i + 1; j < triangles.Length; j++)
    {
        if (HaveSharedSide(triangles[i], triangles[j]))
        {
            joinedTriangles.Add(new Tuple<Triangle, Triangle>(triangles[i], triangles[j]));
        }
    }
}

private static bool HaveSharedSide(Triangle triangle1, Triangle triangle2)
{
    int numberOfMatchingPoints = 0;

    if (triangle1.x1 == triangle2.x1 && triangle1.y1 == triangle2.y1)
    {
        numberOfMatchingPoints++;
    }

    if (triangle1.x1 == triangle2.x2 && triangle1.y1 == triangle2.y2)
    {
        numberOfMatchingPoints++;
    }

    if (triangle1.x1 == triangle2.x3 && triangle1.y1 == triangle2.y3)
    {
        numberOfMatchingPoints++;
    }

    if (triangle1.x2 == triangle2.x1 && triangle1.y2 == triangle2.y1)
    {
        numberOfMatchingPoints++;
    }

    if (triangle1.x2 == triangle2.x2 && triangle1.y2 == triangle2.y2)
    {
        numberOfMatchingPoints++;
    }

    if (triangle1.x2 == triangle2.x3 && triangle1.y2 == triangle2.y3)
    {
        numberOfMatchingPoints++;
    }

    if (triangle1.x3 == triangle2.x1 && triangle1.y3 == triangle2.y1)
    {
        numberOfMatchingPoints++;
    }

    if (triangle1.x3 == triangle2.x2 && triangle1.y3 == triangle2.y2)
    {
        numberOfMatchingPoints++;
    }

    if (triangle1.x3 == triangle2.x3 && triangle1.y3 == triangle2.y3)
    {
        numberOfMatchingPoints++;
    }

    var haveSharedSide = numberOfMatchingPoints == 2;

    return haveSharedSide;
}