我试图在数组中找到多个对称中心以用值填充它。我决定将长度分成相似的部分,并从每个中心双向穿过。在这里,我使它适用于偶数段,但对于奇数段来说并不准确:当只需要设置 1 时,它会在中心设置对。并且我的
OddOffset
在某些情况下不正确(例如,对于 3 个中心或长度) 3).
const double SegmentLength = static_cast<double>(PointsCount) / SymmetryCenters;
const double HalfSegment = SegmentLength / 2;
//const auto OddOffset = std::fmod(SegmentLength, 2);
for (int32 CenterIndex = 0; CenterIndex < SymmetryCenters; CenterIndex++) {
const int32 Center = FMath::RoundToInt(CenterIndex * SegmentLength + HalfSegment);
for (int32 PointIndex = 0; PointIndex < HalfSegment; PointIndex++) {
const int32 LeftIndex = Center - PointIndex - 1;
const int32 RightIndex = Center + PointIndex;
// const int32 RightIndex = Center + PointIndex - OddOffset;
// Set values if within bounds
if (LeftIndex >= 0) OutPoints[LeftIndex] = MyValue();
if (RightIndex < PointsCount) OutPoints[RightIndex] = MyValue();
}
}
这是不同阵列长度下1个和2个对称中心的一些测试数据:
For 06 Length: 1) [3], 2) [2, 5]
For 12 Length: 1) [6], 2) [3, 9]
For 18 Length: 1) [9], 2) [5, 14]
也不确定使用左右索引是否是最好的方法,也许一个简单的循环 0..N - 1 可能会更好,需要尝试转换。
我不明白什么是“对称”,什么是“中心”...... 但看起来你想将 N 个段排列在一个数组中。 (其中,所有线段的长度相同)
如果是这样...
例如,如果数组长度为“7”,段数 N 为 2,则每个段的长度将为 3。 在这种情况下,段排列模式将是:
其中“1”是第一段,“2”是第二段,X”是不在任一段中的数组元素。
如果你想做类似上面的事情,你应该做的将可以被认为是“决定把X放在哪里”。
也就是...从只有线段排列好的状态开始,然后决定在哪里插入X。 有三个可插入点(:最左边、段之间、最右边)。
v v v
1 1 1 2 2 2