private void PartialSortY(MatrixSortParticleSection particleSection) { for (var i = 0; i < particleSection.ParticlesMatrix.GetLength(0); i++) { for (var j = 0; j < particleSection.ParticlesMatrix.GetLength(1) - 1; j++) { for (var k = 0; k < particleSection.ParticlesMatrix.GetLength(2); k++) { if (particleSection.ParticlesMatrix[i, j, k].Position.Y > particleSection.ParticlesMatrix[i, j + 1, k].Position.Y) { SwapParticles(particleSection, i, j, k, i, j + 1, k); } var otherj = particleSection.ParticlesMatrix.GetLength(1) - j - 2; if (particleSection.ParticlesMatrix[i, otherj, k].Position.Y > particleSection.ParticlesMatrix[i, otherj + 1, k].Position.Y) { SwapParticles(particleSection, i, otherj, k, i, otherj + 1, k); } // throw new Exception("Edit to swap from A to B, B to A"); } } } }
private void SwapParticles(MatrixSortParticleSection particleSection, int x1, int y1, int z1, int x2, int y2, int z2) { var swap = particleSection.ParticlesMatrix[x1, y1, z1]; particleSection.ParticlesMatrix[x1, y1, z1] = particleSection.ParticlesMatrix[x2, y2, z2]; particleSection.ParticlesMatrix[x2, y2, z2] = swap; totalSwaps++; }
private void SwapZBorderSection(MatrixSortParticleSection lower, MatrixSortParticleSection upper, int step, SimulationStructure structure) { for (int i = 0; i < lower.ParticlesMatrix.GetLength(0); i++) { for (int j = 0; j < lower.ParticlesMatrix.GetLength(1); j++) { Particle particle1 = upper.ParticlesMatrix[i, j, 0]; Particle particle2 = lower.ParticlesMatrix[i, j, lower.ParticlesMatrix.GetLength(2) - 1]; if (particle2.Position.Z <= particle1.Position.Z) { continue; } lower.ParticlesMatrix[i, j, lower.ParticlesMatrix.GetLength(2) - 1] = particle1; upper.ParticlesMatrix[i, j, 0] = particle2; } } costCalculator.AddTransmissionCost(lower, upper, lower.ParticlesMatrix.GetLength(2) * lower.ParticlesMatrix.GetLength(1), structure, step); }
private void SwapXBorderSection(MatrixSortParticleSection lower, MatrixSortParticleSection upper, int step, SimulationStructure structure) { for (int i = 1; i < lower.ParticlesMatrix.GetLength(1); i++) { for (int j = 1; j < lower.ParticlesMatrix.GetLength(2); j++) { Particle particle1 = lower.ParticlesMatrix[lower.ParticlesMatrix.GetLength(0) - 1, i, j]; Particle particle2 = upper.ParticlesMatrix[0, i, j]; if (particle1.Position.X <= particle2.Position.X) { continue; } lower.ParticlesMatrix[lower.ParticlesMatrix.GetLength(0) - 1, i, j] = particle2; upper.ParticlesMatrix[0, i, j] = particle1; } } costCalculator.AddTransmissionCost(lower, upper, lower.ParticlesMatrix.GetLength(2) * lower.ParticlesMatrix.GetLength(1), structure, step); }
private void PartialSortX(MatrixSortParticleSection particleSection) { for (var i = 0; i < particleSection.ParticlesMatrix.GetLength(0) - 1; i++) { for (var j = 0; j < particleSection.ParticlesMatrix.GetLength(1); j++) { for (var k = 0; k < particleSection.ParticlesMatrix.GetLength(2); k++) { if (particleSection.ParticlesMatrix[i, j, k].Position.X > particleSection.ParticlesMatrix[i + 1, j, k].Position.X) { SwapParticles(particleSection, i + 1, j, k, i, j, k); } var otheri = particleSection.ParticlesMatrix.GetLength(0) - i - 2; if (particleSection.ParticlesMatrix[otheri, j, k].Position.X > particleSection.ParticlesMatrix[otheri + 1, j, k].Position.X) { SwapParticles(particleSection, otheri + 1, j, k, otheri, j, k); } } } } }
private void PartialSortZ(MatrixSortParticleSection particleSection) { for (var i = 0; i < particleSection.ParticlesMatrix.GetLength(0); i++) { for (var j = 0; j < particleSection.ParticlesMatrix.GetLength(1); j++) { for (var k = 0; k < particleSection.ParticlesMatrix.GetLength(2) - 1; k++) { if (particleSection.ParticlesMatrix[i, j, k].Position.Z > particleSection.ParticlesMatrix[i, j, k + 1].Position.Z) { SwapParticles(particleSection, i, j, k, i, j, k + 1); } var otherk = particleSection.ParticlesMatrix.GetLength(2) - k - 2; if (particleSection.ParticlesMatrix[i, j, otherk].Position.Z > particleSection.ParticlesMatrix[i, j, otherk + 1].Position.Z) { SwapParticles(particleSection, i, j, otherk, i, j, otherk + 1); } } } } }