У меня есть массив 3D линий
- Индекс линий: 1
- StartPoint X: -14.6428894030139 Y: 7.20725630142401 Z: 6.45545239593576
- Конечная точка X: -21,929702035254 Y: 7,20725630142401 Z: -0,864349590215869
- Индекс строк: 2
- StartPoint X: -21,929702035254 Y: 7,20725630142401 Z: -0,864349590215869
- Конечная точка X: -18,9529284798398 Y: 7,20725630142401 Z: -14,8769674574446
- Индекс строк: 3
- StartPoint X: -18,9529284798398 Y: 7,20725630142401 Z: -14,8769674574446
- Конечная точка X: -6,49142554469459 Y: 7,20725630142401 Z: -21,7875736554632
- Индекс строк: 4
- StartPoint X: -8.20427834523699 Y: -1.34120774098889 Z: 15.0290777069201
- Конечная точка X: -23,4511672876025 Y: -1,34120774098889 Z: -0,653437626351529
- Индекс строк: 5
- StartPoint X: -23,4511672876025 Y: -1,34120774098889 Z: -0,653437626351529
- Конечная точка X: -17,8606413420685 Y: -1,34120774098889 Z: -24,4676275768752
- Индекс строк: 6
- StartPoint X: -17,8606413420685 Y: -1,34120774098889 Z: -24,4676275768752
- Конечная точка X: -0,145208475700941 Y: -1,34120774098889 Z: -33.1075318577054
- Индекс строк: 7
- StartPoint X: -0,145208475700941 Y: -1,34120774098889 Z: -33.1075318577054
- Конечная точка X: 4.64667090618536 Y: -1.34120774098889 Z: -10.6728224226084
- Индекс строк: 8
- StartPoint X: 4.64667090618536 Y: -1.34120774098889 Z: -10.6728224226084
- Конечная точка X: -8.20427834523699 Y: -1.34120774098889 Z: 15.0290777069201
- Индекс строк: 9
- StartPoint X: 9,98017607716162 Y: -3.80354989210752 Z: 15.0290777069201
- Конечная точка X: 9.98017607716162 Y: 16.0516164940504 Z: 15.0290777069201
- Индекс строк: 10
- StartPoint X: 9,98017607716162 Y: 16.0516164940504 Z: 15.0290777069201
- Конечная точка X: 1,2344478528421 Y: 38,743235221088 Z: 15,0290777069201
- ссылка на изображение -
https://i.ibb.co/syWB687/3D-lines.png
То, что я хочу, это группы, содержащие индексы строк соединяющихся линий.
- Группа 1 = [1, 2, 3, 4, 5]
- Группа 2 = [6, 7, 8]
- Группа 3 = [9, 10]
Что я получил, так это вывод:
- ключ: 1 Значение: 1,2
- ключ: 2 Значение: 2,1
- ключ: 3 Значение: 2,3
- ключ: 4 Значение: 3,2
- ключ: 5 Значение: 4,5
- ключ: 6 Значение: 4,8
- ключ: 7 Значение: 5,4
- ключ: 8 Значение: 5,6
- ключ: 9 Значение: 6,5
- ключ: 10 Значение: 6,7
- ключ: 11 Значение: 7,6
- ключ: 12 Значение: 7,8
- ключ: 13 Значение: 8,4
- ключ: 14 Значение: 8,7
- ключ: 15 Значение: 9,10
- ключ: 16 Значение: 10,9
Итак, это показывает, что (строка 1 соединяет строку 2, а строка 2 соединяется с линией 1 и т. Д.)
- 1 -> 2
- 2 -> 1
- 2 -> 3
- 3 -> 2
- 4 -> 5
- 4 -> 8
- 5 -> 6
- 6 -> 5
- 6 -> 7
- 7 -> 6
- 7 -> 8
- 8 -> 4
- 8 -> 7
- 10 -> 9
Мой код:
public void ArrangeLines()
{
Lines[i] = new Line3D(startpoint[i], endpoint[i],i); // array of lines
for (int i = 1; i < Lines.Length; i++)
{
System.Diagnostics.Debug.WriteLine("Lines indesx: {0} StartPoint X: {1}
Y: {2} Z: {3} EndPoint X: {4} Y: {5} Z: {6} ",
Lines[i].Index,
Lines[i].StartPoint.X,
Lines[i].StartPoint.Y,
Lines[i].StartPoint.Z,
Lines[i].EndPoint.X,
Lines[i].EndPoint.Y,
Lines[i].EndPoint.Z);
}
int group = 1;
for (int i = 1; i < Lines.Length; i++)
{
Point3D start1 = Lines[i].StartPoint;
Point3D end1 = Lines[i].EndPoint;
for (int ii = 1; ii < Lines.Length ; ii++)
{
Point3D start2 = Lines[ii].StartPoint;
Point3D end2 = Lines[ii].EndPoint;
if (start1.X == start2.X &&
start1.Y == start2.Y &&
start1.Z == start2.Z && i !=ii ||
start1.X == end2.X &&
start1.Y == end2.Y &&
start1.Z == end2.Z && i !=ii ||
end1.X == start2.X &&
end1.Y == start2.Y &&
end1.Z == start2.Z && i !=ii ||
end1.X == end2.X &&
end1.Y == end2.Y &&
end1.Z == end2.Z && i !=ii)
{
List<string> cLines = new List<string>();
cLines.Add(Lines[i].Index.ToString());
cLines.Add(Lines[ii].Index.ToString());
LineGrouped.Add(group.ToString(),cLines);
++group;
}
}
}
string[,] arry = new string[LineGrouped.Count,2];
for (int i = 0; i < LineGrouped.Count; i++)
{
var item = LineGrouped.ElementAt(i);
var itemKey = item.Key;
List<string> itemValue = item.Value;
string list = string.Join(",",itemValue.ToArray());
System.Diagnostics.Debug.WriteLine(
"key:{0} Value{1}",item.Key.ToString(),list);
arry[i,0] = itemValue[0];
arry[i,1] = itemValue[1];
}
}
Мой пользовательский класс:
public class Point3D
{
public double X;
public double Y;
public double Z;
public Point3D(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
public static bool operator == (Point3D point1, Point3D point2)
{
if (point1.X == point2.X && point1.Y == point2.Y && point1.Z == point2.Z)
{
return true;
}
else
{
return false;
}
}
public override int GetHashCode()
{
return (int)X * (int)Y * (int)Z ;
}
public static bool operator !=(Point3D point1, Point3D point2)
{
return !(point1==point2);
}
public override bool Equals(object obj)
{
Point3D p = obj as Point3D;
if ((object)p == null)
{
return false;
}
return base.Equals(obj);
}
}
public class Line3D
{
public Point3D StartPoint;
public Point3D EndPoint;
public int Index;
public Line3D(Point3D startpoint, Point3D endpoint, int index)
{
this.EndPoint = endpoint;
this.StartPoint = startpoint;
this.Index = index;
}
}
public class ConnectedLine
{
public Line3D Line1;
public Line3D Line2;
public Point3D StartPoint;
public Point3D EndPoint;
public ConnectedLine(Line3D line1,Line3D line2)
{
if (line1.StartPoint==line2.StartPoint)
{
this.StartPoint = line1.EndPoint;
this.EndPoint = line2.EndPoint;
this.Line1 = line1;
this.Line2 = line2;
}
else if (line1.EndPoint==line2.StartPoint)
{
this.StartPoint = line1.StartPoint;
this.EndPoint = line2.EndPoint;
this.Line1 = line1;
this.Line2 = line2;
}
else if (line1.StartPoint==line2.EndPoint)
{
this.StartPoint = line1.EndPoint;
this.EndPoint = line2.StartPoint;
this.Line1 = line1;
this.Line2 = line2;
}
else if (line1.EndPoint==line2.EndPoint)
{
this.StartPoint = line1.StartPoint;
this.EndPoint = line2.StartPoint;
this.Line1 = line1;
this.Line2 = line2;
}
}
}