Ejemplo n.º 1
0
        public GridPoint3D Translate(EDirection3D direction, int distance)
        {
            switch (direction)
            {
            case EDirection3D.Up:
                return(new GridPoint3D(X, Y + distance, Z));

            case EDirection3D.Down:
                return(new GridPoint3D(X, Y - distance, Z));

            case EDirection3D.Right:
                return(new GridPoint3D(X + distance, Y, Z));

            case EDirection3D.Left:
                return(new GridPoint3D(X - distance, Y, Z));

            case EDirection3D.Front:
                return(new GridPoint3D(X, Y, Z + distance));

            case EDirection3D.Back:
                return(new GridPoint3D(X, Y, Z - distance));

            default:
                throw new NotImplementedException();
            }
        }
Ejemplo n.º 2
0
        public GridPoint3D Rotate(EDirection3D direction)
        {
            switch (direction)
            {
            case EDirection3D.Up:
                return(new GridPoint3D(X, -Z, Y));

            case EDirection3D.Down:
                return(new GridPoint3D(X, Z, -Y));

            case EDirection3D.Front:
                return(new GridPoint3D(-X, Y, -Z));

            case EDirection3D.Back:
                return(new GridPoint3D(X, Y, Z));

            case EDirection3D.Left:
                return(new GridPoint3D(-Z, Y, X));

            case EDirection3D.Right:
                return(new GridPoint3D(Z, Y, -X));

            default:
                throw new NotImplementedException();
            }
        }
Ejemplo n.º 3
0
        public GridPoint3D(EDirection3D direction, int length = 1)
        {
            X = 0;
            Y = 0;
            Z = 0;

            switch (direction)
            {
            case EDirection3D.Up:
                Y = length;
                break;

            case EDirection3D.Down:
                Y = -length;
                break;

            case EDirection3D.Right:
                X = length;
                break;

            case EDirection3D.Left:
                X = -length;
                break;

            case EDirection3D.Front:
                Z = length;
                break;

            case EDirection3D.Back:
                Z = -length;
                break;

            default:
                throw new NotImplementedException();
            }
        }
Ejemplo n.º 4
0
 public static EGridAxis3D ToAxis(this EDirection3D direction)
 {
     return(m_Axes[(int)direction]);
 }
Ejemplo n.º 5
0
 public static EDirection3D GetOpposite(this EDirection3D direction)
 {
     return(m_Opposite[(int)direction]);
 }
Ejemplo n.º 6
0
 public GridHit3D(GridPoint3D point, EDirection3D face)
 {
     Point = point;
     Face  = face;
 }
Ejemplo n.º 7
0
        public static int Raycast(float startX, float startY, float startZ, float directionX, float directionY, float directionZ, GridHit3D[] hitBuffer)
        {
            int stepX = Math.Sign(directionX);
            int stepY = Math.Sign(directionY);
            int stepZ = Math.Sign(directionZ);

            if (stepX == 0 && stepY == 0 && stepZ == 0)
            {
                return(0);
            }

            int bufferSize = hitBuffer.Length;

            int currentX = (int)Math.Floor(startX);
            int currentY = (int)Math.Floor(startY);
            int currentZ = (int)Math.Floor(startZ);

            currentX = Math.Max(currentX, 0);
            currentY = Math.Max(currentY, 0);
            currentZ = Math.Max(currentZ, 0);

            float nextBoundX = CalculateBound(currentX, startX, stepX);
            float nextBoundY = CalculateBound(currentY, startY, stepY);
            float nextBoundZ = CalculateBound(currentZ, startZ, stepZ);

            float deltaX = (1f / directionX) * stepX;
            float deltaY = (1f / directionY) * stepY;
            float deltaZ = (1f / directionZ) * stepZ;

            float travelX = nextBoundX / directionX;
            float travelY = nextBoundY / directionY;
            float travelZ = nextBoundZ / directionZ;

            int iterator = 0;

            EDirection3D xExitFace = (stepX > 0 ? EDirection3D.Left : EDirection3D.Right);
            EDirection3D yExitFace = (stepY > 0 ? EDirection3D.Down : EDirection3D.Up);
            EDirection3D zExitFace = (stepZ > 0 ? EDirection3D.Back : EDirection3D.Front);

            EDirection3D selectedFace;
            float        startDecimalX = startX - (float)Math.Truncate(startX);
            float        startDecimalY = startY - (float)Math.Truncate(startY);
            float        startDecimalZ = startZ - (float)Math.Truncate(startZ);

            if (startDecimalX < startDecimalY && startDecimalX < startDecimalZ)
            {
                selectedFace = (directionX > 0 ? EDirection3D.Left : EDirection3D.Right);
            }
            else if (startDecimalY < startDecimalX && startDecimalY < startDecimalZ)
            {
                selectedFace = (directionY > 0 ? EDirection3D.Down : EDirection3D.Up);
            }
            else
            {
                selectedFace = (directionZ > 0 ? EDirection3D.Back : EDirection3D.Front);
            }

            while (iterator < bufferSize)
            {
                GridPoint3D point = new GridPoint3D(currentX, currentY, currentZ);
                if (travelX < travelY)
                {
                    if (travelX < travelZ)
                    {
                        hitBuffer[iterator++] = new GridHit3D(point, selectedFace);
                        selectedFace          = xExitFace;

                        currentX += stepX;
                        travelX  += deltaX;
                    }
                    else
                    {
                        hitBuffer[iterator++] = new GridHit3D(point, selectedFace);
                        selectedFace          = zExitFace;

                        currentZ += stepZ;
                        travelZ  += deltaZ;
                    }
                }
                else
                {
                    if (travelY < travelZ)
                    {
                        hitBuffer[iterator++] = new GridHit3D(point, selectedFace);
                        selectedFace          = yExitFace;

                        currentY += stepY;
                        travelY  += deltaY;
                    }
                    else
                    {
                        hitBuffer[iterator++] = new GridHit3D(point, selectedFace);
                        selectedFace          = zExitFace;

                        currentZ += stepZ;
                        travelZ  += deltaZ;
                    }
                }
            }

            return(iterator);
        }