Пример #1
0
        bool GetSlidePositionOffBlock(Point2 LastPosition, Point2 newPosition, Point2 tileCentre, int tileSize, float radius, ref Point2 slidePosition)
        {
            bool basicMethod = true;
            if (basicMethod)
            {
                    OgreMaths.Point[] positions = new OgreMaths.Point[4];
                Box l_tile = new Box(new OgreMaths.Point(tileCentre), tileSize + radius * 2);

                l_tile.GetLine((int)Box.Corner.TOP_LEFT);

                positions[0] = new OgreMaths.Point(newPosition);
                positions[0].x = Math.Min(newPosition.X, l_tile.corners[(int)Box.Corner.TOP_LEFT].x);

                positions[1] = new OgreMaths.Point(newPosition);
                positions[1].y = Math.Min(newPosition.Y, l_tile.corners[(int)Box.Corner.TOP_LEFT].y);

                positions[2] = new OgreMaths.Point(newPosition);
                positions[2].x = Math.Max(newPosition.X, l_tile.corners[(int)Box.Corner.BOTTOM_RIGHT].x);

                positions[3] = new OgreMaths.Point(newPosition);
                positions[3].y = Math.Max(newPosition.Y, l_tile.corners[(int)Box.Corner.BOTTOM_RIGHT].y);

                int shortestLengthIndex = 0;
                float shortestLength = OgreMaths.Point.DistanceSquared(new OgreMaths.Point(newPosition), positions[0]);
                for (int i = 0; i < 4; i++)
                {
                    float length = OgreMaths.Point.DistanceSquared(new OgreMaths.Point(newPosition), positions[i]);
                    if (length < shortestLength)
                    {
                        shortestLength = length;
                        shortestLengthIndex = i;
                    }
                }

                slidePosition = new Point2(positions[shortestLengthIndex]);
                return true;
            }
            else
            {

                Box l_tile = new Box(new OgreMaths.Point(tileCentre), tileSize);
                Line l_vectorIn =
                    new Line(new OgreMaths.Point(LastPosition),
                    new OgreMaths.Point(newPosition.X, newPosition.Y));

                OgreMaths.Point l_vectorNormalised = l_vectorIn.GetNormalisedVector();
                l_vectorIn.b += l_vectorNormalised.Mult(radius);

                Line lineChosen = new Line();
                OgreMaths.Point intersect = new OgreMaths.Point();
                OgreMaths.Point reflectionPoint = new OgreMaths.Point();

                bool intersectionHappened = Box.CalcReflectVectorWithBox(new OgreMaths.Point(tileCentre), tileSize,
                    l_vectorIn,
                    ref reflectionPoint, ref intersect);

                if (intersectionHappened)
                {
                    OgreMaths.Point reflectVec = reflectionPoint - intersect;
                    reflectVec.Normalise();
                    slidePosition = new Point2(intersect + reflectVec.Mult(radius + 4.5f));
                }
                /*
                if (intersectionHappened)
                {
                    OgreMaths.Point vecDir = l_vectorIn.GetVector();
                    OgreMaths.Point newDirection = lineChosen.GetVector();

                    float temp = newDirection.x;
                    newDirection.x = newDirection.y;
                    newDirection.y = newDirection.x;

                    newDirection.x = Math.Abs(newDirection.x) * vecDir.x / -Math.Abs(vecDir.x);
                    newDirection.y = Math.Abs(newDirection.y) * vecDir.y / -Math.Abs(vecDir.y);
                    OgreMaths.Point directionApplied = intersect + newDirection;

                    slidePosition = new Point2(intersect);//directionApplied);
                    slidePosition = new Point2(directionApplied);
                }
                 */

                return intersectionHappened;
            }
        }