public static QuadTree<byte> LoadQuadTree(BinaryReader Reader) { // First load the dimensions. var topLeft = new Coordinate(Reader.ReadSingle(), Reader.ReadSingle()); var bottomRight = new Coordinate(Reader.ReadSingle(), Reader.ReadSingle()); return LoadQuadTreeInternal(Reader, topLeft, bottomRight); }
private static QuadTree<byte> LoadQuadTreeInternal(BinaryReader Reader, Coordinate TopLeft, Coordinate BottomRight) { var type = Reader.ReadByte(); if (type == LEAF) { return new QuadTreeLeaf<byte> { BottomRight = BottomRight, TopLeft = TopLeft, Data = Reader.ReadByte() }; } else if (type == NODE) { var middleTop = new Coordinate((BottomRight.X + TopLeft.X) / 2, TopLeft.Y); var middleBottom = new Coordinate((BottomRight.X + TopLeft.X) / 2, BottomRight.Y); var middleLeft = new Coordinate(TopLeft.X, (BottomRight.Y + TopLeft.Y) / 2); var middleRight = new Coordinate(BottomRight.X, (BottomRight.Y + TopLeft.Y) / 2); var middle = new Coordinate(middleTop.X, middleLeft.Y); return new QuadTreeNode<byte> { TopLeft = TopLeft, BottomRight = BottomRight, Children = new[] { LoadQuadTreeInternal(Reader, TopLeft, middle), LoadQuadTreeInternal(Reader, middleTop, middleRight), LoadQuadTreeInternal(Reader, middleLeft, middleBottom), LoadQuadTreeInternal(Reader, middle, BottomRight) } }; } else { throw new InvalidDataException("Invalid type identifier"); } }