Example #1
0
        public void ContainsTest()
        {
            var set = new IndexedSet <string>();

            Assert.False(set.Contains("A"));
            Assert.True(set.Add("A"));
            Assert.True(set.Contains("A"));
            Assert.False(set.Contains("B"));
        }
Example #2
0
        public static void RemoveRaycaster(Pointer3DRaycaster raycaster)
        {
            if (!raycasters.Remove(raycaster))
            {
                return;
            }

            if (!processingRaycasters.Contains(raycaster) && Active)
            {
                Instance.CleanUpRaycaster(raycaster);
            }
        }
Example #3
0
    static void Main(string[] args)
    {
        Console.WriteLine("Generating test set.");
        var rand = new Random();
        IndexedSet <Sha256_Long> set =
            new IndexedSet <Sha256_Long>(
                GenerateRandomHashes(rand, NTestItems),
                Sha256_Long.KeyBits);

        Console.WriteLine("Testing with random input.");
        int nFound           = 0;
        int nItems           = NTestItems;
        int waypointDistance = 100000;
        int waypoint         = 0;

        for (int i = 0; i < nItems; i++)
        {
            if (++waypoint == waypointDistance)
            {
                Console.WriteLine("Test lookups complete: " + (i + 1));
                waypoint = 0;
            }
            var item = RandomHash(rand);
            nFound += set.Contains(item) ? 1 : 0;
        }
        Console.WriteLine("Testing complete.");
        Console.WriteLine(String.Format("Found: {0} / {0}", nFound, nItems));
        Console.ReadKey();
    }
Example #4
0
        public void ExceptWithTest()
        {
            var firstSet  = new IndexedSet <string>();
            var secondSet = new IndexedSet <string>();

            firstSet.Add("A");

            secondSet.Add("A");
            secondSet.Add("B");

            secondSet.ExceptWith(firstSet);

            Assert.That(secondSet.Count, Is.EqualTo(1));
            Assert.False(secondSet.Contains("A"));
            Assert.True(secondSet.Contains("B"));
        }
 private bool InternalRegisterCanvasElementForLayoutRebuild(ICanvasElement element)
 {
     if (m_LayoutRebuildQueue.Contains(element))
     {
         return(false);
     }
     return(m_LayoutRebuildQueue.AddUnique(element));
 }
        private void IndexedSetContains()
        {
            bool c;

            for (int i = 0; i < count; i++)
            {
                c = indexedSet.Contains(data[i]);
            }
        }
Example #7
0
        public void RemoveTest()
        {
            var set = new IndexedSet <string>();

            Assert.False(set.Remove("A"));

            set.Add("A");

            Assert.True(set.Remove("A"));
            Assert.Zero(set.Count);
            Assert.False(set.Contains("A"));
        }
Example #8
0
        public void SimpleIndexedSetTest()
        {
            const double FirstElement  = 17;
            const double SecondElement = Math.PI;
            const double ThirdElement  = 6.23123438874;
            const double FourthElement = 43;

            var indexedSet = new IndexedSet <double>(new[] { FirstElement, SecondElement });

            Assert.Equal(2, indexedSet.Count);
            Assert.True(indexedSet.Contains(FirstElement));
            var elements = indexedSet.Elements.ToArray();

            Assert.Equal(SecondElement, elements[1]);
            Assert.Equal(SecondElement, indexedSet.GetElementByIndex(1));

            int secondElementIndex;

            Assert.True(indexedSet.TryGetIndex(Math.PI, out secondElementIndex));
            Assert.Equal(1, secondElementIndex);

            indexedSet.Add(ThirdElement);
            Assert.Equal(3, indexedSet.Count);
            Assert.True(indexedSet.Contains(ThirdElement));

            int fourthElementIndex;

            Assert.Throws <ArgumentException>(() => indexedSet.Add(ThirdElement));
            Assert.Throws <ArgumentOutOfRangeException>(() => indexedSet.GetElementByIndex(3));
            Assert.False(indexedSet.TryGetIndex(FourthElement, out fourthElementIndex));

            indexedSet.Add(ThirdElement, false);
            indexedSet.Add(FourthElement);
            Assert.Equal(FourthElement, indexedSet.GetElementByIndex(3));

            indexedSet.Clear();
            Assert.Equal(0, indexedSet.Count);

            Assert.Throws <ArgumentException>(() => new IndexedSet <double>(new[] { FirstElement, SecondElement, SecondElement }));
        }
Example #9
0
 private bool InternalRegisterCanvasElementForGraphicRebuild(ICanvasElement element)
 {
     if (m_PerformingGraphicUpdate)
     {
         Debug.LogError($"Trying to add {element} for graphic rebuild while we are already inside a graphic rebuild loop. This is not supported.");
         return(false);
     }
     if (m_GraphicRebuildQueue.Contains(element))
     {
         return(false);
     }
     m_GraphicRebuildQueue.Add(element);
     return(true);
 }
Example #10
0
        private bool InternalRegisterCanvasElementForLayoutRebuild(ICanvasElement element)
        {
            if (m_LayoutRebuildQueue.Contains(element))
            {
                return(false);
            }

            if (m_PerformingLayoutUpdate)
            {
                Debug.LogError(string.Format("Trying to add {0} for layout rebuild while we are already inside a layout rebuild loop. This is not supported.", element));
                return(false);
            }

            return(m_LayoutRebuildQueue.AddUnique(element));
        }
        private bool InternalRegisterCanvasElementForLayoutRebuild(ICanvasElement element)
        {
            if (m_LayoutRebuildQueue.Contains(element))
            {
                return(false);
            }

            /* TODO: this likely should be here but causes the error to show just resizing the game view (case 739376)
             * if (m_PerformingLayoutUpdate)
             * {
             *  Debug.LogError(string.Format("Trying to add {0} for layout rebuild while we are already inside a layout rebuild loop. This is not supported.", element));
             *  return false;
             * }*/

            return(m_LayoutRebuildQueue.AddUnique(element));
        }
Example #12
0
        public Region Retract(int distance)
        {
            working.ResetTo(this);
            foreach (Coord point in working.Ordering)
            {
                for (int x = Math.Max(0, point.X - distance), xd = Math.Min(Width - 1, point.X + distance); x < xd; x++)
                {
                    for (int y = Math.Max(0, point.Y - distance), yd = Math.Min(Height - 1, point.Y + distance); y < yd; y++)
                    {
                        if (Math.Abs(point.X - x) + Math.Abs(point.Y - y) <= distance && !working.Contains(Coord.Get(x, y)))
                        {
                            Remove(point);
                            goto NEXT;
                        }
                    }
                }
NEXT:
                continue;
            }
            return(this);
        }
Example #13
0
    static void Main()
    {
        var n = int.Parse(Console.ReadLine());

        var set = new IndexedSet <int>();

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        while (n-- > 0)
        {
            var q = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            if (q[0] == 0)
            {
                set.Add(q[1]);
                Console.WriteLine(set.Count);
            }
            else if (q[0] == 1)
            {
                Console.WriteLine(set.Contains(q[1]) ? 1 : 0);
            }
            else if (q[0] == 2)
            {
                set.Remove(q[1]);
            }
            else
            {
                foreach (var x in set.GetItems(x => x >= q[1], x => x <= q[2]))
                {
                    Console.WriteLine(x);
                }
            }
        }
        Console.Out.Flush();
    }
        protected virtual void ProcessRaycast()
        {
            // use another list to iterate raycasters
            // incase that raycasters may changed during this process cycle
            processingRaycasters.AddRange(raycasters);

            for (var i = processingRaycasters.Count - 1; i >= 0; --i)
            {
                var raycaster = processingRaycasters[i];

                if (raycaster == null || !raycasters.Contains(raycaster))
                {
                    continue;
                }

                raycaster.Raycast();
                var result = raycaster.FirstRaycastResult();

                // prepare raycaster value
                var scrollDelta  = raycaster.GetScrollDelta();
                var raycasterPos = raycaster.transform.position;
                var raycasterRot = raycaster.transform.rotation;

                // hover event
                var hoverEventData = raycaster.HoverEventData;
                hoverEventData.Reset();
                hoverEventData.delta                 = Vector2.zero;
                hoverEventData.scrollDelta           = scrollDelta;
                hoverEventData.position              = ScreenCenterPoint;
                hoverEventData.pointerCurrentRaycast = result;

                hoverEventData.position3DDelta = raycasterPos - hoverEventData.position3D;
                hoverEventData.position3D      = raycasterPos;
                hoverEventData.rotationDelta   = Quaternion.Inverse(hoverEventData.rotation) * raycasterRot;
                hoverEventData.rotation        = raycasterRot;

                if (hoverEventData.pointerEnter != result.gameObject)
                {
                    HandlePointerExitAndEnter(hoverEventData, result.gameObject);
                }

                // buttons event
                for (int j = 0, jmax = raycaster.ButtonEventDataList.Count; j < jmax; ++j)
                {
                    var buttonEventData = raycaster.ButtonEventDataList[j];
                    if (buttonEventData == null)
                    {
                        continue;
                    }

                    buttonEventData.Reset();
                    buttonEventData.delta                 = Vector2.zero;
                    buttonEventData.scrollDelta           = scrollDelta;
                    buttonEventData.position              = ScreenCenterPoint;
                    buttonEventData.pointerCurrentRaycast = result;

                    buttonEventData.position3DDelta = hoverEventData.position3DDelta;
                    buttonEventData.position3D      = hoverEventData.position3D;
                    buttonEventData.rotationDelta   = hoverEventData.rotationDelta;
                    buttonEventData.rotation        = hoverEventData.rotation;

                    ProcessPress(buttonEventData);

                    var hoverGO = buttonEventData.eligibleForClick ? result.gameObject : null;
                    if (buttonEventData.pointerEnter != hoverGO)
                    {
                        HandlePointerExitAndEnter(buttonEventData, hoverGO);
                    }

                    ProcessDrag(buttonEventData);
                }

                // scroll event
                if (result.isValid && !Mathf.Approximately(scrollDelta.sqrMagnitude, 0.0f))
                {
                    var scrollHandler = ExecuteEvents.GetEventHandler <IScrollHandler>(result.gameObject);
                    ExecuteEvents.ExecuteHierarchy(scrollHandler, hoverEventData, ExecuteEvents.scrollHandler);
                }
            }

            processingRaycasters.Clear();
        }
        protected virtual void ProcessRaycast()
        {
            if (m_processedFrame == Time.frameCount)
            {
                return;
            }
            m_processedFrame = Time.frameCount;

            // use another list to iterate raycasters
            // incase that raycasters may changed during this process cycle
            for (int i = 0, imax = raycasters.Count; i < imax; ++i)
            {
                var r = raycasters[i];

                if (r != null)
                {
                    processingRaycasters.Add(r);
                }
            }

            for (var i = processingRaycasters.Count - 1; i >= 0; --i)
            {
                var raycaster = processingRaycasters[i];
                if (raycaster == null)
                {
                    continue;
                }

                raycaster.Raycast();
                var result = raycaster.FirstRaycastResult();

                // prepare raycaster value
                var scrollDelta  = raycaster.GetScrollDelta();
                var raycasterPos = raycaster.transform.position;
                var raycasterRot = raycaster.transform.rotation;

                var hoverEventData = raycaster.HoverEventData;
                if (hoverEventData == null)
                {
                    continue;
                }

                // gen shared data and put in hover event
                hoverEventData.Reset();
                hoverEventData.delta                 = Vector2.zero;
                hoverEventData.scrollDelta           = scrollDelta;
                hoverEventData.position              = ScreenCenterPoint;
                hoverEventData.pointerCurrentRaycast = result;

                hoverEventData.position3DDelta = raycasterPos - hoverEventData.position3D;
                hoverEventData.position3D      = raycasterPos;
                hoverEventData.rotationDelta   = Quaternion.Inverse(hoverEventData.rotation) * raycasterRot;
                hoverEventData.rotation        = raycasterRot;

                // copy data to other button event
                for (int j = 0, jmax = raycaster.ButtonEventDataList.Count; j < jmax; ++j)
                {
                    var buttonEventData = raycaster.ButtonEventDataList[j];
                    if (buttonEventData == null || buttonEventData == hoverEventData)
                    {
                        continue;
                    }

                    buttonEventData.Reset();
                    buttonEventData.delta                 = Vector2.zero;
                    buttonEventData.scrollDelta           = scrollDelta;
                    buttonEventData.position              = ScreenCenterPoint;
                    buttonEventData.pointerCurrentRaycast = result;

                    buttonEventData.position3DDelta = hoverEventData.position3DDelta;
                    buttonEventData.position3D      = hoverEventData.position3D;
                    buttonEventData.rotationDelta   = hoverEventData.rotationDelta;
                    buttonEventData.rotation        = hoverEventData.rotation;
                }

                ProcessPress(hoverEventData);
                ProcessMove(hoverEventData);
                ProcessDrag(hoverEventData);

                // other buttons event
                for (int j = 1, jmax = raycaster.ButtonEventDataList.Count; j < jmax; ++j)
                {
                    var buttonEventData = raycaster.ButtonEventDataList[j];
                    if (buttonEventData == null || buttonEventData == hoverEventData)
                    {
                        continue;
                    }

                    buttonEventData.pointerEnter = hoverEventData.pointerEnter;

                    ProcessPress(buttonEventData);
                    ProcessDrag(buttonEventData);
                }

                // scroll event
                if (result.isValid && !Mathf.Approximately(scrollDelta.sqrMagnitude, 0.0f))
                {
                    var scrollHandler = ExecuteEvents.GetEventHandler <IScrollHandler>(result.gameObject);
                    ExecuteEvents.ExecuteHierarchy(scrollHandler, hoverEventData, ExecuteEvents.scrollHandler);
                }
            }

            if (isActiveAndEnabled)
            {
                for (var i = processingRaycasters.Count - 1; i >= 0; --i)
                {
                    var r = processingRaycasters[i];
                    if (!raycasters.Contains(r))
                    {
                        CleanUpRaycaster(r);
                    }
                }
            }
            else
            {
                for (var i = processingRaycasters.Count - 1; i >= 0; --i)
                {
                    CleanUpRaycaster(processingRaycasters[i]);
                }
            }

            processingRaycasters.Clear();
        }
Example #16
0
        public void IndexerSetter()
        {
            set[0] = 40;
            Assert.AreEqual(40, set[0]);
            Assert.IsFalse(set.Contains(10));
            AssertItemsOrder();

            set[0] = 30;
            Assert.AreEqual(30, set[0]);
            Assert.AreEqual(40, set[2]);
            AssertItemsOrder();

            set[0] = 30;
            Assert.AreEqual(30, set[0]);
            Assert.AreEqual(40, set[2]);
            AssertItemsOrder();
        }
Example #17
0
        /// <summary>Builds the csharp code containing the row layout structure.</summary>
        /// <param name="layout">The layout to use.</param>
        /// <param name="databaseName">The database name (only used for the structure name).</param>
        /// <param name="tableName">The table name (only used for the structure name).</param>
        /// <param name="className">The name of the class to generate.</param>
        /// <param name="nameSpace">The namespace to use for the class (defaults to "Database").</param>
        /// <param name="namingStrategy">Naming strategy for classes, properties, structures and fields.</param>
        /// <returns>Returns a string containing csharp code.</returns>
        public static GenerateTableCodeResult GenerateStruct(this RowLayout layout, string databaseName, string tableName = null, string className = null,
                                                             string nameSpace = null, NamingStrategy namingStrategy = NamingStrategy.CamelCase)
        {
            if (layout == null)
            {
                throw new ArgumentNullException(nameof(layout));
            }

            #region GetName()

            string[] GetNameParts(string text) => text.ReplaceInvalidChars(ASCII.Strings.Letters + ASCII.Strings.Digits, "_").Split('_').SelectMany(s => s.SplitCamelCase()).ToArray();

            string GetName(string text) =>
            namingStrategy switch
            {
                NamingStrategy.CamelCase => GetNameParts(text).JoinCamelCase(),
                NamingStrategy.SnakeCase => GetNameParts(text).JoinSnakeCase(),
                NamingStrategy.Exact => text,
                _ => throw new NotImplementedException($"Unknown NamingStrategy {namingStrategy}.")
            };

            #endregion

            if (nameSpace == null)
            {
                nameSpace = "Database";
            }

            if (databaseName == null)
            {
                throw new ArgumentNullException(nameof(databaseName));
            }

            if (tableName == null)
            {
                tableName = layout.Name;
            }

            var fieldNameLookup = new Dictionary <int, string>();
            var idCount         = layout.Identifier.Count();
            var idFields        = (idCount == 0 ? layout : layout.Identifier).ToList();
            var code            = new StringBuilder();
            code.AppendLine("//-----------------------------------------------------------------------");
            code.AppendLine("// <summary>");
            code.AppendLine("// Autogenerated table class");
            code.AppendLine($"// Using {typeof(ITableExtensions).Assembly.FullName}");
            code.AppendLine("// </summary>");
            code.AppendLine("// <auto-generated />");
            code.AppendLine("//-----------------------------------------------------------------------");
            code.AppendLine();
            code.AppendLine("using System;");
            code.AppendLine("using System.Globalization;");
            code.AppendLine("using Cave.Data;");

            #region Build lookup tables

            void BuildLookupTables()
            {
                var uniqueFieldNames = new IndexedSet <string>();

                foreach (var field in layout)
                {
                    var sharpName = GetName(field.Name);
                    var i         = 0;
                    while (uniqueFieldNames.Contains(sharpName))
                    {
                        sharpName = GetName(field.Name) + ++i;
                    }

                    uniqueFieldNames.Add(sharpName);
                    fieldNameLookup[field.Index] = sharpName;
                }
            }

            BuildLookupTables();

            #endregion

            if (className == null)
            {
                className = GetName(databaseName) + GetName(tableName) + "Row";
            }

            code.AppendLine();
            code.AppendLine($"namespace {nameSpace}");
            code.AppendLine("{");
            code.AppendLine($"\t/// <summary>Table structure for {layout.Name}.</summary>");
            code.AppendLine($"\t[Table(\"{layout.Name}\")]");
            code.AppendLine($"\tpublic partial struct {className} : IEquatable<{className}>");
            code.AppendLine("\t{");

            #region static Parse()

            code.AppendLine($"\t\t/// <summary>Converts the string representation of a row to its {className} equivalent.</summary>");
            code.AppendLine("\t\t/// <param name=\"data\">A string that contains a row to convert.</param>");
            code.AppendLine($"\t\t/// <returns>A new {className} instance.</returns>");
            code.AppendLine($"\t\tpublic static {className} Parse(string data) => Parse(data, CultureInfo.InvariantCulture);");
            code.AppendLine();
            code.AppendLine($"\t\t/// <summary>Converts the string representation of a row to its {className} equivalent.</summary>");
            code.AppendLine("\t\t/// <param name=\"data\">A string that contains a row to convert.</param>");
            code.AppendLine("\t\t/// <param name=\"provider\">The format provider (optional).</param>");
            code.AppendLine($"\t\t/// <returns>A new {className} instance.</returns>");
            code.AppendLine($"\t\tpublic static {className} Parse(string data, IFormatProvider provider) => CsvReader.ParseRow<{className}>(data, provider);");

            #endregion

            #region Add fields

            foreach (var field in layout)
            {
                code.AppendLine();
                code.AppendLine($"\t\t/// <summary>{field} {field.Description}.</summary>");
                if (!string.IsNullOrEmpty(field.Description))
                {
                    code.AppendLine($"\t\t[Description(\"{field} {field.Description}\")]");
                }

                code.Append("\t\t[Field(");
                var i = 0;

                void AddAttribute <T>(T value, Func <string> content)
                {
                    if (Equals(value, default))
                    {
                        return;
                    }

                    if (i++ > 0)
                    {
                        code.Append(", ");
                    }

                    code.Append(content());
                }

                if (field.Flags != 0)
                {
                    code.Append("Flags = ");
                    var flagCount = 0;
                    foreach (var flag in field.Flags.GetFlags())
                    {
                        if (flagCount++ > 0)
                        {
                            code.Append(" | ");
                        }

                        code.Append("FieldFlags.");
                        code.Append(flag);
                    }

                    code.Append(", ");
                }

                var sharpName = fieldNameLookup[field.Index];
                if (sharpName != field.Name)
                {
                    AddAttribute(field.Name, () => $"Name = \"{field.Name}\"");
                }

                if (field.MaximumLength < int.MaxValue)
                {
                    AddAttribute(field.MaximumLength, () => $"Length = {(int)field.MaximumLength}");
                }

                AddAttribute(field.AlternativeNames, () => $"AlternativeNames = \"{field.AlternativeNames.Join(", ")}\"");
                AddAttribute(field.DisplayFormat, () => $"DisplayFormat = \"{field.DisplayFormat.EscapeUtf8()}\"");
                code.AppendLine(")]");
                if ((field.DateTimeKind != DateTimeKind.Unspecified) || (field.DateTimeType != DateTimeType.Undefined))
                {
                    code.AppendLine($"\t\t[DateTimeFormat({field.DateTimeKind}, {field.DateTimeType})]");
                }

                if (field.StringEncoding != 0)
                {
                    code.AppendLine($"\t\t[Cave.IO.StringFormat(Cave.IO.StringEncoding.{field.StringEncoding})]");
                }

                code.AppendLine($"\t\tpublic {field.DotNetTypeName} {sharpName};");
            }

            #endregion

            #region ToString()

            {
                code.AppendLine();
                code.AppendLine("\t\t/// <summary>Gets a string representation of this row.</summary>");
                code.AppendLine("\t\t/// <returns>Returns a string that can be parsed by <see cref=\"Parse(string)\"/>.</returns>");
                code.AppendLine("\t\tpublic override string ToString() => ToString(CultureInfo.InvariantCulture);");
                code.AppendLine();
                code.AppendLine("\t\t/// <summary>Gets a string representation of this row.</summary>");
                code.AppendLine("\t\t/// <returns>Returns a string that can be parsed by <see cref=\"Parse(string, IFormatProvider)\"/>.</returns>");
                code.AppendLine("\t\tpublic string ToString(IFormatProvider provider) => CsvWriter.RowToString(this, provider);");
            }

            #endregion

            #region GetHashCode()

            {
                code.AppendLine();
                if (idCount == 1)
                {
                    var idField     = layout.Identifier.First();
                    var idFieldName = fieldNameLookup[idField.Index];
                    code.AppendLine($"\t\t/// <summary>Gets the hash code for the identifier of this row (field {idFieldName}).</summary>");
                    code.AppendLine("\t\t/// <returns>A hash code for the identifier of this row.</returns>");
                    code.Append("\t\tpublic override int GetHashCode() => ");
                    code.Append(idFieldName);
                    code.AppendLine(".GetHashCode();");
                }
                else
                {
                    if (idCount == 0)
                    {
                        code.AppendLine("\t\t/// <summary>Gets the hash code based on all values of this row (no identififer defined).</summary>");
                    }
                    else
                    {
                        var names = idFields.Select(field => fieldNameLookup[field.Index]).Join(", ");
                        code.AppendLine($"\t\t/// <summary>Gets the hash code for the identifier of this row (fields {names}).</summary>");
                    }

                    code.AppendLine("\t\t/// <returns>A hash code for the identifier of this row.</returns>");
                    code.AppendLine("\t\tpublic override int GetHashCode() =>");
                    var first = true;
                    foreach (var idField in idFields)
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            code.AppendLine(" ^");
                        }

                        code.Append($"\t\t\t{fieldNameLookup[idField.Index]}.GetHashCode()");
                    }

                    code.AppendLine(";");
                }
            }

            #endregion

            #region Equals()

            {
                code.AppendLine();
                code.AppendLine("\t\t/// <inheritdoc/>");
                code.AppendLine($"\t\tpublic override bool Equals(object other) => other is {className} row && Equals(row);");
                code.AppendLine();
                code.AppendLine("\t\t/// <inheritdoc/>");
                code.AppendLine($"\t\tpublic bool Equals({className} other)");
                code.AppendLine("\t\t{");
                code.AppendLine("\t\t\treturn");
                {
                    var first = true;
                    foreach (var field in layout)
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            code.AppendLine(" &&");
                        }

                        var name = fieldNameLookup[field.Index];
                        code.Append($"\t\t\t\tEquals(other.{name}, {name})");
                    }

                    code.AppendLine(";");
                }
                code.AppendLine("\t\t}");
            }

            #endregion

            code.AppendLine("\t}");
            code.AppendLine("}");
            code.Replace("\t", "    ");
            return(new()
            {
                ClassName = className,
                TableName = tableName,
                DatabaseName = databaseName,
                Code = code.ToString()
            });
        }
Example #18
0
        public static IndexedSet <Coord> Perimeter(this Radius r, Coord center, int radiusLength, bool surpassEdges, int width, int height)
        {
            IndexedSet <Coord> rim = new IndexedSet <Coord>();

            if (!surpassEdges && (center.X < 0 || center.X >= width || center.Y < 0 || center.Y > height))
            {
                return(rim);
            }
            if (radiusLength < 1)
            {
                rim.Add(center);
                return(rim);
            }
            switch (r)
            {
            case SquidGrid.Radius.Square:
            case SquidGrid.Radius.Cube: {
                for (int i = center.X - radiusLength; i <= center.X + radiusLength; i++)
                {
                    int x = i;
                    if (!surpassEdges)
                    {
                        x = Clamp(i, 0, width);
                    }
                    rim.Add(Coord.Get(x, Clamp(center.Y - radiusLength, 0, height)));
                    rim.Add(Coord.Get(x, Clamp(center.Y + radiusLength, 0, height)));
                }
                for (int j = center.Y - radiusLength; j <= center.Y + radiusLength; j++)
                {
                    int y = j;
                    if (!surpassEdges)
                    {
                        y = Clamp(j, 0, height);
                    }
                    rim.Add(Coord.Get(Clamp(center.X - radiusLength, 0, height), y));
                    rim.Add(Coord.Get(Clamp(center.X + radiusLength, 0, height), y));
                }
            }
            break;

            case SquidGrid.Radius.Diamond:
            case SquidGrid.Radius.Octahedron: {
                int xUp = center.X + radiusLength, xDown = center.X - radiusLength,
                    yUp = center.Y + radiusLength, yDown = center.Y - radiusLength;
                if (!surpassEdges)
                {
                    xDown = Clamp(xDown, 0, width);
                    xUp   = Clamp(xUp, 0, width);
                    yDown = Clamp(yDown, 0, height);
                    yUp   = Clamp(yUp, 0, height);
                }

                rim.Add(Coord.Get(xDown, center.Y));
                rim.Add(Coord.Get(xUp, center.Y));
                rim.Add(Coord.Get(center.X, yDown));
                rim.Add(Coord.Get(center.X, yUp));

                for (int i = xDown + 1, c = 1; i < center.X; i++, c++)
                {
                    int x = i;
                    if (!surpassEdges)
                    {
                        x = Clamp(i, 0, width);
                    }
                    rim.Add(Coord.Get(x, Clamp(center.Y - c, 0, height)));
                    rim.Add(Coord.Get(x, Clamp(center.Y + c, 0, height)));
                }
                for (int i = center.X + 1, c = 1; i < center.X + radiusLength; i++, c++)
                {
                    int x = i;
                    if (!surpassEdges)
                    {
                        x = Clamp(i, 0, width);
                    }
                    rim.Add(Coord.Get(x, Clamp(center.Y + radiusLength - c, 0, height)));
                    rim.Add(Coord.Get(x, Clamp(center.Y - radiusLength + c, 0, height)));
                }
            }
            break;

            default: {
                double theta;
                int    x, y, denom = 1;
                bool   anySuccesses;
                while (denom <= 256)
                {
                    anySuccesses = false;
                    for (int i = 1; i <= denom; i += 2)
                    {
                        theta = i * (pi2 / denom);
                        x     = (int)(Math.Cos(theta) * (radiusLength + 0.25)) + center.X;
                        y     = (int)(Math.Sin(theta) * (radiusLength + 0.25)) + center.Y;

                        if (!surpassEdges)
                        {
                            x = Clamp(x, 0, width);
                            y = Clamp(y, 0, height);
                        }
                        Coord p    = Coord.Get(x, y);
                        bool  test = !rim.Contains(p);

                        rim.Add(p);
                        anySuccesses = test || anySuccesses;
                    }
                    if (!anySuccesses)
                    {
                        break;
                    }
                    denom *= 2;
                }
                break;
            }
            }
            return(rim);
        }
Example #19
0
 public bool Contains(int indexID)
 {
     return(mIndexedSet.Contains(indexID));
 }