public virtual void TryGetNearlyPreferredPosition(int distance) { Check(); Point spriteSize = SpriteColorSize; HashSet <Point> points = new HashSet <Point>(); foreach (WeightedPoint weightedPoint in PreferredPosition) { foreach (Point point in ShiftPosition.EnumItNearly(EffectSpriteColorSize, spriteSize, weightedPoint.Position, distance)) { points.Add(point); } } PreferredPosition.Clear(); EffectiveArea = GetEffectiveArea(); Value[,] valueMap = new Value[spriteSize.X, spriteSize.Y]; foreach (Point point in points) { foreach (Point selectPoint in EffectiveArea) { JPColor effectColor = EffectSpriteColor[point.X + selectPoint.X, point.Y + selectPoint.Y]; JPColor spriteColor = SpriteColor[selectPoint.X, selectPoint.Y]; valueMap[selectPoint.X, selectPoint.Y] = GetDeltaValue(effectColor, spriteColor); } if (ValueMapIsBetter(valueMap, out float averageValue)) { PreferredPosition.Add(new WeightedPoint(point, averageValue)); } } }
protected virtual Point[] GetEffectiveArea() { List <Point> result = new List <Point>(); IEnumerable <Point> enumPoints; int count = EffectSpriteColor.Length; if (count < ZipCount) { enumPoints = ShiftPosition.EnumIt(SpriteColorSize, Point.One, ShiftPositionPropensity.LineByLine); } else if (count < ZipCount * 3) { enumPoints = ShiftPosition.EnumIt(SpriteColorSize, Point.One, ShiftPositionPropensity.Random512); } else if (count < ZipCount * 6) { enumPoints = ShiftPosition.EnumIt(SpriteColorSize, Point.One, ShiftPositionPropensity.Interval2); } else { enumPoints = ShiftPosition.EnumIt(SpriteColorSize, Point.One, ShiftPositionPropensity.Interval3); } foreach (Point enumPoint in enumPoints) { JPColor enumPointColor = SpriteColor[enumPoint.X, enumPoint.Y]; if (enumPointColor.A > 0.25) { result.Add(enumPoint); } } return(result.ToArray()); }
protected virtual IEnumerable <Point> GetShiftPosition() => ShiftPosition.EnumIt(EffectSpriteColorSize, SpriteColorSize, Propensity);