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

C# 如果满足条件,则合并列表中的点,c#,linq,C#,Linq,我有一个存储三角形(x1,y1),(x2,y2),(x3,y3)点的列表。 其中一些三角形存储为矩形,这意味着它们的一些点是相等的。 我需要迭代我的列表并合并行,以便它们返回矩形点的新列表 当一个三角形有两个与另一个三角形正好相等的点时,就会形成矩形 我已经试过分组了 我需要一个新的四点矩形对象。用三角形中的四个点。 我确信我的列表中有相交的三角形 [ { "y1": 12812.2936, "y2": 17665.7353, "y3": 17665.7353,

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

当一个三角形有两个与另一个三角形正好相等的点时,就会形成矩形

我已经试过分组了

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

 [
  {
    "y1": 12812.2936,
    "y2": 17665.7353,
    "y3": 17665.7353,
    "x1": 15316.4846,
    "x2": 15316.4846,
    "x3": 20137.1603
  },
  {
    "y1": 12812.2936,
    "y2": 12812.2936,
    "y3": 17665.7353,
    "x1": 15316.4846,
    "x2": 20137.1603,
    "x3": 20137.1603
  },
  {
    "y1": 26151.1303,
    "y2": 12812.2936,
    "y3": 12812.2936,
    "x1": 853.6957,
    "x2": 853.6957,
    "x3": 9352.5527
  },
  {
    "y1": 26151.1303,
    "y2": 26151.1303,
    "y3": 24752.8575,
    "x1": 853.6957,
    "x2": 2241.3005,
    "x3": 2241.3005
  },
  {
    "y1": 26151.1303,
    "y2": 24752.8575,
    "y3": 12812.2936,
    "x1": 853.6957,
    "x2": 2241.3005,
    "x3": 9352.5527
  },
  {
    "y1": 24752.8575,
    "y2": 24752.8575,
    "y3": 12812.2936,
    "x1": 2241.3005,
    "x2": 9352.5527,
    "x3": 9352.5527
  },
  {
    "y1": 45117.4663,
    "y2": 45117.4663,
    "y3": 49080.3743,
    "x1": 1295.4000,
    "x2": 4089.4000,
    "x3": 4089.4000
  },
  {
    "y1": 45117.4663,
    "y2": 49080.3743,
    "y3": 49080.3743,
    "x1": 1295.4000,
    "x2": 1295.4000,
    "x3": 4089.4000
  },
  {
    "y1": 21158.2000,
    "y2": 28952.8000,
    "y3": 28952.8000,
    "x1": 12830.2000,
    "x2": 12830.2000,
    "x3": 15884.5000
  },
  {
    "y1": 21158.2000,
    "y2": 21158.2000,
    "y3": 28952.8000,
    "x1": 12830.2000,
    "x2": 15884.5000,
    "x3": 15884.5000
  },
  {
    "y1": 57012.5000,
    "y2": 57012.5000,
    "y3": 57774.5000,
    "x1": 15884.5000,
    "x2": 644.5000,
    "x3": 644.5000
  },
  {
    "y1": 57012.5000,
    "y2": 57774.5000,
    "y3": 57774.5000,
    "x1": 15884.5000,
    "x2": 15884.5000,
    "x3": 644.5000
  },
  {
    "y1": 90889.3000,
    "y2": 90889.3000,
    "y3": 102116.1000,
    "x1": 15884.5000,
    "x2": 12830.2000,
    "x3": 12830.2000
  },
  {
    "y1": 90889.3000,
    "y2": 102116.1000,
    "y3": 102116.1000,
    "x1": 15884.5000,
    "x2": 15884.5000,
    "x3": 12830.2000
  },
  {
    "y1": 96747.5000,
    "y2": 99206.7000,
    "y3": 99206.7000,
    "x1": 12830.2000,
    "x2": 12830.2000,
    "x3": 644.5000
  },
  {
    "y1": 96747.5000,
    "y2": 96747.5000,
    "y3": 99206.7000,
    "x1": 12830.2000,
    "x2": 644.5000,
    "x3": 644.5000
  },
  {
    "y1": 76243.7000,
    "y2": 79679.1000,
    "y3": 79679.1000,
    "x1": 2689.2000,
    "x2": 2689.2000,
    "x3": 758.8000
  },
  {
    "y1": 76243.7000,
    "y2": 76243.7000,
    "y3": 79679.1000,
    "x1": 2689.2000,
    "x2": 758.8000,
    "x3": 758.8000
  }]
我的结果应该是带有(x1,y1)的新矩形对象。。。(x4,y4)。 其中两个点应该是给定三角形的交点

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

<强>不考虑边缘情况。< /强>

如果三角形的想法令人困惑。像这样思考问题。 如果列表中的一个对象至少有两个点与列表中的另一个对象相等,则将这两个点合并为一个新的对象矩形,并合并两个点和两个三角形中剩余的两个点


解决方案提供了工作。我想使用纯linq来实现这一点。

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

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

var json=File.ReadAllText(@.\Triangles.json”);
var triangles=Newtonsoft.Json.JsonConvert.DeserializeObject(Json.ToArray();
var joinedTriangles=新列表();
对于(变量i=0;i
这里有一种方法:

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; }
}
类点
{
公共双x{get;set;}
公共双y{get;set;}
公共点(双x,双y)
{
这个.x=x;
这个。y=y;
}
public override bool Equals(object obj)=>obj是点other&&x==other.x&&y==other.y;
公共覆盖int-GetHashCode()=>x.GetHashCode()^y.GetHashCode();
}
阶级三角{
公共双x1{get;set;}
公共双x2{get;set;}
公共双x3{get;set;}
公共双y1{get;set;}
公共双y2{get;set;}
公共双y3{get;set;}
受保护的虚拟IEnumerable点=>new[]{
新点(x1,y1),
新点(x2,y2),
新点(x3,y3),
};
公共点有两个匹配点(其他三角形){
var notMatchingPoints=除(其他点)之外的点;
返回notMatchingPoints.Count()==1
?notMatchingPoints.First()//表示另外两个点相同
:null;
}
}
类矩形:三角形
{
公共矩形(三角形、点)
{
x1=三角形x1;
x2=三角形.x2;
x3=三角形。x3;
x4=点x;
y1=三角形。y1;
y2=三角形。y2;
y3=三角形y3;
y4=点y;
}
公共双x4{get;set;}
公共双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);
        }
    }
}
var list=newlist();
//以某种方式填充三角形列表,例如使用JsonConvert
var result=新列表();
for(int i=0;i

使用数据的工作示例:

请提供示例数据集来说明您的观点,不清楚您所说的“其中一些三角形存储为矩形,表示它们的一些点相等”是什么意思。您需要显示一些示例输入数据和预期结果,以及你的尝试,清楚地说明问题所在。三角形只有3个角。第四个角度(点)来自哪里?这是你的数据。这些是矩阵的坐标。每个点应该有2个点与另一个点相等,以便考虑这两个点为矩形。如果你合并两个三角形,你就有一个正方形。两个三角形共用两个点并不意味着它们形成一个矩形。它们一定会形成一个四边形
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);
        }
    }
}