public IList <LineSegment> Subdivide(Vector2 x, Vector2 y) { float per = 1; var points = new List <Vector2> { x, y }; var oc = getOctaveAccordingToLength(x, y); for (int o = 0; o < oc; o++) { var newPts = new List <Vector2>(); for (int i = 0; i < points.Count - 1; i++) { var cur = points[i]; var next = points[i + 1]; var dif = next - cur; var perp = Vector2.Normalize(new Vector2(dif.Y, -dif.X)); // TODO deterministicaly sort point var a = cur.X < next.X ? cur :next; var b = cur.X >= next.X ? cur : next; var curSeed = _random.NextD((int)a.X, (int)a.Y) * 1000; var nextSeed = _random.NextD((int)b.X, (int)b.Y) * 1000; float moverRand = (_random.NextD((int)curSeed, (int)nextSeed) - .5f * _amplitude * per * 2); Vector2 mover = perp * moverRand; var newPoint = cur + dif * .5f + mover; newPts.Add(cur); newPts.Add(newPoint); } newPts.Add(points[points.Count - 1]); points = newPts; per *= _persistance; } var lines = new List <LineSegment>(); for (int i = 0; i < points.Count - 1; i++) { var cur = points[i]; var next = points[i + 1]; lines.Add(new LineSegment(cur, next)); } return(lines); }
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); }
private static float rnd(IRandom2 r, int x, int y) { var rr = r.NextD(x, y); return(rr - .5f); }