示例#1
0
        private float getClipped(Layer2DObject layer, int xph, int v)
        {
            int x = xph;
            int y = v;

            if (xph < layer.Resolution.X)
            {
                x = JryMath.Abs(xph);
            }
            if (v < layer.Resolution.Y)
            {
                y = JryMath.Abs(v);
            }

            if (xph >= layer.Resolution.X)
            {
                x = 2 * layer.Resolution.X - xph - 2;
            }
            if (v >= layer.Resolution.Y)
            {
                y = 2 * layer.Resolution.Y - v - 2;
            }



            return(layer[x, y].Value);
        }
示例#2
0
        private void ds(Layer2DObject layer, int sizePow2, float ba, INoiseParameters np, IRandom2 rand)
        {
            int size = sizePow2 - 1;
            int log  = (int)JryMath.Log(size, 2);

            // HACK
            var x = np as DsNoiseParameters;

            for (int l = 0; l < log; l++)
            {
                if (l == 0 && x != null)
                {
                    hackeddiamond(layer, ba, x.HillProbability);
                }
                else
                {
                    diamond(layer, size, ba, l, rand);
                }


                square(layer, size, ba, l, rand);
                ba *= np.Amplitude;
                if (l >= np.ToDepth)
                {
                    ba *= np.Amplitude;
                }
            }
        }
示例#3
0
        public ILayerMasked Do(INoiseParameters param, Vector2 size)
        {
            var dt = DateTime.Now.Millisecond;

            System.Diagnostics.Debug.Print(dt + "Rand" + _rand.NextD(1, 2));

            var           pow      = (int)JryMath.Max(JryMath.Ceil(JryMath.Log(size.X, 2)), JryMath.Ceil(JryMath.Log(size.Y, 2)));
            int           sizePow2 = (int)JryMath.Pow(2, pow) + 1;
            Layer2DObject layer    = new Layer2DObject(sizePow2, sizePow2);

            setupBaseDS(sizePow2, layer, _rand);
            var par = param.BaseAmplitude * param.Amplitude;

            ds(layer, sizePow2, par, param, _rand);


            var croped = new Layer2DObject(size);

            for (int y = 0; y < size.Y; y++)
            {
                for (int x = 0; x < size.X; x++)
                {
                    croped[x, y] = layer[x, y];
                }
            }
            return(croped);
        }
示例#4
0
        public ILayerMasked Do(Vector2 size)
        {
            //int maxDim = (int)JryMath.Max(size.X, size.Y);
//CONSTANT - There is a problem with values that are not 2^n wher n is element of N

            var            maxDim        = 256;
            int            gradSize      = 8;
            IInterpolation interpolation = new LinearClipped();

            Layer2DObject map   = new Layer2DObject(size);
            int           hgrid = (int)size.X;
            int           vgrid = (int)size.Y;


            float gain       = _noiseParameters.Amplitude;
            float lacunarity = _noiseParameters.Lacunarity;

            var gradients = setupGradient(gradSize);

            //set up the random numbers table
            int[] permutations = getPermutaions(maxDim);

            int maxDimMinOne   = maxDim - 1;
            int gradSizeMinOne = gradSize - 1;

            for (int i = 0; i < vgrid; i++)
            {
                for (int j = 0; j < hgrid; j++)
                {
                    float pixel_value = 0.0f;

                    float amplitude = 1.0f;
                    float frequency = 1.0f / maxDim;

                    for (int k = _noiseParameters.FromDepth; k < _noiseParameters.ToDepth; k++)
                    {
                        int x = JryMath.Floor(j * frequency);
                        int y = JryMath.Floor(i * frequency);

                        float fracX = j * frequency - x;
                        float fracY = i * frequency - y;

                        // following two lines solved the bug.
                        x += k;
                        y += k;
                        IntVector4 v              = getIndices(permutations, maxDimMinOne, gradSizeMinOne, x, y);
                        Vector2[]  grads          = getGrads(gradients, v);
                        float      interpolatedxy = biInterpolate(interpolation, grads, fracX, fracY);

                        pixel_value += interpolatedxy * amplitude;
                        amplitude   *= gain;
                        frequency   *= lacunarity;
                    }

                    //put it in the map
                    map[j, i] = pixel_value;
                }
            }
            return(map);
        }
示例#5
0
        private void diamond(ILayer layer, int size, float ap, int l, IRandom2 rand)
        {
            int squareSize     = (int)(size * JryMath.Pow(.5f, l));
            int squareHalfSize = (int)(squareSize / 2);

            for (int iy = 0; iy < JryMath.Pow(2, l); iy++)
            {
                for (int ix = 0; ix < JryMath.Pow(2, l); ix++)
                {
                    var xCorL = ix * squareSize;
                    var xCorR = (ix + 1) * squareSize;
                    var yCorT = iy * squareSize;
                    var yCorB = (iy + 1) * squareSize;

                    var tl  = layer[xCorL, yCorT].Value;
                    var bl  = layer[xCorL, yCorB].Value;
                    var tr  = layer[xCorR, yCorT].Value;
                    var br  = layer[xCorR, yCorB].Value;
                    int xph = xCorL + squareHalfSize;
                    int yph = yCorT + squareHalfSize;
                    var c   = (tl + tr + br + bl) / 4 + rnd(rand, xph, yph) * ap;
                    layer[xph, yph] = c;
                }
            }
        }
示例#6
0
        public Vector2 cropBySize(Vector2 v, IntVector2 size)
        {
            var x = JryMath.Max(JryMath.Min(v.X, size.X), 0);
            var y = JryMath.Max(JryMath.Min(v.Y, size.Y), 0);

            return(new Vector2(x, y));
        }
示例#7
0
        private void square(Layer2DObject layer, int size, float ap, int depth, IRandom2 rand)
        {
            int squareSize     = (int)(size * JryMath.Pow(.5f, depth));
            int squareHalfSize = (int)(squareSize / 2);

            for (int iy = 0; iy < JryMath.Pow(2, depth); iy++)
            {
                for (int ix = 0; ix < JryMath.Pow(2, depth); ix++)
                {
                    var xCorL = ix * squareSize;
                    var xCorR = (ix + 1) * squareSize;
                    var yCorT = iy * squareSize;
                    var yCorB = (iy + 1) * squareSize;

                    var tl  = layer[xCorL, yCorT].Value;
                    var bl  = layer[xCorL, yCorB].Value;
                    var tr  = layer[xCorR, yCorT].Value;
                    var br  = layer[xCorR, yCorB].Value;
                    int xph = xCorL + squareHalfSize;
                    int yph = yCorT + squareHalfSize;
                    var c   = (tl + tr + br + bl) / 4 + rnd(rand, xph, yph) * ap;
                    var b   = (br + bl + c + getClipped(layer, xph, yph + squareSize)) / 4 + rnd(rand, xph, yph + squareSize) * ap;
                    var t   = (tr + tl + c + getClipped(layer, xph, yph - squareSize)) / 4 + rnd(rand, xph, yph - squareSize) * ap;
                    var r   = (tr + br + c + getClipped(layer, xph + squareSize, yph)) / 4 + rnd(rand, xph + squareSize, yph) * ap;
                    var l   = (tl + bl + c + getClipped(layer, xph - squareSize, yph)) / 4 + rnd(rand, xph - squareSize, yph) * ap;

                    layer[xph, yCorT] = t;
                    layer[xph, yCorB] = b;
                    layer[xCorL, yph] = l;
                    layer[xCorR, yph] = r;
                }
            }
        }
示例#8
0
        public override Task <ILayerMasked> GenerateLayer()
        {
            var pts    = _layerLocalParameters.Polygon.Points.ToList();
            var bounds = new GeometryUtils().GetBoundsForPoints(pts);
            var mask   = obtainBluredMask(pts,
                                          _layerLocalParameters.BlurSize,
                                          _layerLocalParameters.ExtendSize);


            var size  = mask.Resolution;
            int count = (int)JryMath.Max(size.X, size.Y) / 100 + 1;
            var areas = _voronoiAreGenerator.GenerateAreas(size, bounds.GetSize(), count);

            _areaLoggerWithFill.LogAreas(size, areas, "loggedAreasFilled");

            var layer     = new Layer2DObject(new Vector2(size.X + _layerLocalParameters.ExtendSize, size.Y + _layerLocalParameters.ExtendSize));
            var layerSize = layer.Resolution;
            var deltaX    = (layerSize.X - size.X) / 2;
            var deltaY    = (layerSize.Y - size.Y) / 2;

            var translateVector = new Vector2(deltaX, deltaY);

            _voronoiAreaDrawer.PrintToLayer(layer, areas, translateVector);
            layer.Mask = mask;
            _logger.Log(layer, "mountain");
            applyOffset(_layerLocalParameters.ExtendSize, _layerLocalParameters.Polygon.Points.ToList(), layer);
            _layUtils.Normalize(layer);
            layer.Mask = mask;
            return(Task.FromResult((ILayerMasked)layer));
        }
        public void Update(Vector2 location)
        {
            if (performCalled)
            {
                return;
            }
            if (!firstSet)
            {
                firstLocation = location;
                firstSet      = true;
            }

            var dot   = Vector2.Dot(firstLocation.Normalize(), location.Normalize());
            var angle = JryMath.Acos(dot);
            var a     = (updated - center).Normalize();
            var b     = (location - center).Normalize();

            angle = (float)(Math.Atan2(a.Y, a.X) -
                            Math.Atan2(b.Y, b.X));
            if (!float.IsNaN(angle))
            {
                updatablePolygon.RotateSelected(angle, center);
            }
            updated = location;
        }
        public float ApplyMatrix(ILayer source, Vector2 loc, MatrixNxN kernel, int div)
        {
            var   halfSize = (int)(kernel.N / 2);
            float acc      = 0;

            for (int j = 0; j < kernel.N; j++)
            {
                for (int i = 0; i < kernel.N; i++)
                {
                    int x = -halfSize + (int)loc.X + (int)i;
                    int y = -halfSize + (int)loc.Y + (int)j;
                    if (isOk(x, source.Resolution.X) && isOk(y, source.Resolution.Y))
                    {
                        var sourceVal = source[x, y];
                        if (sourceVal.HasValue)
                        {
                            acc += sourceVal.Value * kernel[(uint)i, (uint)j];
                        }
                    }
                }
            }

            var previous = source[(int)loc.X, (int)loc.Y];
            var future   = acc / div;

            if (previous.HasValue)
            {
                return(previous.Value + JryMath.Min(future - previous.Value, .1f));
            }
            return(future);
        }
示例#11
0
        public IMask GetQuarterFadedCircle(int radius, float fade, IInterpolation interpolation)
        {
            if (radius < 0 || fade > 1 || fade < 0)
            {
                throw new ArgumentException();
            }
            int fadeBegin = (int)(radius * (1 - fade));
            var brushmask = new Mask(new Vector2(radius, radius));

            for (int y = 0; y < radius; y++)
            {
                var li = (int)JryMath.Sqrt(radius * radius - (radius - y) * (radius - y));

                for (int x = 0; x < li; x++)
                {
                    var   yCor = radius - y;
                    float val  = 1;
                    var   dis  = JryMath.Sqrt(x * x + yCor * yCor);
                    if (dis > fadeBegin)
                    {
                        val = interpolation.Interpolate(1, 0, (dis - fadeBegin) / (radius - fadeBegin));
                    }

                    brushmask[x, yCor - 1] = val;
                }
            }
            return(brushmask);
        }
示例#12
0
        private void solveDegenerateCase(Vector2 point)
        {
            var      newL = new Parabola(point);
            Parabola newP = root;
            var      npl  = root.GetLeftNode();

            while (npl != null)
            {
                newP = npl;
                npl  = newP.GetLeftNode();
            }
            //newP is a root right now.
            var rr = newP;

            newP = new Parabola(newP.Site);

            var p = new Vector2(newL.Site.X +
                                JryMath.Abs(newL.Site.X - newP.Site.X) / 2, _maxSize);
            var seg = new Segment(p, newP.Site, newL.Site);

            segs.Add(seg);

            rr.SetRightParabola(newP, seg);
            rr.SetLeftParabola(newL);
        }
示例#13
0
        /// <summary>
        /// Genereates using user input
        /// </summary>
        /// <param name="size"></param>
        /// <param name="input"></param>
        /// <returns></returns>
        public IList <IArea> Generate(IntVector2 size, IList <Vector2> input)
        {
            var f = new Fortune();
            //Points = input ;
            var segs = f.GetSegments(input, minSize: 0, maxSize: JryMath.Max(size.X, size.Y));

            return(_converter.ConvertSegmentToAreas(segs, size));
            //return segs;
        }
示例#14
0
        private ILayerMasked merge(IBlendModeAlpha ablend, ILayerMasked baseLayer, IList <DescribedLayer> pars)
        {
            onMergeStarted();
            if (pars == null || pars.Count == 0)
            {
                throw new ArgumentException();
            }

            var final = baseLayer;

            foreach (var describ in pars)
            {
                var current   = describ.Layer;
                var blendMode = describ.GlobalParameters.BlendMode;
                var offset    = describ.GlobalParameters.Offset - .5f;

                var minY = JryMath.Max(0, -current.Offset.Y);
                var minX = JryMath.Max(0, -current.Offset.X);
                var maxY = JryMath.Min(current.Resolution.Y, final.Resolution.Y - current.Offset.Y);
                var maxX = JryMath.Min(current.Resolution.X, final.Resolution.X - current.Offset.X);
                for (int y = minY; y < maxY; y++)
                {
                    for (int x = minX; x < maxX; x++)
                    {
                        int ix = x + current.Offset.X;
                        int iy = y + current.Offset.Y;


                        var curVal = current[x, y];
                        if (!curVal.HasValue || !final[ix, iy].HasValue || !current.HasMask)
                        {
                            continue;
                        }
                        var maskValue = current.Mask[x, y];
                        if (!maskValue.HasValue)
                        {
                            continue;
                        }


                        var currentLayerValue     = curVal.Value + offset;
                        var currentLayerMaskValue = maskValue.Value;
                        //currentLayerMaskValue = 1;
                        var upToThisPointGeneratedLayerValue = final[ix, iy].Value;


                        var blended = blendMode.Blend(upToThisPointGeneratedLayerValue, currentLayerValue * currentLayerMaskValue);
                        final[ix, iy] = ablend.Blend(upToThisPointGeneratedLayerValue, blended, currentLayerMaskValue);
                        if (final[ix, iy] > 0.05f)
                        {
                        }
                    }
                }
            }

            return(baseLayer);
        }
示例#15
0
        private byte obtainColor(float?fVal)
        {
            if (fVal.HasValue)
            {
                return((byte)(JryMath.Max(0, JryMath.Min(fVal.Value * 255, 255))));
            }

            return(0);
        }
示例#16
0
        public float NextD(int seedX, int seedY, int seedZ)
        {
            seedX += _seed;
            seedY += 5 * _seed;
            seedZ += 13 * _seed;
            var n = seedX + seedY * 57 + seedZ * 271;

            n = (n << 13) ^ n;
            var ra    = (float)JryMath.Abs((1.0 - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0));
            var intra = (long)ra;

            return(ra - intra);
        }
示例#17
0
        private static Vector2[] setupGradient(int gradSize)
        {
            Vector2[] gradients = new Vector2[gradSize];
            for (int i = 0; i < gradients.Length; ++i)
            {
                Vector2 v = new Vector2(JryMath.Sin(0.785398163f * i)
                                        , JryMath.Cos(0.785398163f * i));

                gradients[i] = v;
            }

            return(gradients);
        }
示例#18
0
        public float DistanceFromPointToSegmentSquare(ref Vector2 coor, ref LineSegment seg)
        {
            var     perpendicular = new LineSegment(coor, coor + seg.PerpendicularNotNormalized);
            Vector2 intersection;

            if (LineHasIntersectionWithSegment(ref perpendicular, ref seg, out intersection))
            {
                return((intersection - coor).LengthSquared());
            }

            return(JryMath.Min(
                       Vector2.DistanceSquared(coor, seg.Point1),
                       Vector2.DistanceSquared(coor, seg.Point2)));
        }
示例#19
0
        public virtual float NextD(int seedX, int seedY)
        {
            seedX += 3 * _seed;
            seedY += 5 * _seed;
            var n = seedX + seedY * 57;

            n = (n << 13) ^ n;
            // it must fit into 0-1
            var ra = (float)JryMath.Abs((1.0 - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0));

            var intra = (long)ra;

            return(ra - intra);
        }
示例#20
0
        public float Interpolate(float a, float b, float progress)
        {
            if (progress < 0)
            {
                return(a);
            }
            if (progress > 1)
            {
                return(b);
            }

            float tm = (1 - JryMath.Cos(progress * JryMath.Pi)) / 2;

            return(a * (1 - tm) + b * tm);
        }
示例#21
0
 private float decideAngle(float x, float y)
 {
     if (x >= 0 && y >= 0)
     {
         return(JryMath.Acos(x));
     }
     else if (x >= 0)
     {
         return(JryMath.Pi * 2 - JryMath.Acos(x));
     }
     else if (y >= 0)
     {
         return(JryMath.Acos(x));
     }
     else
     {
         return(JryMath.Pi * 2 - JryMath.Acos(x));
     }
 }
示例#22
0
        private IEnumerable <IntVector2> getLocalMaximaRecord(ILayer layer, int amount)
        {
            var someSprings = new List <IntVector2>();
            var x           = new  HeapWrapper();

            _layerUtility.IterateValues(layer, (cor, val) => x.Add(-val.Value, cor));


            var upper10Percent = layer.Resolution.X * layer.Resolution.Y / 5;
            var takeEveryNth   = (int)JryMath.Ceil(upper10Percent / (float)amount);

            for (int i = 0; i < upper10Percent; i++)
            {
                var item = x.Get();
                if (i % takeEveryNth == 0)
                {
                    someSprings.Add(item);
                }
            }
            return(someSprings);
        }
示例#23
0
        public void RotateSelected(float factor, Vector2 center)
        {
            if (!HasSelectedPoints)
            {
                return;
            }

            for (int i = 0; i < _points.Count; i++)
            {
                var pt    = _points[i];
                var index = _selectedPoints.IndexOf(pt);
                if (index != -1)
                {
                    pt = pt - center;
                    var p = new Vector2(JryMath.Cos(factor) * pt.X - JryMath.Sin(factor) * pt.Y,
                                        JryMath.Sin(factor) * pt.X + JryMath.Cos(factor) * pt.Y);
                    _points[i]             = p + center;
                    _selectedPoints[index] = _points[i];
                }
            }
            recalcEdges();
        }
示例#24
0
 private int NewMethod(int max, float value)
 {
     return((int)JryMath.Max(JryMath.Min(max, value), 0));
 }
示例#25
0
        private void performStep(ILayer layer, int x, int y)
        {
            Vector2 lowest  = _layerUtility.GetLowestNeighbour(layer, x, y);
            var     lowestX = (int)lowest.X;
            var     lowestY = (int)lowest.Y;

            if (lowestX == x && lowestY == y)
            {
                return;
            }
            //erosion

            var lowestWater   = _water[lowestX, lowestY];
            var lowHeight     = layer[lowestX, lowestY];
            var currentWater  = _water[x, y];
            var currentHeight = layer[x, y];


            // sure it exists
            // ReSharper disable once PossibleInvalidOperationException
            float lowestLevel = lowestWater.Value
                                // sure it exists
                                // ReSharper disable once PossibleInvalidOperationException
                                + lowHeight.Value;
            // sure it exists
            // ReSharper disable once PossibleInvalidOperationException
            float currentLevel = currentWater.Value
                                 // sure it exists
                                 // ReSharper disable once PossibleInvalidOperationException
                                 + currentHeight.Value;

            if (lowestLevel + currentWater < currentHeight.Value)
            {
                // case 3
                //transfer water completely

                _waterDiff[lowestX, lowestY] += _water[x, y];
                _waterDiff[x, y]             -= _water[x, y];
                //transfer sediment
                var sediment = _water[x, y] * solubility;
                //transfer from
                _sediment[x, y] -= sediment;
                //transfer to
                _sediment[lowest] += sediment;
            }
            else if (lowestLevel < currentLevel)
            {
                // case 2
                //transfer water completely
                var transferedWater = JryMath.Min(currentLevel - lowestLevel, currentWater.Value) / 2;
                _waterDiff[lowestX, lowestY] += transferedWater;
                _waterDiff[x, y]             -= transferedWater;

                //transfer sediment
                var factor = transferedWater / currentWater;

                var scaledSolubility = _water[x, y] * solubility * factor;
                var solub            = scaledSolubility;
                //transfer from
                _sediment[x, y] -= solub;
                //transfer to
                _sediment[lowest] += solub;
            }
            //else  lowest one is not lower than current one

#if ImmediateApply
            // test codee
            _water[x, y] += _waterDiff[x, y];
            //transfer sediment
            layer[x, y] += _sediment[x, y];

            _waterDiff[x, y] = 0;
            _sediment[x, y]  = 0;
            //evaporation
            _water[x, y] *= 1 - evaporation;
#endif
        }
示例#26
0
 private static float crop(float min, float max, float p)
 {
     return(JryMath.Min(JryMath.Max(p, min), max));
 }
示例#27
0
        public Vector2 getParabalaeIntersection(Parabola left, Parabola right, double directixY)
        {
            if (left == null || right == null || left.Site == right.Site)
            {
                throw new Exception("NoIntersectoinFound");
            }


            double denominator1 = 2.0f * (left.Site.Y - directixY);

//#warning quickfix
            if (denominator1 == 0)
            {
                denominator1 = 0.000001;
            }
            double a1 = 1.0f / denominator1;
            double b1 = -2.0f * left.Site.X / denominator1;
            double c1 = ((left.Site.X * left.Site.X) + (left.Site.Y * left.Site.Y) - (directixY * directixY))
                        / denominator1;
            //y + dp / 4 + px * px / dp
            double denominator2 = 2.0f * (right.Site.Y - directixY);

//#warning quickfix
            if (denominator2 == 0)
            {
                denominator2 = 0.000001;
            }
            double a2 = 1.0f / denominator2;
            double b2 = -2.0f * right.Site.X / denominator2;
            double c2 = ((right.Site.X * right.Site.X) + (right.Site.Y * right.Site.Y) - (directixY * directixY))
                        / denominator2;


            double a = a1 - a2;
            double b = b1 - b2;
            double c = c1 - c2;

            double x1 = 0, x2 = 0;

            if (a == 0)// 0 = bx +c
            {
                x1 = -c / b;
                x2 = x1;
            }
            else //0 = ax^2 + bx + c
            {
                double disc = b * b - 4 * a * c;
                if (disc < 0)// when everything is ok. this case become imposible
                {
                    throw new InvalidOperationException("Negative discriminant root not found in real domain");
                }
                x1 = (-b + JryMath.Sqrt(disc)) / (2 * a);
                x2 = (-b - JryMath.Sqrt(disc)) / (2 * a);
            }

            double x;

            if (left.Site.Y < right.Site.Y)
            {
                x = JryMath.Max(x1, x2);
            }
            else
            {
                x = JryMath.Min(x1, x2);
            }

            double y;

            // i have chosen to use left parabola to get Y coor;
            y = a1 * x * x + b1 * x + c1;

            return(new Vector2((float)x, (float)y));
        }
示例#28
0
 public float Blend(float value1, float value2)
 {
     return(JryMath.Min(value1, value2));
 }