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