Exemplo n.º 1
0
        /// <summary>
        /// Kokoaa reitin useammasta ruutukentän symbolista.
        ///
        /// Määrittää, että tietyn ruutukentän symbolin (<c>tileSymbol</c>) kohdalla
        /// kutsutaan aliohjelmaa <c>f</c>. Huom! Käytä tämän aliohjelman kanssa metodia
        /// Execute.
        /// </summary>
        /// <param name="f">Aliohjelma, muotoa void LuoReittiolio(List&lt;Vector&gt; reitti, double leveys, double korkeus)</param>
        /// <param name="tileSymbols">Ruutukentän symbolit tiedostossa joista reitti muodostuu</param>
        public void SetRouteMethod(RouteMethod f, params TileType[] tileSymbols)
        {
            if (tileSymbols == null || tileSymbols.Length < 1)
            {
                throw new ArgumentException("Pass at least one tile symbol!");
            }

            Vector[] vectorTable  = new Vector[tileSymbols.Length];
            int      vectorsAdded = 0;

            for (int i = 0; i < tileSymbols.Length; i++)
            {
                int index = i;
                legend[tileSymbols[i]] = delegate(Vector p, double w, double h)
                {
                    vectorTable[index] = p;
                    if (++vectorsAdded >= tileSymbols.Length)
                    {
                        f(vectorTable.ToList(), w, h);
                    }
                };
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Luo kuvion annetusta kuvasta. Kuvassa tulee olla vain yksi
        /// yhtenäinen muoto (toisin sanoen kuvio ei voi koostua monesta osasta).
        /// </summary>
        /// <remarks>
        /// Kuvion luominen voi olla melko hidasta. Kannattaa luoda kuvio heti pelin alussa
        /// ja käyttää kerran luotua kuviota kaikille olioille.
        /// </remarks>
        /// <param name="image">Kuva, josta muoto luetaan.</param>
        public static Shape FromImage(Image image)
        {
            List <Vector> vertices = TextureToShapeConverter.DetectVertices(image.GetDataUInt().Cast <uint>().ToArray(), image.Width);

            for (int i = 0; i < vertices.Count; i++)
            {
                // Nämä voisi yhdistää, mutta pidetään erillisenä luettavuuden takia.
                vertices[i]  = new Vector(vertices[i].X / image.Width, vertices[i].Y / image.Height);
                vertices[i] -= new Vector((float)0.5, (float)0.5);
                vertices[i]  = new Vector(vertices[i].X, -vertices[i].Y); // Muoto tulee muuten ylösalaisin
            }

            Vector[] polygonVertices = new Vector[vertices.Count];
            for (int i = 0; i < vertices.Count; i++)
            {
                polygonVertices[i] = new Vector(vertices[i].X, vertices[i].Y);
            }
            try
            {
                List <List <Vector> > verts = PolygonManipulation.CDTDecomposer.ConvexPartition(polygonVertices.ToList());

                List <IndexTriangle> indices = FormIndices(verts, polygonVertices);

                ShapeCache cache = new ShapeCache(polygonVertices, indices.ToArray(), Array.ConvertAll(Enumerable.Range(0, vertices.Count).ToArray(), v => (short)v));
                return(new Polygon(cache));
            }
            catch (Exception e)
            {
                Debug.WriteLine("Kuvasta muodostettua muotoa ei voity täyttää kolmioilla jostain syystä.");
                Debug.WriteLine("Muotoa ei voida piirtää täytettynä värillä.");
                Debug.WriteLine(e.Message);
                ShapeCache cache = new ShapeCache(polygonVertices);
                return(new Polygon(cache));
            }
        }