示例#1
0
        public FlowField(PotentialField potentialField)
        {
            TargetNode          = potentialField.TargetNode;
            TargetWorldPosition = potentialField.TargetWorldPosition;
            GridTransformer     = potentialField.GridTransformer;
            FlowArray           = new Array2D <byte>(potentialField.PotentialArray.Width, potentialField.PotentialArray.Height);

            for (int y = 0; y < potentialField.PotentialArray.Height; y++)
            {
                for (int x = 0; x < potentialField.PotentialArray.Width; x++)
                {
                    var vector = potentialField[x, y];
                    if (vector.X == 0 && vector.Y == 0)
                    {
                        FlowArray[x, y] = 254;
                    }
                    else
                    {
                        var angle = MathF.Atan2(vector.Y, vector.X);
                        var index = (byte)((angle + HalfTurn) / FullTurn * StepAmount);
                        FlowArray[x, y] = index;
                    }
                }
            }
        }
示例#2
0
        public void ToGrid_CorrectPosition(Point2 gridSize, Vector2 scale, Vector2 position, Vector2 worldPositionToTransform, Point2 expectedGridPosition)
        {
            var transformer  = new GridTransformer(gridSize, scale, position);
            var gridPosition = transformer.ToGrid(worldPositionToTransform);

            Assert.AreEqual(expectedGridPosition, gridPosition);
        }
        public void GetHeading_ZeroPotentials_ZeroVector(Vector2 worldPosition)
        {
            const int width          = 3;
            const int height         = 3;
            var       transformer    = new GridTransformer(new Point2(width, height), new Vector2(1, 1));
            var       potentials     = new Array2D <float>(width, height);
            var       potentialField = new PotentialField(transformer, new Point2(), potentials);

            CheckHeading(potentialField, worldPosition, new Vector2(0, 0));
        }
        public Vector2 GetHeading(Vector2 currentPosition)
        {
            var gridCoords = GridTransformer.ToGrid(currentPosition);

            if (gridCoords == TargetNode)
            {
                return((TargetWorldPosition - currentPosition).Normalized);
            }
            return(this[gridCoords.X, gridCoords.Y]);
        }
示例#5
0
 public PotentialField(GridTransformer gridTransformer, Point2 targetNodePosition, Array2D <float> potentialArray) : base(gridTransformer)
 {
     if (potentialArray.Width != gridTransformer.GridSize.X || potentialArray.Height != gridTransformer.GridSize.Y)
     {
         throw new ArgumentException("The grid dimensions of the transformer have to match the array");
     }
     PotentialArray      = potentialArray;
     TargetNode          = targetNodePosition;
     TargetWorldPosition = gridTransformer.ToWorld(targetNodePosition);
 }
示例#6
0
        public AggregratedPotentialField(GridTransformer gridTransformer, params PotentialFieldBase[] potentialFields) : base(gridTransformer)
        {
            var firstPotentialField = potentialFields.First();

            TargetNode          = firstPotentialField.TargetNode;
            Width               = firstPotentialField.Width;
            Height              = firstPotentialField.Height;
            TargetWorldPosition = potentialFields.First().TargetWorldPosition;
            PotentialFields     = potentialFields;
        }
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        GridTransformer gridTrans = (GridTransformer)target;

        if (GUILayout.Button("Transfrom Line"))
        {
            gridTrans.TransformLine();
        }
    }
示例#8
0
        public PotentialArray(GridTransformer gridTransformer, Array2D <float>[] potentialArrays)
        {
            if (potentialArrays == null)
            {
                throw new ArgumentException("potentialArray cannot be null");
            }
            foreach (var array in potentialArrays)
            {
                if (array.Width != gridTransformer.GridSize.X || array.Height != gridTransformer.GridSize.Y)
                {
                    throw new ArgumentException("The grid dimensions of the transformer have to match the array");
                }
            }

            GridTransformer = gridTransformer;
            Arrays          = potentialArrays;
        }
 /// <summary>
 /// Creates a new <see cref="DynamicPotentialField"/>
 /// </summary>
 /// <param name="pathfindaxManager"></param>
 /// <param name="gridTransformer"></param>
 /// <param name="interval">The update interval in milliseconds.</param>
 public DynamicPotentialField(IPathfindaxManager pathfindaxManager, GridTransformer gridTransformer, float interval) : base(gridTransformer)
 {
     pathfindaxManager.CreatePotentialFieldUpdater(this, interval);
     PotentialArray = new Array2D <float>(gridTransformer.GridSize.X, gridTransformer.GridSize.Y);
 }
示例#10
0
        public void UpdateGridPosition(GridTransformer gridTransformer)
        {
            var worldPosition = _worldPositionProvider.Invoke();

            GridPosition = gridTransformer.ToGrid(worldPosition);
        }
示例#11
0
 public PotentialFieldBase(GridTransformer gridTransformer)
 {
     GridTransformer = gridTransformer;
 }
示例#12
0
 public PotentialField(GridTransformer gridTransformer, Point2 targetNodePosition) : base(gridTransformer)
 {
     TargetNode          = targetNodePosition;
     TargetWorldPosition = gridTransformer.ToWorld(targetNodePosition);
 }
示例#13
0
 public PotentialField(GridTransformer gridTransformer, Point2 targetNodePosition, params Array2D <float>[] potentialArrays)
 {
     TargetNode     = targetNodePosition;
     PotentialArray = new PotentialArray(gridTransformer, potentialArrays);
 }
示例#14
0
        //here we go, thats the method called by vvvv each frame
        //all data handling should be in here
        public void Evaluate(int SpreadMax)
        {
            double width; FPinWidth.GetValue(0, out width);
            double height; FPinHeight.GetValue(0, out height);

            // if something changed, recreate Trafo
            if (FInputGridFrom.PinIsChanged || FInputGridTo.PinIsChanged || width != FWidth || height != FHeight)
            {
                // prepare GridTransformer
                FTrafo = new GridTransformer();

                int     i, j;
                Point2D p1, p2, p3;

                FWidth  = (int)width;
                FHeight = (int)height;

                // check Input ranges
                FBufSize = (int)height * (int)width * 2;
                if (FInputGridFrom.SliceCount != FBufSize || FInputGridTo.SliceCount != FBufSize)
                {
                    return;
                }


                // loop through points and create triangles
                for (i = 0; i < FHeight - 1; ++i)
                {
                    for (j = 0; j < FWidth - 1; ++j)
                    {
                        int index = j + i * FWidth;

                        // upper triangle
                        FInputGridFrom.GetValue2D(index, out p1.x, out p1.y);
                        FInputGridFrom.GetValue2D(index + 1, out p2.x, out p2.y);
                        FInputGridFrom.GetValue2D(index + FWidth, out p3.x, out p3.y);
                        Triangle triFrom1 = new Triangle(p1, p2, p3);

                        FInputGridTo.GetValue2D(index, out p1.x, out p1.y);
                        FInputGridTo.GetValue2D(index + 1, out p2.x, out p2.y);
                        FInputGridTo.GetValue2D(index + FWidth, out p3.x, out p3.y);
                        Triangle triTo1 = new Triangle(p1, p2, p3);

                        FTrafo.Insert(triFrom1, triTo1);

                        // lower triangle
                        FInputGridFrom.GetValue2D(index + 1, out p1.x, out p1.y);
                        FInputGridFrom.GetValue2D(index + FWidth, out p2.x, out p2.y);
                        FInputGridFrom.GetValue2D(index + FWidth + 1, out p3.x, out p3.y);
                        Triangle triFrom2 = new Triangle(p1, p2, p3);

                        FInputGridTo.GetValue2D(index + 1, out p1.x, out p1.y);
                        FInputGridTo.GetValue2D(index + FWidth, out p2.x, out p2.y);
                        FInputGridTo.GetValue2D(index + FWidth + 1, out p3.x, out p3.y);
                        Triangle triTo2 = new Triangle(p1, p2, p3);

                        FTrafo.Insert(triFrom2, triTo2);
                    }
                }
            }

            ///////////////////////////////////////////////////////
            // do transformation

            // prepare data
            int            sliceCount = FInputPoints.SliceCount;
            Point2D        pIn, pOut;
            List <Point2D> pList = new List <Point2D>();

            int[] hitter;
            hitter = new int[sliceCount / 2];
            int number = (sliceCount / 2);

            // loop throug input points and calc Transformation
            for (int i = 0; i < sliceCount / 2; ++i)
            {
                FInputPoints.GetValue2D(i, out pIn.x, out pIn.y);
                if (FTrafo.Transform(pIn, out pOut))   // inside ?
                {
                    pList.Add(pOut);
                    hitter[i] = 1;
                }
                else
                {
                    hitter[i] = 0;
                }
            }

            // set final slicecount
            FOutputPoints.SliceCount = pList.Count * 2;
            FOutputHit.SliceCount    = number;
            // set output
            for (int i = 0; i < pList.Count; ++i)
            {
                FOutputPoints.SetValue2D(i, pList[i].x, pList[i].y);
                FOutputHit.SetValue(i, hitter[i]);
            }
            for (int i = 0; i < number; ++i)
            {
                FOutputHit.SetValue(i, hitter[i]);
            }
        }