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); } }
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); }
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); }
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); } } }