def intersect_face(pt): # todo: rewrite! inefficient! nonlocal vis_faces2D for f, vs in vis_faces2D: v0 = vs[0] for v1, v2 in iter_pairs(vs[1:], False): if intersect_point_tri_2d(pt, v0, v1, v2): return f return None
def intersect_face(pt): # todo: rewrite! inefficient! nonlocal vis_faces2D for f,vs in vis_faces2D: v0 = vs[0] for v1,v2 in iter_pairs(vs[1:], False): if intersect_point_tri_2d(pt, v0, v1, v2): return f return None
def is_in_shape(self, x, y): tri_indices = self.indices verts, lineverts = self.scale_and_offset_verts() # x, y = bpy.types.View2D.view_to_region(x, y, clip=True) for tri in tri_indices: if intersect_point_tri_2d(Vector((x, y)), verts[tri[0]], verts[tri[1]], verts[tri[2]]): return True return False
def get_state(point:Point2D): nonlocal vis_faces2D point3D = self.rfcontext.get_point3D(point) if not point3D: return ('off', None) if self.rfcontext.is_point_on_mirrored_side(point3D): return ('off',None) for bmf,cos in vis_faces2D: co0 = cos[0] for co1,co2 in zip(cos[1:-1],cos[2:]): if intersect_point_tri_2d(point, co0, co1, co2): return ('tar', bmf) return ('src', None)
def get_state(point: Point2D): nonlocal vis_faces2D point3D = self.rfcontext.get_point3D(point) if not point3D: return ('off', None) if self.rfcontext.is_point_on_mirrored_side(point3D): return ('off', None) for bmf, cos in vis_faces2D: co0 = cos[0] for co1, co2 in zip(cos[1:-1], cos[2:]): if intersect_point_tri_2d(point, co0, co1, co2): return ('tar', bmf) return ('src', None)
def point_is_inside_of_tri(self, p, tri, threshold=THRESHOLD, exclude_edges=False): """ pがtriの中に含まれるか調べる。 p: 2d persp coord exclude_edges: triの三辺上に来る場合は偽とする。 """ tri_vecs = [self.persp_coords[loop.vert].to_2d() for loop in tri] # 三角形の三辺上にくるか調べる for i in range(3): v1 = tri_vecs[i - 1] v2 = tri_vecs[i] if isect_point_line_v2(p, v1, v2, threshold): if exclude_edges: return False else: return True return bool(geo.intersect_point_tri_2d(p, *tri_vecs))
def inside_tri_tri_2d(v1, v2, v3, v4, v5, v6): """(v1, v2, v3)が(v4,v5,v6)の内側に在る場合1を返す(重なる場合も含む)。 逆なら-1(重なる場合も含む), 重ならない場合は0を返す。 """ if geom.intersect_point_tri_2d(v1, v4, v5, v6): if geom.intersect_point_tri_2d(v2, v4, v5, v6): if geom.intersect_point_tri_2d(v3, v4, v5, v6): return 1 if geom.intersect_point_tri_2d(v4, v1, v2, v3): if geom.intersect_point_tri_2d(v5, v1, v2, v3): if geom.intersect_point_tri_2d(v6, v1, v2, v3): return -1 return 0
def inside_tri_tri_2d(v1, v2, v3, v4, v5, v6): """ (v1, v2, v3)が(v4,v5,v6)の内側に在る場合1を返す(重なる場合も含む)。 逆なら-1(重なる場合も含む), 重ならない場合は0を返す。 """ if geom.intersect_point_tri_2d(v1, v4, v5, v6): if geom.intersect_point_tri_2d(v2, v4, v5, v6): if geom.intersect_point_tri_2d(v3, v4, v5, v6): return 1 if geom.intersect_point_tri_2d(v4, v1, v2, v3): if geom.intersect_point_tri_2d(v5, v1, v2, v3): if geom.intersect_point_tri_2d(v6, v1, v2, v3): return -1 return 0