public void Apply(Cube cube, RelativeSidePosition side) { cube.RotateSideCW(Helper.GetRelativeSide(Sides.Top, side)); cube.RotateTopCW(); cube.RotateSideCCW(Helper.GetRelativeSide(Helper.GetRelativeSide(Sides.Top, side), RelativeSidePosition.Left)); cube.RotateTopCCW(); }
public Side GetRelativeSide(RelativeSidePosition relativeSide) { if (relativeSide == RelativeSidePosition.Left) { return(left); } if (relativeSide == RelativeSidePosition.Right) { return(right); } if (relativeSide == RelativeSidePosition.Top) { return(top); } if (relativeSide == RelativeSidePosition.Bottom) { return(bottom); } if (relativeSide == RelativeSidePosition.Opposite) { return(opposite); } if (relativeSide == RelativeSidePosition.Self) { return(this); } return(null); //default case to satisfy the compiler, should never occur; }
/// <summary> /// returns the opposite side /// </summary> /// <param name="relativeSide"></param> /// <returns></returns> public static RelativeSidePosition GetOppositeRelativeSide(RelativeSidePosition relativeSide) { switch (relativeSide) { case RelativeSidePosition.Bottom: return(RelativeSidePosition.Top); case RelativeSidePosition.Top: return(RelativeSidePosition.Bottom); case RelativeSidePosition.Left: return(RelativeSidePosition.Right); case RelativeSidePosition.Right: return(RelativeSidePosition.Left); case RelativeSidePosition.Opposite: return(RelativeSidePosition.Self); case RelativeSidePosition.Self: return(RelativeSidePosition.Opposite); default: return(RelativeSidePosition.NotExisting); } }
public double Applicable(Cube cube, RelativeSidePosition side) { RelativeSidePosition relativeSidePosition; RelativeEdgePosition relativeEdgePosition; cube.GetRelativeEdgePosition(cube.Top.CubeSide, cube.Top.Color, cube.Top.GetRelativeSide(side).Color, out relativeSidePosition, out relativeEdgePosition); RelativeSidePosition expectedSidePositon = Helper.GetRotationNeutralRelativeSidePosition(cube.Top, RelativeSidePosition.Left, Helper.ConvertRelativeSidePositionToRelativeEdgePosition(side)); RelativeEdgePosition expectedEdgePosition = RelativeEdgePosition.Right; if (relativeSidePosition == expectedSidePositon && relativeEdgePosition == expectedEdgePosition) { return(1); } else { return(0); } }
public double Applicable(Cube cube, RelativeSidePosition side) { RelativeSidePosition relativeSidePosition; RelativeEdgePosition relativeEdgePosition; cube.GetRelativeEdgePosition(cube.Top.CubeSide, cube.Top.Color, cube.Top.GetRelativeSide(side).Color, out relativeSidePosition, out relativeEdgePosition); RelativeSidePosition expectedSidePositon = Helper.GetRotationNeutralRelativeSidePosition(cube.Top, RelativeSidePosition.Opposite, Helper.ConvertRelativeSidePositionToRelativeEdgePosition(side)); RelativeEdgePosition expectedEdgePosition = Helper.GetRelativeEdge(Helper.ConvertRelativeSidePositionToRelativeEdgePosition(side), RelativeEdgePosition.Left); expectedEdgePosition = Helper.SwapTopBottom(expectedEdgePosition); //because of invertion of opposite side if (relativeSidePosition == expectedSidePositon && relativeEdgePosition == expectedEdgePosition) { return(1); } else { return(0); } }
public double Applicable(Cube cube, RelativeSidePosition side) { RelativeSidePosition relativeSidePosition; RelativeEdgePosition relativeEdgePosition; cube.GetRelativeEdgePosition(cube.Top.CubeSide, cube.Top.Color, cube.Top.GetRelativeSide(side).Color, out relativeSidePosition, out relativeEdgePosition); RelativeSidePosition expectedSidePositon = RelativeSidePosition.Opposite; RelativeEdgePosition expectedEdgePosition = Helper.ConvertRelativeSidePositionToRelativeEdgePosition(side); expectedEdgePosition = Helper.SwapTopBottom(expectedEdgePosition); //because on the opposite side bottom and top are inverted if (relativeSidePosition == expectedSidePositon && relativeEdgePosition == expectedEdgePosition) { return(1); } else { return(0); } }
/// <summary> /// finds the position of that edge /// </summary> /// <param name="startSide"></param> /// <param name="primaryColor">determines to which of the 2 adjacent sides the resulting position is relative to</param> /// <param name="secondaryColor"></param> /// <param name="relativeSidePosition">contains the relative side to the startSide</param> /// <param name="relativeEdgePosition">contains the edge relative to the relative side</param> public void GetRelativeEdgePosition(Sides startSide, Brush primaryColor, Brush secondaryColor, out RelativeSidePosition relativeSidePosition, out RelativeEdgePosition relativeEdgePosition) { //default to satisfy the compiler, should never occur relativeSidePosition = RelativeSidePosition.NotExisting; relativeEdgePosition = RelativeEdgePosition.NotExisting; foreach (var side in CubeSides) { var relativePosition = side.GetRelativeEdgePosition(primaryColor, secondaryColor); if (relativePosition != RelativeEdgePosition.NotExisting) { relativeEdgePosition = relativePosition; relativeSidePosition = Helper.GetSideRelation(startSide, side.CubeSide); //normally, to create a real relative position of the edge, here would be a need for special handling of sides and relative sides combinations //but this would introduce a lot of special handling in other places too, which is unnecessary //therefore, the relativeEdgePosition is relative to the side //e.g. in a solved cube: when back (green) is the startside, the edge (primary white, secondary blue) is the top side relative to back //because the edge is relative to the top side, the resulting relative edge position is bottom //the view of the relative edge position is as if the cube is not turned break; //after the position is found, there cannot be another one } } }
/// <summary> /// treats the cube as if it were rotated so that the relativeEdgePosition is bottom /// and then returns the side that is given by relativeSidePosition /// </summary> /// <param name="startSide"></param> /// <param name="relativeSidePosition"></param> /// <param name="relativeEdgePosition"></param> /// <returns></returns> public static Side GetRotationNeutralRelativeSide(Side startSide, RelativeSidePosition relativeSidePosition, RelativeEdgePosition relativeEdgePosition) { if (relativeEdgePosition == RelativeEdgePosition.Left) { if (relativeSidePosition == RelativeSidePosition.Left) { return(startSide.Top); } if (relativeSidePosition == RelativeSidePosition.Right) { return(startSide.Bottom); } if (relativeSidePosition == RelativeSidePosition.Bottom) { return(startSide.Left); } if (relativeSidePosition == RelativeSidePosition.Top) { return(startSide.Right); } if (relativeSidePosition == RelativeSidePosition.Opposite) { return(startSide.Opposite); } if (relativeSidePosition == RelativeSidePosition.Self) { return(startSide); } } if (relativeEdgePosition == RelativeEdgePosition.Right) { if (relativeSidePosition == RelativeSidePosition.Left) { return(startSide.Bottom); } if (relativeSidePosition == RelativeSidePosition.Right) { return(startSide.Top); } if (relativeSidePosition == RelativeSidePosition.Bottom) { return(startSide.Right); } if (relativeSidePosition == RelativeSidePosition.Top) { return(startSide.Left); } if (relativeSidePosition == RelativeSidePosition.Opposite) { return(startSide.Opposite); } if (relativeSidePosition == RelativeSidePosition.Self) { return(startSide); } } if (relativeEdgePosition == RelativeEdgePosition.Top) { if (relativeSidePosition == RelativeSidePosition.Left) { return(startSide.Right); } if (relativeSidePosition == RelativeSidePosition.Right) { return(startSide.Left); } if (relativeSidePosition == RelativeSidePosition.Bottom) { return(startSide.Top); } if (relativeSidePosition == RelativeSidePosition.Top) { return(startSide.Bottom); } if (relativeSidePosition == RelativeSidePosition.Opposite) { return(startSide.Opposite); } if (relativeSidePosition == RelativeSidePosition.Self) { return(startSide); } } if (relativeEdgePosition == RelativeEdgePosition.Bottom) { if (relativeSidePosition == RelativeSidePosition.Left) { return(startSide.Left); } if (relativeSidePosition == RelativeSidePosition.Right) { return(startSide.Right); } if (relativeSidePosition == RelativeSidePosition.Bottom) { return(startSide.Bottom); } if (relativeSidePosition == RelativeSidePosition.Top) { return(startSide.Top); } if (relativeSidePosition == RelativeSidePosition.Opposite) { return(startSide.Opposite); } if (relativeSidePosition == RelativeSidePosition.Self) { return(startSide); } } return(null); }
/// <summary> /// converts the relative side to the according relative edge /// </summary> /// <param name="relativeSide"></param> /// <returns></returns> public static RelativeEdgePosition ConvertRelativeSidePositionToRelativeEdgePosition(RelativeSidePosition relativeSide) { switch (relativeSide) { case RelativeSidePosition.Bottom: return(RelativeEdgePosition.Bottom); case RelativeSidePosition.Top: return(RelativeEdgePosition.Top); case RelativeSidePosition.Left: return(RelativeEdgePosition.Left); case RelativeSidePosition.Right: return(RelativeEdgePosition.Right); default: return(RelativeEdgePosition.NotExisting); } }
/// <summary> /// gets the side relative to startSide according to relativeSide /// </summary> /// <param name="startSide"></param> /// <param name="relativeSide"></param> /// <returns></returns> public static Sides GetRelativeSide(Sides startSide, RelativeSidePosition relativeSide) { Debug.Assert(relativeSide != RelativeSidePosition.NotExisting); if (startSide == Sides.Front) { if (relativeSide == RelativeSidePosition.Self) { return(Sides.Front); } if (relativeSide == RelativeSidePosition.Opposite) { return(Sides.Back); } if (relativeSide == RelativeSidePosition.Left) { return(Sides.Left); } if (relativeSide == RelativeSidePosition.Right) { return(Sides.Right); } if (relativeSide == RelativeSidePosition.Top) { return(Sides.Top); } if (relativeSide == RelativeSidePosition.Bottom) { return(Sides.Bottom); } } if (startSide == Sides.Back) { if (relativeSide == RelativeSidePosition.Self) { return(Sides.Back); } if (relativeSide == RelativeSidePosition.Opposite) { return(Sides.Front); } if (relativeSide == RelativeSidePosition.Left) { return(Sides.Right); } if (relativeSide == RelativeSidePosition.Right) { return(Sides.Left); } if (relativeSide == RelativeSidePosition.Top) { return(Sides.Top); } if (relativeSide == RelativeSidePosition.Bottom) { return(Sides.Bottom); } } if (startSide == Sides.Left) { if (relativeSide == RelativeSidePosition.Self) { return(Sides.Left); } if (relativeSide == RelativeSidePosition.Opposite) { return(Sides.Right); } if (relativeSide == RelativeSidePosition.Left) { return(Sides.Back); } if (relativeSide == RelativeSidePosition.Right) { return(Sides.Front); } if (relativeSide == RelativeSidePosition.Top) { return(Sides.Top); } if (relativeSide == RelativeSidePosition.Bottom) { return(Sides.Bottom); } } if (startSide == Sides.Right) { if (relativeSide == RelativeSidePosition.Self) { return(Sides.Right); } if (relativeSide == RelativeSidePosition.Opposite) { return(Sides.Left); } if (relativeSide == RelativeSidePosition.Left) { return(Sides.Front); } if (relativeSide == RelativeSidePosition.Right) { return(Sides.Back); } if (relativeSide == RelativeSidePosition.Top) { return(Sides.Top); } if (relativeSide == RelativeSidePosition.Bottom) { return(Sides.Bottom); } } if (startSide == Sides.Top) { if (relativeSide == RelativeSidePosition.Self) { return(Sides.Top); } if (relativeSide == RelativeSidePosition.Opposite) { return(Sides.Bottom); } if (relativeSide == RelativeSidePosition.Left) { return(Sides.Left); } if (relativeSide == RelativeSidePosition.Right) { return(Sides.Right); } if (relativeSide == RelativeSidePosition.Top) { return(Sides.Back); } if (relativeSide == RelativeSidePosition.Bottom) { return(Sides.Front); } } if (startSide == Sides.Bottom) { if (relativeSide == RelativeSidePosition.Self) { return(Sides.Bottom); } if (relativeSide == RelativeSidePosition.Opposite) { return(Sides.Top); } if (relativeSide == RelativeSidePosition.Left) { return(Sides.Left); } if (relativeSide == RelativeSidePosition.Right) { return(Sides.Right); } if (relativeSide == RelativeSidePosition.Top) { return(Sides.Front); } if (relativeSide == RelativeSidePosition.Bottom) { return(Sides.Back); } } return(startSide); //default value to satisfy the compiler, should never be used }
/// <summary> /// treats the cube as if it were rotated so that the relativeEdgePosition is bottom /// and then returns the side relation of the start side and the relative side /// </summary> /// <param name="startSide"></param> /// <param name="relativeSidePosition"></param> /// <param name="relativeEdgePosition"></param> /// <returns></returns> public static RelativeSidePosition GetRotationNeutralRelativeSidePosition(Side startSide, RelativeSidePosition relativeSidePosition, RelativeEdgePosition relativeEdgePosition) { return(GetSideRelation(startSide.CubeSide, GetRotationNeutralRelativeSide(startSide, relativeSidePosition, relativeEdgePosition).CubeSide)); }