internal void TemplateViewToTetrisIndex(Decorator decorator) { List <int> indexes; List <List <Node> > shapes; if (decorator is PuzzleGraph.Decorators.AbstractTetrisDecorator tetris) { indexes = tetris.Indexes; shapes = tetris.Shapes; } else { return; } indexes.Clear(); shapes.Clear(); TetrisTemplate template = Graph.MetaData.TetrisTemplate; for (int i = 0; i < SelectedTetrisShapes.Length; ++i) { if (SelectedTetrisShapes[i] && i < template.Shapes.Count) { indexes.Add(i); shapes.Add(template.Shapes[i].Select(node => new Node(node.X, node.Y)).ToList()); } } }
public void Draw(EditView view) { Graph graph = view.Graph; TetrisTemplate template = graph.MetaData.TetrisTemplate; double scale = view.TetrisTemplateScale; Vector origin = view.TetrisTemplateOrigin; graphics.Clear(graph.MetaData.BackgroundColor); if (template.Shapes.Count == 0) { return; } using (Brush activatedBrush = new SolidBrush(Color.Yellow), deactivatedBrush = new SolidBrush(graph.MetaData.ForegroundColor)) { for (int k = 0; k < template.Shapes.Count; ++k) { List <Node> shape = template.Shapes[k]; graphics.FillClosedCurve(view.SelectedTetrisShapes[k] ? activatedBrush : deactivatedBrush, shape.Select(node => new Vector(node.X, node.Y).MapToScreen(scale, origin).ToPoint()).ToArray(), System.Drawing.Drawing2D.FillMode.Alternate, 0.0f); } } float penWidth = (float)(borderPercent * scale); using (Pen pen = new Pen(graph.MetaData.BackgroundColor, penWidth)) { for (int k = 0; k < template.Shapes.Count; ++k) { List <Node> shape = template.Shapes[k]; graphics.DrawClosedCurve(pen, shape.Select(node => new Vector(node.X, node.Y).MapToScreen(scale, origin).ToPoint()).ToArray(), 0.0f, System.Drawing.Drawing2D.FillMode.Alternate); } } }
public void UpdateTetrisTemplateScaleAndOrigin(TetrisTemplate template) { SelectedTetrisShapes = new bool[template.Shapes.Count]; double marginSize = 10; if (template.Shapes.Count == 0) { TetrisTemplateOrigin = Vector.Zero; TetrisTemplateScale = 10.0; } double minX = double.PositiveInfinity, minY = double.PositiveInfinity; double maxX = double.NegativeInfinity, maxY = double.NegativeInfinity; foreach (List <Node> shape in template.Shapes) { foreach (Node node in shape) { minX = Math.Min(minX, node.X); minY = Math.Min(minY, node.Y); maxX = Math.Max(maxX, node.X); maxY = Math.Max(maxY, node.Y); } } TetrisTemplateScale = Math.Min((tetrisTemplateEditorSize.Y - marginSize * 2) / (maxY - minY), (tetrisTemplateEditorSize.X - marginSize * 2) / (maxX - minX)); TetrisTemplateOrigin = new Vector(-(minX + maxX) / 2 * TetrisTemplateScale + tetrisTemplateEditorSize.X / 2, -(minY + maxY) / 2 * TetrisTemplateScale + tetrisTemplateEditorSize.Y / 2); }
public static bool TetrisCompatible(Graph graph, List <int> indexes, List <List <Node> > shapes) { if (indexes.Count != shapes.Count) { return(false); } TetrisTemplate template = graph.MetaData.TetrisTemplate; for (int i = 0; i < indexes.Count; ++i) { int index = indexes[i]; if (index >= template.Shapes.Count) { return(false); } if (!ShapeCompatible(template.Shapes[index], shapes[i])) { return(false); } } return(true); }
public int QueryTetrisTemplatePosition(Vector query) { TetrisTemplate template = Graph.MetaData.TetrisTemplate; for (int k = 0; k < template.Shapes.Count; ++k) { List <Node> shape = template.Shapes[k]; double totalAngle = 0.0; for (int i = 0; i < shape.Count; ++i) { Node p0 = shape[i == 0 ? shape.Count - 1 : i - 1]; Node p1 = shape[i]; Vector v0 = new Vector(p0.X, p0.Y); Vector v1 = new Vector(p1.X, p1.Y); totalAngle += Vector.GetAngle(v0 - query, v1 - query); } if (totalAngle + 1e-6 >= 2 * Math.PI) { return(k); } } return(-1); }