예제 #1
0
        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());
                }
            }
        }
예제 #2
0
        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);
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }