IEnumerable <Vector2> _genJointCircle(Vector2 p0, Vector2 p1, Vector2 p2) { List <Vector2> triangles = new List <Vector2>(); Vector2 line1 = (p1 - p0).normalized; Vector2 line2 = (p2 - p1).normalized; Vector2 n1 = new Vector2(-line1.y, line1.x).normalized; Vector2 n2 = new Vector2(-line2.y, line2.x).normalized; float scalar = Vector2.Dot(n1, n2); Vector2 r; if (Vector2.Dot(n1, line2) < 0) { r = n1 * _thickness; } else { r = -n2 * _thickness; } float angle = Mathf.Acos(scalar); if (angle == 0f) { // No filling needed, lines are perfectly parallel return(triangles); } triangles.AddRange(GraphicsProvider.GetCircleTriangles(p1, r, angle, Color.red, _circleDensity, -1f, _defaultZ)); return(triangles); }
public void OnRenderObject() { UpdateThickness(); UpdateColor(); GraphicsProvider.DrawTriangles(transform, _color, _defaultZ, _triangleVertices); if (_verticesAdded.Count > 0 && (_verticesAdded[0] != _verticesAdded[_verticesAdded.Count - 1] || _verticesAdded.Count == 1)) { _drawCircles(); } }
void _drawCircles() { if (_verticesAdded.Count == 0) { return; } if (_verticesAdded.Count < 2) { Vector2 p = _verticesAdded[0]; Vector2 v = new Vector2(0f, _thickness); GraphicsProvider.DrawCircle(transform, p, v, 2 * Mathf.PI, _color, _circleDensity, 1f, _defaultZ); } else { Vector2 p0 = _verticesAdded[0]; Vector2 p1 = _verticesAdded[1]; Vector2 line = (p0 - p1).normalized; Vector2 n = new Vector2(-line.y, line.x).normalized; Vector2 p = p0; Vector2 v = n * _thickness; GraphicsProvider.DrawCircle(transform, p, v, Mathf.PI, _color, _circleDensity, -1f, _defaultZ); p0 = _verticesAdded[_verticesAdded.Count - 1]; p1 = _verticesAdded[_verticesAdded.Count - 2]; line = (p0 - p1).normalized; n = new Vector2(-line.y, line.x).normalized; p = p0; v = n * _thickness; GraphicsProvider.DrawCircle(transform, p, v, Mathf.PI, _color, _circleDensity, -1f, _defaultZ); } }