示例#1
0
        public static bool TryTurn_Debug(Polygon myPoly, Polygon StationaryPoly, ref float amt, List <Vector2[]> lines, List <Color> linecolors)
        {
            Vector2 CircleCenter = myPoly.Position;

            Pair <float, bool, float>[] distances;
            float greatestMine = 0;
            float lowestOther  = -1;
            ArrayBuilder <Pair <float, bool, float> > build = new ArrayBuilder <Pair <float, bool, float> >(myPoly.NumberOfSides() + StationaryPoly.NumberOfSides());

            for (int x = 0; x < myPoly.NumberOfSides(); x++)
            {
                float next = LocationManager.getDistance(CircleCenter, myPoly.GetCorner(x));
                build.Add(new Pair <float, bool, float>(next, true, LocationManager.getRotation(CircleCenter, myPoly.GetCorner(x))));
                if (next > greatestMine)
                {
                    greatestMine = next;
                }
            }
            for (int x = 0; x < StationaryPoly.NumberOfSides(); x++)
            {
                float next = LocationManager.getDistance(CircleCenter, StationaryPoly.GetCorner(x));
                build.Add(new Pair <float, bool, float>(next, false, LocationManager.getRotation(CircleCenter, StationaryPoly.GetCorner(x))));
                if (lowestOther == -1 || next < lowestOther)
                {
                    lowestOther = next;
                }
            }
            distances = build.Finish();
            float currentMin = amt;

            for (int i = 0; i < distances.Length; i++)
            {
                for (int i2 = 0; i2 < (distances[i].second ? StationaryPoly.NumberOfSides() : myPoly.NumberOfSides()); i2++)
                {
                    Vector2[] line     = (distances[i].second ? StationaryPoly.GetEdge(i2) : myPoly.GetEdge(i2));
                    float     minAngle = distances[i].third;
                    foreach (float f in LocationManager.CircleIntersects_A(line, CircleCenter, distances[i].first))
                    {
                        lines.Add(new Vector2[] { Vector2.Add(new Vector2(-2, 0), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)), Vector2.Add(new Vector2(2, 0), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)) });
                        linecolors.Add(Color.Red);
                        lines.Add(new Vector2[] { Vector2.Add(new Vector2(0, -2), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)), Vector2.Add(new Vector2(0, 2), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)) });
                        linecolors.Add(Color.Red);
                        if (amt > 0)
                        {
                            if (f > minAngle && LocationManager.NormalRelitiveAngle(minAngle, f) < amt)
                            {
                                lines.Add(new Vector2[] { Vector2.Add(new Vector2(-8, 0), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)), Vector2.Add(new Vector2(8, 0), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)) });
                                linecolors.Add(Color.Blue);
                                lines.Add(new Vector2[] { Vector2.Add(new Vector2(0, -8), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)), Vector2.Add(new Vector2(0, 8), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)) });
                                linecolors.Add(Color.Blue);
                            }
                            if (f > (minAngle) && LocationManager.NormalRelitiveAngle(minAngle, f) < currentMin)
                            {
                                currentMin = LocationManager.NormalRelitiveAngle(minAngle, f);
                            }
                        }
                        else if (amt < 0)
                        {
                            if (f < minAngle && LocationManager.NormalRelitiveAngle(f, minAngle) < -amt)
                            {
                                lines.Add(new Vector2[] { Vector2.Add(new Vector2(-8, 0), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)), Vector2.Add(new Vector2(8, 0), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)) });
                                linecolors.Add(Color.Blue);
                                lines.Add(new Vector2[] { Vector2.Add(new Vector2(0, -8), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)), Vector2.Add(new Vector2(0, 8), LocationManager.moveByRotation(CircleCenter, distances[i].first, f)) });
                                linecolors.Add(Color.Blue);
                            }
                            if (f < minAngle && LocationManager.NormalRelitiveAngle(f, minAngle) < -currentMin)
                            {
                                currentMin = LocationManager.NormalRelitiveAngle(f, minAngle);
                            }
                        }
                    }
                }
            }
            if (currentMin == amt)
            {
                myPoly.Rotation += amt;
                return(false);
            }
            else
            {
                myPoly.Rotation += currentMin * .9f;
                amt             *= -.9f;
                return(true);
            }
        }