Esempio n. 1
0
        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));
                }
            }
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
 protected virtual IEnumerable <Point> GetShiftPosition() => ShiftPosition.EnumIt(EffectSpriteColorSize, SpriteColorSize, Propensity);