Beispiel #1
0
        private void debugBlock(SearchBlock block)
        {
            var color = Color.white;

            switch (block.Index % 5)
            {
            case 0: color = Color.red; break;

            case 1: color = Color.green; break;

            case 2: color = Color.blue; break;

            case 3: color = Color.yellow; break;

            case 4: color = Color.cyan; break;
            }

            for (int i = 0; i < block.Count; i++)
            {
                debugPoint(block.Get(i), false, color);
            }

            foreach (var index in block.InvestigatedIndices)
            {
                debugPoint(_points.Points[index], !_hasPoint || index != _pointIndex, color);
            }
        }
Beispiel #2
0
        private bool findBestPoint(SearchBlock block, out int pointIndex, out float pointValue)
        {
            var pickedIndex   = -1;
            var previousValue = 0f;

            var previousLeft  = -1;
            var previousRight = -1;

            if (_hasPreviousPoint)
            {
                var previousPoint = _points.Points[_previousPointIndex];
                previousLeft  = previousPoint.Left;
                previousRight = previousPoint.Right;
            }

            for (int i = 0; i < block.Count; i++)
            {
                var index = block.Indices[i];
                var point = block.Get(i);

                var vector    = _searchPosition - point.Position;
                var distance  = vector.magnitude;
                var direction = vector / distance;

                var value = distance;

                if (_hasPreviousPoint && (index == previousLeft || index == previousRight))
                {
                    value *= -1;
                }
                else
                {
                    if (_hasSearchDirection)
                    {
                        value *= -Vector3.Dot(direction, _searchDirection) * 0.5f + 1.5f;
                    }
                    else
                    {
                        value *= -Vector3.Dot(direction, _actor.HeadDirection) * 0.5f + 1.5f;
                    }
                }

                if (pickedIndex < 0 || (value > 0 && value < previousValue) || (value < 0 && previousValue < 0 && value > previousValue) || (value < 0 && previousValue > 0))
                {
                    pickedIndex   = i;
                    previousValue = value;
                }
            }

            pointIndex = pickedIndex;
            pointValue = previousValue;

            return(pointIndex >= 0);
        }
Beispiel #3
0
        private bool considerPoint(SearchBlock block, InvestigatedPoint point)
        {
            for (int i = 0; i < block.Count; i++)
            {
                if (areCloseEnough(point, block.Get(i)))
                {
                    block.Investigate(i);
                    markInvestigated(point);
                    return(true);
                }
            }

            return(false);
        }
Beispiel #4
0
        private void glimpse(SearchBlock block)
        {
            for (int i = block.Count - 1; i >= 0; i--)
            {
                var p = block.Get(i);

                if (canBeInvestigated(p))
                {
                    var point = new InvestigatedPoint(p.Position);
                    markInvestigated(point);

                    foreach (var friend in _friends)
                    {
                        friend.considerPoint(point);
                    }

                    block.Investigate(i);
                }
            }
        }