Коммит 58f50d58 создал по автору Victor Doval's avatar Victor Doval Зафиксировано автором Dealga McArdle
Просмотр файлов

Added back Edges intersect Tolerance (#2158)

* added back tolerance parameter to 2d intersection

* Corrected Absolute for tolerance
владелец 9e1b9547
......@@ -186,17 +186,20 @@ def intersect_edges_3d(verts_in, edges_in, s_epsilon):
def edges_from_ed_inter(ed_inter):
'''create edges from intersecctions library'''
'''create edges from intersections library'''
edges_out = []
for e in ed_inter:
# sort by first element of tuple (distances)
e_s = sorted(e)
e_s = [e for i,e in enumerate(e_s) if e[1]!= e_s[i-1][1]]
for i in range(1, len(e_s)):
edges_out.append((e_s[i-1][1], e_s[i][1]))
# if e_s[i-1][1] != e_s[i][1]:
if(e_s[i-1][1], e_s[i][1])not in edges_out:
edges_out.append((e_s[i-1][1], e_s[i][1]))
return edges_out
def intersect_edges_2d(verts, edges):
def intersect_edges_2d(verts, edges, epsilon):
'''Iterate through edges and expose them to intersect_line_line_2d'''
verts_in = [Vector(v) for v in verts]
ed_lengths = [(verts_in[e[1]] - verts_in[e[0]]).length for e in edges]
......@@ -227,10 +230,24 @@ def intersect_edges_2d(verts, edges):
d_to_2 = (vx - v3.to_2d()).length
new_id = len(verts_out)
if ((vx.x, vx.y, v1.z)) in verts_out:
new_id = verts_out.index((vx.x, vx.y, v1.z))
else:
if d_to_1 < epsilon:
new_id = e[0]
elif d_to_1 > d - epsilon:
new_id = e[1]
elif d_to_2 < epsilon:
new_id = e2[0]
elif d_to_2 > d2 - epsilon:
new_id = e2[1]
if new_id == len(verts_out):
verts_out.append((vx.x, vx.y, v1.z))
# first item stores distance to origin, second the vertex id
ed_inter[i].append([d_to_1, new_id])
ed_inter[j].append([d_to_2, new_id])
verts_out.append((vx.x, vx.y, v1.z))
edges_out = edges_from_ed_inter(ed_inter)
......@@ -290,7 +307,7 @@ class SvIntersectEdgesNodeMK2(bpy.types.Node, SverchCustomTreeNode):
if self.mode == "3D":
verts_out, edges_out = intersect_edges_3d(verts_in, edges_in, self.epsilon)
else:
verts_out, edges_out = intersect_edges_2d(verts_in, edges_in)
verts_out, edges_out = intersect_edges_2d(verts_in, edges_in, self.epsilon)
# post processing step to remove doubles
if self.rm_switch:
......
......@@ -288,56 +288,57 @@ def ciruclar_intersections(net2, verts, edges_in, v_len, radius):
np_rad = np.array(radius)
np_verts = np.array(verts)
indexes = np.array(cross_indices(v_len, edges_in))
p_rads = np_rad[indexes]
pairs = np_verts[indexes, :]
dif_v = pairs[:, 0, :] - pairs[:, 1, :]
sum_rad = p_rads[:, 0] + p_rads[:, 1]
dif_rad = abs(p_rads[:, 0] - p_rads[:, 1])
dist = np.linalg.norm(dif_v, axis=1)
mask = sum_rad > dist
mask *= dif_rad < dist
mask *= 0 < dist
p_rads = p_rads[mask, :]
index_inter = indexes[mask]
dist_v = dist[mask]
vec = dif_v[mask]
rad = p_rads[:, 0]
rad2 = p_rads[:, 1]
ang_base = (np.arctan2(vec[:, 1], vec[:, 0]) + 2*pi) % (2*pi)
a = rad*rad - rad2*rad2 + dist_v*dist_v
a /= 2*dist_v
h = np.sqrt(rad*rad - a*a)
ang = np.arcsin(h / rad)
a2 = rad2*rad2 - rad*rad + dist_v*dist_v
a2 /= 2*dist_v
h2 = np.sqrt(rad2*rad2 - a2*a2)
ang2 = np.arcsin(h2 / rad2)
p1 = ang_base - ang - pi
p1b = ang_base + ang - pi
p2 = ang_base - ang2
p2b = ang_base + ang2
p1 = p1.tolist()
p1b = p1b.tolist()
p2 = p2.tolist()
p2b = p2b.tolist()
index_inter = index_inter.tolist()
p_rads = p_rads.tolist()
for e, an1, an1b, an2, an2b, r in zip(index_inter, p1, p1b, p2, p2b, p_rads):
e0 = e[0]
e1 = e[1]
net2[e0][2].append([normal_angle(an1), r[0], 1])
net2[e0][2].append([normal_angle(an1b), r[0], 1])
net2[e1][2].append([normal_angle(an2), r[1], 1])
net2[e1][2].append([normal_angle(an2b), r[1], 1])
indexes = np.array(cross_indices(v_len, edges_in), dtype=np.int16)
if len(indexes) > 0:
p_rads = np_rad[indexes]
pairs = np_verts[indexes, :]
dif_v = pairs[:, 0, :] - pairs[:, 1, :]
sum_rad = p_rads[:, 0] + p_rads[:, 1]
dif_rad = abs(p_rads[:, 0] - p_rads[:, 1])
dist = np.linalg.norm(dif_v, axis=1)
mask = sum_rad > dist
mask *= dif_rad < dist
mask *= 0 < dist
p_rads = p_rads[mask, :]
index_inter = indexes[mask]
dist_v = dist[mask]
vec = dif_v[mask]
rad = p_rads[:, 0]
rad2 = p_rads[:, 1]
ang_base = (np.arctan2(vec[:, 1], vec[:, 0]) + 2*pi) % (2*pi)
a = rad*rad - rad2*rad2 + dist_v*dist_v
a /= 2*dist_v
h = np.sqrt(rad*rad - a*a)
ang = np.arcsin(h / rad)
a2 = rad2*rad2 - rad*rad + dist_v*dist_v
a2 /= 2*dist_v
h2 = np.sqrt(rad2*rad2 - a2*a2)
ang2 = np.arcsin(h2 / rad2)
p1 = ang_base - ang - pi
p1b = ang_base + ang - pi
p2 = ang_base - ang2
p2b = ang_base + ang2
p1 = p1.tolist()
p1b = p1b.tolist()
p2 = p2.tolist()
p2b = p2b.tolist()
index_inter = index_inter.tolist()
p_rads = p_rads.tolist()
for e, an1, an1b, an2, an2b, r in zip(index_inter, p1, p1b, p2, p2b, p_rads):
e0 = e[0]
e1 = e[1]
net2[e0][2].append([normal_angle(an1), r[0], 1])
net2[e0][2].append([normal_angle(an1b), r[0], 1])
net2[e1][2].append([normal_angle(an2), r[1], 1])
net2[e1][2].append([normal_angle(an2b), r[1], 1])
return net2
......@@ -656,7 +657,7 @@ class SvContourNode(bpy.types.Node, SverchCustomTreeNode):
verts_out, _, edges_out = mesh_join(points, [], edg)
verts_out, edges_out = intersect_edges_2d(verts_out, edges_out)
verts_out, edges_out = intersect_edges_2d(verts_out, edges_out, abs(self.mask_t))
edges_out = self.mask_edges_by_mid_points(verts_out, edges_out, parameters, v_len, edges_in)
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать