def get_intersection_dictionary(bm, edge_indices): bm.verts.ensure_lookup_table() bm.edges.ensure_lookup_table() permutations = get_valid_permutations(bm, edge_indices) k = defaultdict(list) d = defaultdict(list) for edges in permutations: raw_vert_indices = cm.vertex_indices_from_edges_tuple(bm, edges) vert_vectors = cm.vectors_from_indices(bm, raw_vert_indices) points = LineIntersect(*vert_vectors) # some can be skipped. (NaN, None, not on both edges) if can_skip(points, vert_vectors): continue # reaches this point only when an intersection happens on both edges. [k[edge].append(points[0]) for edge in edges] # k will contain a dict of edge indices and points found on those edges. for edge_idx, unordered_points in k.items(): tv1, tv2 = bm.edges[edge_idx].verts v1 = bm.verts[tv1.index].co v2 = bm.verts[tv2.index].co ordered_points = order_points((v1, v2), unordered_points) d[edge_idx].extend(ordered_points) return d
def line_from_edge_intersect(edge1, edge2): ''' > takes 2 tuples, each tuple contains 2 vectors - prepares input for sending to intersect_line_line < returns output of intersect_line_line ''' [p1, p2], [p3, p4] = edge1, edge2 return LineIntersect(p1, p2, p3, p4)
def get_intersection_from_idxs(bm, idx1, idx2): ''' > takes reference to bm and 2 indices < returns intersection or None ''' p1, p2 = coords_tuple_from_edge_idx(bm, idx1) p3, p4 = coords_tuple_from_edge_idx(bm, idx2) a, b = LineIntersect(p1, p2, p3, p4) if (a - b).length < CAD_prefs.VTX_PRECISION: return a
def operate(context, bm, selected): edge_1, edge_2 = selected edge_1_co_1 = edge_1.verts[0].co edge_1_co_2 = edge_1.verts[1].co edge_2_co_1 = edge_2.verts[0].co edge_2_co_2 = edge_2.verts[1].co isect = LineIntersect(edge_1_co_1, edge_1_co_2, edge_2_co_1, edge_2_co_2) if (not isect) or ((isect[0] - isect[1]).length >= 1.0e-5): print('these edges do not intersect') return else: print('definite intersection found') p0 = isect[0] p1 = point_on_edge(p0, edge_1) p2 = point_on_edge(p0, edge_2) if (p1 and p2): print('point lies on both edges') return elif (p1 or p2): print('point lies on 1 edge') return # reaches this point if the intersection doesnt lie on either edge def get_vertex(edge): IDX_BOOL = bool( (edge.verts[0].co - p0).length > (edge.verts[1].co - p0).length) return edge.verts[IDX_BOOL] bm.select_mode = {'VERT'} bm.select_flush_mode() v1 = bm.verts.new(p0) e1 = bm.edges.new([v1, get_vertex(edge_1)]) e2 = bm.edges.new([v1, get_vertex(edge_2)]) edge_1.select = False edge_2.select = False v1.select = True return True
def checkEdges(Edge, obj): (p1, p2, p3, p4) = edges_to_points(Edge) line = LineIntersect(p1, p2, p3, p4) point = ((line[0] + line[1]) / 2) # or point = line[0] return point
def checkIsMatrixCoplanar(verti): (v1, v2, v3, v4) = edges_to_points(verti) #unpack shortest_line = LineIntersect(v1, v2, v3, v4) if mDist(shortest_line[1], shortest_line[0]) > VTX_PRECISION: return False else: return True