private bool SegmentIntersectsEdge(Vector2 p1, Vector2 p2, int ignoreIndex, ref Vector2 point, out int intersectingEdgeIndex) { intersectingEdgeIndex = -1; float sqrDistance = float.MaxValue; for (int i = 0; i < m_SpriteMeshData.edges.Count; i++) { Edge edge = m_SpriteMeshData.edges[i]; Vector2 v1 = m_SpriteMeshData.GetPosition(edge.index1); Vector2 v2 = m_SpriteMeshData.GetPosition(edge.index2); Vector2 pointTmp = Vector2.zero; if (!edge.Contains(ignoreIndex) && MathUtility.SegmentIntersection(p1, p2, v1, v2, ref pointTmp)) { float sqrMagnitude = (pointTmp - p1).sqrMagnitude; if (sqrMagnitude < sqrDistance) { sqrDistance = sqrMagnitude; intersectingEdgeIndex = i; point = pointTmp; } } } return(intersectingEdgeIndex != -1); }
public void Select() { if (bones == null) { return; } foreach (var bone in bones) { if (!bone.isVisible) { continue; } Vector2 p1 = bone.position; Vector2 p2 = bone.endPosition; Vector2 point = Vector2.zero; if (rect.Contains(p1, true) || rect.Contains(p2, true) || MathUtility.SegmentIntersection(new Vector2(rect.xMin, rect.yMin), new Vector2(rect.xMax, rect.yMin), p1, p2, ref point) || MathUtility.SegmentIntersection(new Vector2(rect.xMax, rect.yMin), new Vector2(rect.xMax, rect.yMax), p1, p2, ref point) || MathUtility.SegmentIntersection(new Vector2(rect.xMax, rect.yMax), new Vector2(rect.xMin, rect.yMax), p1, p2, ref point) || MathUtility.SegmentIntersection(new Vector2(rect.xMin, rect.yMax), new Vector2(rect.xMin, rect.yMin), p1, p2, ref point) ) { selection.Select(bone.ToCharacterIfNeeded(), true); } } }