Commit d0db0dca191c933df781831dcec15e5ab27d73db
1 parent
179e4893
Exists in
master
and in
68 other branches
ENH: Improved the function that verifies if the user clicked in the line in the …
…clut widget raycasting
Showing
1 changed file
with
26 additions
and
11 deletions
Show diff stats
invesalius/gui/widgets/clut_raycasting.py
... | ... | @@ -111,7 +111,6 @@ class CLUTRaycastingWidget(wx.Panel): |
111 | 111 | return |
112 | 112 | curve = self._has_clicked_in_selection_curve((x, y)) |
113 | 113 | if curve is not None: |
114 | - print "Selecionou a curva", curve | |
115 | 114 | self.dragged = True |
116 | 115 | self.previous_wl = x |
117 | 116 | self.curve_dragged = curve |
... | ... | @@ -299,6 +298,23 @@ class CLUTRaycastingWidget(wx.Panel): |
299 | 298 | return (i, j) |
300 | 299 | return None |
301 | 300 | |
301 | + def distance_from_point_line(self, p1, p2, pc): | |
302 | + """ | |
303 | + Calculate the distance from point pc to a line formed by p1 and p2. | |
304 | + """ | |
305 | + # Create a vector pc-p1 and p2-p1 | |
306 | + A = numpy.array(pc) - numpy.array(p1) | |
307 | + B = numpy.array(p2) - numpy.array(p1) | |
308 | + # Calculate the size from those vectors | |
309 | + len_A = numpy.linalg.norm(A) | |
310 | + len_B = numpy.linalg.norm(B) | |
311 | + # calculate the angle (in radians) between those vector | |
312 | + theta = math.acos(numpy.dot(A, B) / (len_A * len_B)) | |
313 | + # Using the sin from theta, calculate the adjacent leg, which is the | |
314 | + # distance from the point to the line | |
315 | + distance = math.sin(theta) * len_A | |
316 | + return distance | |
317 | + | |
302 | 318 | def _has_clicked_in_selection_curve(self, position): |
303 | 319 | x, y = position |
304 | 320 | for i, curve in enumerate(self.curves): |
... | ... | @@ -306,20 +322,19 @@ class CLUTRaycastingWidget(wx.Panel): |
306 | 322 | return i |
307 | 323 | return None |
308 | 324 | |
309 | - def _has_clicked_in_line(self, position): | |
325 | + def _has_clicked_in_line(self, clicked_point): | |
310 | 326 | """ |
311 | 327 | Verify if was clicked in a line. If yes, it returns the insertion |
312 | - position in the point list. | |
328 | + clicked_point in the point list. | |
313 | 329 | """ |
314 | 330 | for n, curve in enumerate(self.curves): |
315 | - p = bisect.bisect([node.x for node in curve.nodes], position[0]) | |
316 | - print p | |
317 | - if p != 0 and p != len(curve.nodes): | |
318 | - x1, y1 = curve.nodes[p-1].x, curve.nodes[p-1].y | |
319 | - x2, y2 = position | |
320 | - x3, y3 = curve.nodes[p].x, curve.nodes[p].y | |
321 | - if int(float(x2 - x1) / (x3 - x2)) - int(float(y2 - y1) / (y3 - y2)) == 0: | |
322 | - return (n, p) | |
331 | + position = bisect.bisect([node.x for node in curve.nodes], | |
332 | + clicked_point[0]) | |
333 | + if position != 0 and position != len(curve.nodes): | |
334 | + p1 = curve.nodes[position-1].x, curve.nodes[position-1].y | |
335 | + p2 = curve.nodes[position].x, curve.nodes[position].y | |
336 | + if self.distance_from_point_line(p1, p2, clicked_point) <= 5: | |
337 | + return (n, position) | |
323 | 338 | return None |
324 | 339 | |
325 | 340 | def _calculate_distance(self, p1, p2): | ... | ... |