我在列表中有一个 3D 数据列表,即c_Top
该c_Top
列表包含一个模式,它按降序排列 y 值,如下所示:
//[ x, y, z]
[ 2, 10, 1] //c_Top[0]
[ 7, 8, 1] //c_Top[1]
[ 1, 7, 2] //c_Top[2]
[ 3, 6, 1] //c_Top[3]
[ 4, 6, 2] //c_Top[4]
. .
. .
. //c_Top[cTop.Count - 1]
现在,我的目标是根据具有相同 z 值的条件获取 c_Top 列表中的所有 x 值
for (int i = 0; i < c_Top.Count; i++)
{
if (i != c_Top.Count - 1)
{
// if the next data and the current data has same z, then proceed
if (c_Top[i].p.Z == c_Top[i + 1].p.Z)
{
// if the x of next data is greater than current x of current data
if (c_Top[i + 1].p.X > c_Top[i].p.X)
{
// Select all the x and y value at X+ direction
xy_xplusList = c_Top.Select(x => x.p.X).OrderBy(x => x).ToList();
}
// if the x of next data is smaller than current x of current data
else if (c_Top[i + 1].p.X < c_Top[i].p.X)
{
// Select all the x and y value at X- direction
xy_xminusList = c_Top.Select(x => x.p.X).OrderByDescending(x => x).ToList();
}
}
if (xy_xplusList.Count > 0)
{
//Do something
}
if (xy_xminusList.Count > 0)
{
//Do something
}
}
我正在使用上面的 for 循环和上面的数据示例。由于 的原因c_Top[1]
而c_Top[2]
具有不同的 z 值。因此,当i = 1
,the c_Top[1].p.X
即使它具有与c_Top[0]
我得到这样的结果
//Output
xy_xplusList = { 2 } //only one x values from c_Top[0] is saved
xy_xminusList = { 0 }
但实际上我想要的结果是这样的
c_Top[0] // Output xy_xplusList = { 2, 3 }
// xy_xminusList = { 0 }
c_Top[1] // Output xy_xplusList = { 0 }
// xy_xminusList = { 3 }
c_Top[2] // Output xy_xplusList = { 1 , 4 }
// xy_xminusList = { 0 }
c_Top[3] // Ouput xy_xplusList = { 7 }
// xy_xminusList = { 2 }
c_Top[4] // Ouput xy_xplusList = { 0 }
// xy_xminusList = { 1 }
简而言之。我想考虑c_Top
列表中的每个数据。
考虑时c_Top[i]
:
如果c_Top
列表中 z 值的所有数据与 具有相同的 z c_Top[i].p.Z
,则它将检查c_Top
列表中的所有 x 值。
如果 x 值大于c_Top[i].p.X
,则 x 将被添加到xy_xplusList
如果得到的 x 值小于c_Top[i].p.X
,则 x 将被添加到xy_minusList
有一些 LINQ 方法吗?
就像我用相同的 z 排序后,检查列表中的所有 x,然后添加到xy_xplusList
说明更新
在列表中的每个坐标中,首先我检查它们是否在同一个 Z 字段中。如果它们是相同的 Z 字段,那么我检查所有 X。
如果 X 大于当前 x 坐标,则将 x 添加到 xplusList
如果 X 小于当前 x 坐标,则将 x 添加到 xminusList
*我对列表内的所有坐标重复上述过程。
说明更新2
想象上面的金字塔多边形的尖端是c_Top列表中的一个坐标
要绘制金字塔多边形,我们需要 TIP 的坐标、RHS 的尖端坐标和 LHS 的尖端坐标、FRONT 的坐标和背面的坐标。
所以,现在,回到问题。我在 c_Top 列表中存储了多个 TIP 坐标。现在我想从尖端(+X 方向)检查 RHS 中的所有坐标,以及从尖端(-X 方向)检查 LHS 中的所有坐标。FRONT 和 BACK 坐标也是如此。
成像我有多个 TIP 坐标排列在不同高度的同一 Z 字段中。我想将所有尖端相对于最高尖端坐标连接在一起,如下面的粉红色线所示:
更新:自己回答这个问题,这个问题将被关闭
//Group all the Z coordinate throughout the v_Tip list
var groupedZ = from p in v_Tip
group p by p.p.Z into q
select q;
foreach (var groupZ in groupedZ)
{
//Order the groupZ with Y coordinate descending order
var SameZList = groupZ.OrderByDescending(y => y.p.Y).ThenBy(x => x.p.X).ToList();
//Since the list is order by descending w.r.t Y coordinate, the SameZList[0] will be the peak coordinate in groupZ
var peakZ = SameZList[0];
// At same Z, mean at XY plane
for (int i = 1; i < SameZList.Count; i++)
{
// mean the x is at the RHS from the peak
if (peakZ.p.X < SameZList[i].p.X)
{
// add all the X and Y coordinates in RHS direction from the peak (X+ direction from the peak
xy_xplusList.Add(SameZList[i].p.X);
xy_yplusList.Add(SameZList[i].p.Y);
}
else // the x is at the LHS from the peak
{
// add all the X and Y coordinates in LHS direction from the peak (X- direction from the peak
xy_xminusList.Add(SameZList[i].p.X);
xy_yminusList.Add(SameZList[i].p.Y);
}
}
}