public HexVector AddVectors(RawHexVector vectorA, RawHexVector vectorB) { var rawVector = new RawHexVector(); rawVector.AddComponents(vectorA.Components); rawVector.AddComponents(vectorB.Components); return(ConsolidateAndCopyVector(rawVector)); }
public void ConsolidateVector(RawHexVector rawVector) { List <HexVectorComponent> reductedComponents = rawVector.Components.ToList(); rawVector.ClearComponents(); rawVector.AddComponent(ConsolidateCardinalDirection(HexAxis.Up, reductedComponents)); do { // Step 1. Consolidate opposing vectors. reductedComponents = new List <HexVectorComponent> { ConsolidateCardinalDirection(HexAxis.A, reductedComponents), ConsolidateCardinalDirection(HexAxis.B, reductedComponents), ConsolidateCardinalDirection(HexAxis.C, reductedComponents) }; reductedComponents = reductedComponents.Where(av => av.Magnitude > 0).ToList(); HexVectorComponent fittingVectorA, fittingVectorB; // Step 2. Consolidate vectors 120 degree apart. var medianDirection = FindVectors120Apart(reductedComponents, out fittingVectorA, out fittingVectorB); if (medianDirection != null && fittingVectorA != null && fittingVectorB != null) { int minimumMagnitude = Math.Min(fittingVectorA.Magnitude, fittingVectorB.Magnitude); fittingVectorA.Magnitude -= minimumMagnitude; fittingVectorB.Magnitude -= minimumMagnitude; reductedComponents.Add(new HexVectorComponent(medianDirection.Value, minimumMagnitude)); //This one will be resolved in the next iteration. } }while (reductedComponents.Count > 2 || HasVectors120Apart(reductedComponents)); rawVector.AddComponents(reductedComponents); }