protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { ReadMouse(); ReadKeyboard(); d3ddevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.Cyan, 1.0f, 0); //theta += Geometry.DegreeToRadian(1); d3ddevice.BeginScene(); d3ddevice.Transform.World = Matrix.Translation(-spacing - .5f, -spacing - .5f, -spacing - .5f); for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { for (int z = 0; z < 3; z++) { rubixCube.GetBlock(x, y, z).draw(x * spacing, y * spacing, z * spacing); } } } d3ddevice.EndScene(); PositionCamera(); d3ddevice.Present(); this.Invalidate(); }
/// <summary> /// this function will solve the white cross /// </summary> public void SolveWhiteCross() { while (!WhiteCrossSolved()) { List <Block> yellow_slice = cube.GetSlice(Color.Yellow); Orientor front_face; Edge edge_piece; Boolean block_with_white_on_bottom = false, block_with_white_in_center, block_on_top_not_oriented_correctly; //will take any edge piece with the white on the bottom and place it where it needs to be. foreach (Block block_in_yellow_slice in yellow_slice) { //if the blocks in the yellow slice that have a white color also have a green color //is an edge piece if (cube.GetBlock(Color.Green, true, cube.GetBlock(Color.White, true, yellow_slice)).Count == 1) { block_with_white_on_bottom = true; edge_piece = (Edge)cube.GetBlock(Color.Green, true, cube.GetBlock(Color.White, true, yellow_slice))[0]; //while the edgepeice isn't directly under the side it needs to be, //cube.Rotate it until it is. while (!edge_piece.Equals(cube.GetBlock(1, 0, 0))) { cube.Rotate(Color.Yellow, Direction.Clockwise); } //get the block that will give you the orientation to use as the front face front_face = Cube.GetOrientation(Color.Green); PlaceBottomEdgePieceInCross(edge_piece, front_face); //yellow_slice = cube.GetSlice(Color.Yellow); break; } else if (cube.GetBlock(Color.Purple, true, cube.GetBlock(Color.White, true, yellow_slice)).Count == 1) { block_with_white_on_bottom = true; edge_piece = (Edge)cube.GetBlock(Color.Purple, true, cube.GetBlock(Color.White, true, yellow_slice))[0]; while (!edge_piece.Equals(cube.GetBlock(0, 0, 1))) { cube.Rotate(Color.Yellow, Direction.Clockwise); } front_face = Cube.GetOrientation(Color.Purple); PlaceBottomEdgePieceInCross(edge_piece, front_face); //yellow_slice = cube.GetSlice(Color.Yellow); break; } else if (cube.GetBlock(Color.Red, true, cube.GetBlock(Color.White, true, yellow_slice)).Count == 1) { block_with_white_on_bottom = true; edge_piece = (Edge)cube.GetBlock(Color.Red, true, cube.GetBlock(Color.White, true, yellow_slice))[0]; while (!edge_piece.Equals(cube.GetBlock(2, 0, 1))) { cube.Rotate(Color.Yellow, Direction.Clockwise); } front_face = Cube.GetOrientation(Color.Red); PlaceBottomEdgePieceInCross(edge_piece, front_face); //yellow_slice = cube.GetSlice(Color.Yellow); break; } else if (cube.GetBlock(Color.Blue, true, cube.GetBlock(Color.White, true, yellow_slice)).Count == 1) { block_with_white_on_bottom = true; edge_piece = (Edge)cube.GetBlock(Color.Blue, true, cube.GetBlock(Color.White, true, yellow_slice))[0]; //Block temp = cube.GetBlock(1, 0, 2); while (!edge_piece.Equals(cube.GetBlock(1, 0, 2))) { cube.Rotate(Color.Yellow, Direction.Clockwise); } front_face = Cube.GetOrientation(Color.Blue); PlaceBottomEdgePieceInCross(edge_piece, front_face); break; } else { block_with_white_on_bottom = false; } } /* * if edge piece is in the center, then put it in the bottom layer, * and the above will put it in the correct position. */ if (block_with_white_in_center = cube.GetBlock(0, 1, 0).HasColor(Color.White)) { cube.Rotate(Color.Green, Direction.CounterClockwise); } else if (block_with_white_in_center = cube.GetBlock(0, 1, 2).HasColor(Color.White)) { cube.Rotate(Color.Purple, Direction.CounterClockwise); } else if (block_with_white_in_center = cube.GetBlock(2, 1, 2).HasColor(Color.White)) { cube.Rotate(Color.Blue, Direction.CounterClockwise); } else if (block_with_white_in_center = cube.GetBlock(2, 1, 0).HasColor(Color.White)) { cube.Rotate(Color.Red, Direction.CounterClockwise); } else { block_with_white_in_center = false; } if (block_with_white_in_center) { continue; } /* * if edge piece is in the correct position, but the incorrect * orientation, then put it in the bottom layer, and let the * placeBottomEdgePieceInCross(...) function handle puting it * in the correct position */ if (block_on_top_not_oriented_correctly = cube.GetBlock(1, 2, 0).front == Color.White) { front_face = Cube.GetOrientation(Color.Green); } else if (block_on_top_not_oriented_correctly = cube.GetBlock(0, 2, 1).left == Color.White) { front_face = Cube.GetOrientation(Color.Purple); } else if (block_on_top_not_oriented_correctly = cube.GetBlock(1, 2, 2).back == Color.White) { front_face = Cube.GetOrientation(Color.Blue); } else if (block_on_top_not_oriented_correctly = cube.GetBlock(2, 2, 1).right == Color.White) { front_face = Cube.GetOrientation(Color.Red); } else { front_face = null; block_on_top_not_oriented_correctly = false; } if (block_on_top_not_oriented_correctly) { cube.Rotate(front_face.front, Direction.Clockwise); cube.Rotate(front_face.front, Direction.Clockwise); } /* * if the cross is solved, but incorreclty oriented */ if (!block_with_white_on_bottom && !block_with_white_in_center && !block_on_top_not_oriented_correctly) { CheckWhiteCross(); } } }