Example #1
0
        /// <summary>
        /// Finds all dynamic bodies touching a defined circle.
        /// </summary>
        /// <param name="radius">Radius.</param>
        /// <param name="output">Output.</param>
        public static void CircleCast(Vector2d position, long radius, FastList <LSBody> output)
        {
            long xMin = position.x - radius,
                 xmax = position.x + radius;
            long yMin = position.y - radius,
                 yMax = position.y + radius;

            //Find the partition tiles we have to search in first
            int gridXMin, gridXMax, gridYMin, gridYMax;

            Partition.GetGridBounds(xMin, xmax, yMin, yMax,
                                    out gridXMin, out gridXMax, out gridYMin, out gridYMax);


            for (int i = gridXMin; i <= gridXMax; i++)
            {
                for (int j = gridYMin; j <= gridYMax; j++)
                {
                    PartitionNode node = Partition.GetNode(i, j);
                    for (int k = 0; k < node.ContainedDynamicObjects.Count; k++)
                    {
                        var  body        = PhysicsManager.SimObjects [node.ContainedDynamicObjects [k]];
                        long minFastDist = body.Radius + radius;
                        //unnormalized distance value for comparison
                        minFastDist *= minFastDist;

                        if (body.Position.FastDistance(position) <= minFastDist)
                        {
                            //Body touches circle!
                            output.Add(body);
                        }
                    }
                }
            }
        }