diff --git a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs index a9dd0b8..6ce6fb6 100644 --- a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs +++ b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs @@ -57,9 +57,9 @@ namespace OSCADSharp.ConsoleTests static void Main(string[] args) { - var img = ImportedImage.FromFile("seahawks coaster.png").Scale(1, 1, Inches.Quarter + Inches.Eigth); + var img = ImportedImage.FromFile("sample.png", ImageImportMode.Polygonal).Scale(1, 1, Inches.Quarter + Inches.Eigth); var imgPos = img.Position(); - var _base = new Cylinder(img.Bounds().Width + Inches.Quarter, Inches.Quarter); + var _base = new Cylinder(img.Bounds().Width + Inches.Quarter, Inches.Quarter) { Resolution = 100 }; var rim = _base.Clone().Scale(1, 1, 1.25) - _base.Clone().Scale(.9, .9, 3.5).Translate(0, 0, -Inches.Eigth); var coaster = img + _base.Translate(imgPos.X, imgPos.Y, 0) + rim.Translate(imgPos.X, imgPos.Y, Inches.Quarter); ; diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs b/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs index c774178..0055d6c 100644 --- a/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs +++ b/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs @@ -50,9 +50,85 @@ namespace OSCADSharp.Solids.Imported this.ImageBounds = new Bounds(new Vector3(), new Vector3(img.Width, img.Height, 1)); var separatedColors = this.separateColors(img); + IEnumerable>> contiguousSections = new List>>(); + + foreach (var colorGroup in separatedColors.Values) + { + var sections = this.getContiguousSections(colorGroup); + contiguousSections = contiguousSections.Concat(sections); + } throw new NotImplementedException(); } + private List>> getContiguousSections(List> colorGrouping) + { + KeyValuePair[,] grid = createGrid(colorGrouping); + var sections = new List>>(); + + while (colorGrouping.Count > 0) + { + var origin = colorGrouping[0]; + colorGrouping.RemoveAt(0); + sections.Add(this.getNeighbors(origin, grid, colorGrouping)); + } + + return sections; + } + + private List> getNeighbors(KeyValuePair origin, KeyValuePair[,] grid, List> colorGrouping) + { + List> neighbors = new List>(); + Queue> nextOrigins = new Queue>(); + nextOrigins.Enqueue(origin); + + while(nextOrigins.Count > 0) + { + List neighboringPoints = new List() { + new Point(origin.Key.X, origin.Key.Y + 1), //Above + new Point(origin.Key.X, origin.Key.Y - 1), //Below + new Point(origin.Key.X - 1, origin.Key.Y), //Left + new Point(origin.Key.X + 1, origin.Key.Y), //Right + new Point(origin.Key.X - 1, origin.Key.Y+1), //UpperLeft + new Point(origin.Key.X + 1, origin.Key.Y + 1), //UpperRight + new Point(origin.Key.X - 1, origin.Key.Y - 1), //LowerLeft + new Point(origin.Key.X + 1, origin.Key.Y - 1), //LowerRight + }; + + foreach (var pt in neighboringPoints) + { + //Todo: Find neighboring points + } + } + + return neighbors; + } + + private static KeyValuePair[,] createGrid(List> colorGrouping) + { + Point topLeft = new Point(int.MaxValue, int.MaxValue); + Point bottomRight = new Point(int.MinValue, int.MinValue); + + + foreach (var pair in colorGrouping) + { + if (pair.Key.X < topLeft.X) + topLeft.X = pair.Key.X; + + if (pair.Key.Y < topLeft.Y) + topLeft.Y = pair.Key.Y; + + if (pair.Key.X > bottomRight.X) + bottomRight.X = pair.Key.X; + + if (pair.Key.Y > bottomRight.Y) + bottomRight.Y = pair.Key.Y; + } + + int width = bottomRight.X - topLeft.X; + int height = bottomRight.Y - topLeft.Y; + return new KeyValuePair[width, height]; + } + private Dictionary>> separateColors(Bitmap img) { var colorGroupings = new Dictionary>>(); @@ -61,12 +137,13 @@ namespace OSCADSharp.Solids.Imported for (int row = 0; row < img.Height; row++) { var color = img.GetPixel(column, row); - if (!colorGroupings.ContainsKey(color.Name)) + string key = String.Format("{0}-{1}-{2}", color.R, color.G, color.B); + if (!colorGroupings.ContainsKey(key)) { - colorGroupings[color.Name] = new List>(); + colorGroupings[key] = new List>(); } - colorGroupings[color.Name].Add(new KeyValuePair(new Point(column, row), color)); + colorGroupings[key].Add(new KeyValuePair(new Point(column, row), color)); } }