public void TestCellRasterization() { var v1 = new Vector2(1.2f, 1.5f); var v2 = new Vector2(0.55f, -1.55f); var v3 = new Vector2(-2.4f, -1.1f); var v4 = new Vector2(-0.5f, 2.3f); var h1 = new HalfPlane(v1, v2, Vector2.Zero); var h2 = new HalfPlane(v2, v3, Vector2.Zero); var h3 = new HalfPlane(v3, v4, Vector2.Zero); var h4 = new HalfPlane(v4, v1, Vector2.Zero); var isContains = new Predicate <Vector2>(p => HalfPlane.ContainsInConvex(p, new [] { h1, h2, h3, h4 })); var boundingBox = new Box2(-2.4f, 2.3f, 1.2f, -1.55f); var result = Rasterization.ConvexToBlocks(isContains, boundingBox); var correctAnswer = new[] { new Vector2i(0, 1), new Vector2i(0, 0), new Vector2i(0, -1), new Vector2i(0, -2), new Vector2i(-1, 1), new Vector2i(-1, 0), new Vector2i(-1, -1), new Vector2i(-2, 0), new Vector2i(-2, -1) }; Assert.That(result, Is.EquivalentTo(correctAnswer)); //Draw polygon //UnityEngine.Debug.DrawLine(v1, v2, Color.blue, 10); //UnityEngine.Debug.DrawLine(v2, v3, Color.blue, 10); //UnityEngine.Debug.DrawLine(v3, v4, Color.blue, 10); //UnityEngine.Debug.DrawLine(v4, v1, Color.blue, 10); //Draw bbox //DrawRectangle.ForDebug(); }
void OnDrawGizmos() { if (_h1 && _h2 && _h3 && _h4) { var center = (_h1.position + _h2.position + _h3.position + _h4.position) / 4; var h1 = new HalfPlane((Vector2)_h1.position, (Vector2)_h2.position, (Vector2)center); var h2 = new HalfPlane((Vector2)_h2.position, (Vector2)_h3.position, (Vector2)center); var h3 = new HalfPlane((Vector2)_h3.position, (Vector2)_h4.position, (Vector2)center); var h4 = new HalfPlane((Vector2)_h4.position, (Vector2)_h1.position, (Vector2)center); var containsCallCounter = 0; var isContains = new Predicate <Vector2>(delegate(Vector2 p) { containsCallCounter++; return(HalfPlane.ContainsInConvex(p, new [] { h1, h2, h3, h4 })); }); var bounds = new Box2( Mathf.Min(_h1.position.x, _h2.position.x, _h3.position.x, _h4.position.x), Mathf.Max(_h1.position.z, _h2.position.z, _h3.position.z, _h4.position.z), Mathf.Max(_h1.position.x, _h2.position.x, _h3.position.x, _h4.position.x), Mathf.Min(_h1.position.z, _h2.position.z, _h3.position.z, _h4.position.z)); //Draw test polygon Gizmos.color = Color.white; Gizmos.DrawLine(_h1.position, _h2.position); Gizmos.DrawLine(_h2.position, _h3.position); Gizmos.DrawLine(_h3.position, _h4.position); Gizmos.DrawLine(_h4.position, _h1.position); //Draw "world" bounds DrawRectangle.ForGizmo(bounds, Color.gray); if (Workmode == Mode.Blocks) { //Draw block bounds var blockBounds = (Bounds2i)bounds; //Draw block centers inside bounds foreach (var blockBound in blockBounds) { var blockCenter = BlockInfo.GetWorldCenter(blockBound); DebugExtension.DrawPoint((Vector3)blockCenter, Color.white / 2, 0.1f); } var blocks = Rasterization.ConvexToBlocks(isContains, bounds); Assert.IsTrue(blocks.Length == blocks.Distinct().Count()); //Draw rasterized blocks foreach (var p in blocks) { DrawRectangle.ForGizmo(new Bounds2i(p, 1, 1), Color.green); } } else { var vertices = Rasterization.ConvexToVertices(isContains, bounds); Assert.IsTrue(vertices.Length == vertices.Distinct().Count()); //Draw rasterized vertices foreach (var p in vertices) { DebugExtension.DrawPoint(p, Color.green, 0.1f); } } Debug.LogFormat("Contains calls count {0}", containsCallCounter); } }