private static void ShiftPoints(float irregularity) { for (var i = 0; i < pointCount; i++) { var point = points[i]; var delta = Random.insideUnitCircle.normalized * FindMaxMovement(point.X, point.Y) * irregularity; var deltaX = Mathf.RoundToInt(delta.x); var deltaY = Mathf.RoundToInt(delta.y); if (point.X <= xMin || point.X >= xMax) { deltaX = 0; } if (point.Y <= yMin || point.Y >= yMax) { deltaY = 0; } if (deltaX != 0 || deltaY != 0) { var newPoint = new D2dVector2(point.X + deltaX, point.Y + deltaY); MovePoints(point, newPoint); points[i] = newPoint; } } }
private static void TryMovePoint(ref D2dVector2 point, D2dVector2 oldPoint, D2dVector2 newPoint) { if (point.X == oldPoint.X && point.Y == oldPoint.Y) { point.X = newPoint.X; point.Y = newPoint.Y; } }
private static void MovePoints(D2dVector2 oldPoint, D2dVector2 newPoint) { for (var i = 0; i < quadCount; i++) { var quad = quads[i]; TryMovePoint(ref quad.BL, oldPoint, newPoint); TryMovePoint(ref quad.BR, oldPoint, newPoint); TryMovePoint(ref quad.TL, oldPoint, newPoint); TryMovePoint(ref quad.TR, oldPoint, newPoint); quads[i] = quad; } }
public void AddTriangle(D2dVector2 a, D2dVector2 b, D2dVector2 c) { if (a.Y != b.Y || a.Y != c.Y) { //var z = (a.V + b.V + c.V) / 3.0f; //var z1 = Vector3.MoveTowards(a.V, z, 1.0f); //var z2 = Vector3.MoveTowards(b.V, z, 1.0f); //var z3 = Vector3.MoveTowards(c.V, z, 1.0f); //Debug.DrawLine(z1, z2, Color.red, 10.0f); //Debug.DrawLine(z2, z3, Color.red, 10.0f); //Debug.DrawLine(z3, z1, Color.red, 10.0f); // Make a highest, and c lowest if (b.Y > a.Y) { D2dHelper.Swap(ref a, ref b); } if (c.Y > a.Y) { D2dHelper.Swap(ref c, ref a); } if (c.Y > b.Y) { D2dHelper.Swap(ref b, ref c); } var fth = a.Y - c.Y; // Full triangle height var tth = a.Y - b.Y; // Top triangle height var bth = b.Y - c.Y; // Bottom triangle height // Find a to c intercept along b plane var inx = c.X + (a.X - c.X) * D2dHelper.Divide(bth, fth); var d = new D2dVector2((int)inx, b.Y); // Top triangle var abs = D2dHelper.Divide(a.X - b.X, tth); // A/B slope var ads = D2dHelper.Divide(a.X - d.X, tth); // A/D slope AddTriangle(b.X, d.X, abs, ads, b.Y, 1, tth); // Bottom triangle var cbs = D2dHelper.Divide(c.X - b.X, bth); // C/B slope var cds = D2dHelper.Divide(c.X - d.X, bth); // C/D slope AddTriangle(b.X, d.X, cbs, cds, b.Y, -1, bth); } }
private static void TryAddPoint(D2dVector2 newPoint) { for (var i = 0; i < pointCount; i++) { var point = points[i]; if (point.X == newPoint.X && point.Y == newPoint.Y) { return; } } if (points.Count > pointCount) { points[pointCount] = newPoint; } else { points.Add(newPoint); } pointCount += 1; }
protected override void OnAlphaDataSubset(D2dVector2 size, D2dVector2 offset) { base.OnAlphaDataSubset(size, offset); Rebuild(); }
protected virtual void OnAlphaDataSubset(D2dVector2 size, D2dVector2 offset) { UpdateBeforeBuild(); }