示例#1
0
 public override string ToString()
 {
     return($"{index} " + CompasEnumExtension.ToText(sides));
 }
示例#2
0
        void PrepareSamples()
        {
            var templates = new List <TileInfo>();
            var corners   = new byte[4];

            corners[(int)CornerEnum.TL] = CompasEnumExtension.ToCompasSet("WwN");
            corners[(int)CornerEnum.TR] = CompasEnumExtension.ToCompasSet("NnE");
            corners[(int)CornerEnum.BL] = CompasEnumExtension.ToCompasSet("SsW");
            corners[(int)CornerEnum.BR] = CompasEnumExtension.ToCompasSet("EeS");

            void update(TileInfo info, int index, CornerEnum corner, byte sides, byte ignoreSides)
            {
                info.index  = index;
                info.corner = corner;
                var cornerSet = corners[(int)corner];

                info.sides       = (byte)(sides & cornerSet);
                info.ignoreSides = (byte)(ignoreSides & cornerSet);
                templates.Add(info);
            }

            void add(int tl, int tr, int bl, int br, string sides, string ignoreSides)
            {
                var _sides       = CompasEnumExtension.ToCompasSet(sides);
                var _ignoreSides = CompasEnumExtension.ToCompasSet(ignoreSides);

                update(new TileInfo(), tl, CornerEnum.TL, _sides, _ignoreSides);
                update(new TileInfo(), tr, CornerEnum.TR, _sides, _ignoreSides);
                update(new TileInfo(), bl, CornerEnum.BL, _sides, _ignoreSides);
                update(new TileInfo(), br, CornerEnum.BR, _sides, _ignoreSides);
            }

            add(12, 13, 8, 9, "EeS", "wns");
            add(14, 15, 10, 11, "SsW", "new");
            add(4, 5, 0, 1, "NnE", "esw");
            add(6, 7, 2, 3, "NWw", "nes");

            add(22, 23, 18, 19, "NESW", "");

            TileInfo find(byte mask, CornerEnum corner)
            {
                var cornerSet = (byte)(corners[(int)corner] & mask);

                for (int i = 0; i < templates.Count; i++)
                {
                    var info = templates[i];
                    if (info.corner == corner)
                    {
                        var b = cornerSet & ~info.ignoreSides;
                        if (b == info.sides)
                        {
                            return(info);
                        }
                    }
                }
                throw new NotImplementedException();
            }

            samples.Add(0, new SampleInfo(0, 20, 21, 16, 17));
            samples.Add(255, new SampleInfo(255, 9, 10, 5, 6));
            for (int n = 0; n <= 0xFF; n++)
            {
                var text  = CompasEnumExtension.ToText((byte)n);
                var tl    = find((byte)n, CornerEnum.TL);
                var tr    = find((byte)n, CornerEnum.TR);
                var bl    = find((byte)n, CornerEnum.BL);
                var br    = find((byte)n, CornerEnum.BR);
                var index = tl.sides | tr.sides | bl.sides | br.sides;
                if (!samples.TryGetValue(index, out var sample))
                {
                    sample = new SampleInfo(index, tl.index, tr.index, bl.index, br.index);
                    samples.Add(index, sample);
                }
                indexes[n] = sample;
            }
        }