Пример #1
0
 def func(pos, idx, verts):
    cen1 = pos[from_seg][:, 3]
    cen2 = pos[to_seg][:, 3]
    ax1 = pos[from_seg][:, 2]
    ax2 = pos[to_seg][:, 2]
    if nondistinct_axes:
       cen1 = cen1[:3]
       cen2 = cen2[:3]
       ax1 = ax1[:3]
       ax2 = ax2[:3]
       p, q = numba_line_line_closest_points_pa(cen1, ax1, cen2, ax2)
       dist = np.sqrt(np.sum((p - q)**2))
       cen = (p + q) / 2
       ax1c = numba_normalized(cen1 - cen)
       ax2c = numba_normalized(cen2 - cen)
       if np.sum(ax1 * ax1c) < 0:
          ax1 = -ax1
       if np.sum(ax2 * ax2c) < 0:
          ax2 = -ax2
       ang = np.arccos(np.sum(ax1 * ax2))
    else:
       dist = hm.numba_line_line_distance_pa(cen1, ax1, cen2, ax2)
       ang = np.arccos(np.abs(hm.numba_dot(ax1, ax2)))
    roterr2 = (ang - tgtangle)**2
    return np.sqrt(roterr2 / rot_tol**2 + (dist / tolerance)**2)
Пример #2
0
 def lossfunc_Dx_Cx(pos, idx, vrts):
     ax = pos[to_seg, :3, 2]
     cn = pos[to_seg, :3, 3]
     mn = 9e9
     for i in range(d_2folds.shape[0]):
         d = hm.numba_line_line_distance_pa(cn, ax, origin, d_2folds[i])
         mn = min(d, mn)
     carterr2 = mn**2  # close to intersecting d_2fold
     angerr2 = (np.arccos(abs(ax[2])) * lever)**2  # C symaxis on z
     return np.sqrt(carterr2 + angerr2)
Пример #3
0
 def lossfunc_D2_C2_Z(pos, idx, vrts):
     ax = pos[to_seg, :3, 2]
     cn = pos[to_seg, :3, 3]
     mn = 9e9
     for i in range(d_2folds.shape[0]):
         d = hm.numba_line_line_distance_pa(cn, ax, origin, d_2diag[i])
         dot = abs(np.sum(d_2folds[i] * ax))
         angerr2 = (np.arccos(dot) * lever)**2
         mn = min(mn, np.sqrt(d**2 + angerr2))
     return mn
Пример #4
0
 def lossfunc_Dx_Cx(pos, idx, vrts):
     ax = pos[to_seg, :3, 2]
     cn = pos[to_seg, :3, 3]
     mn = 9e9
     for i in range(len(c_tgt_axis_isect)):
         c_axis_isects = c_tgt_axis_isect[i, 0]
         c_tgt_axis = c_tgt_axis_isect[i, 1]
         d = hm.numba_line_line_distance_pa(cn, ax, origin,
                                            c_axis_isects)
         a = np.arccos(abs(np.sum(c_tgt_axis * ax)))
         mn = min(mn, np.sqrt(d**2 + (a * lever)**2))
     return mn
Пример #5
0
    def alignment(self, segpos, out_cell_spacing=False, **kw):
        ax = segpos[self.to_seg, :3, 2]
        cn = segpos[self.to_seg, :3, 3]
        origin = np.array([0, 0, 0])

        if self.d_nfold > 2 and self.c_nfold > 2:
            mn, mni = 9e9, None
            for i, _ in enumerate(self.c_tgt_axis_isect):
                c_axis_isects, c_tgt_axis = _
                d = hm.numba_line_line_distance_pa(cn, ax, origin,
                                                   c_axis_isects)
                a = np.arccos(abs(np.sum(c_tgt_axis * ax)))
                err = np.sqrt(d**2 + (a * self.lever)**2)
                if err < mn:
                    mn = err
                    mni = i
            c_axis_isects, c_tgt_axis = self.c_tgt_axis_isect[mni]
            p, q = hm.line_line_closest_points_pa(cn, ax, origin,
                                                  c_axis_isects)
            cell_spacing = np.linalg.norm(p + q) / np.sqrt(2)  # 2x from p+q

            xalign = np.eye(4)
            if np.sum(c_axis_isects * q) > 0:
                xalign = hm.hrot(hm.hcross(c_axis_isects, c_tgt_axis),
                                 180) @ xalign
            xalign = self.aligners[mni] @ xalign

            xalign[:3, 3] = self.to_origin * cell_spacing

            d = np.linalg.norm(p - q)
            a = np.arccos(abs(np.sum(c_tgt_axis * ax)))
            carterr2 = d**2
            angerr2 = (a * self.lever)**2

            if np.sum(c_axis_isects * q) > 0:
                print()
                print("alignment", d, a * self.lever, self.lever)
                print("ax", ax, xalign[:3, :3] @ ax)
                print("cn", cn, xalign @ [cn[0], cn[1], cn[2], 1])
                print("isect", p)
                print("isect", q)
                print("cell_spacing", cell_spacing)
                print("xalign", hm.axis_angle_of(xalign))
                print(xalign)

        else:
            raise NotImplementedError

        if out_cell_spacing:
            return xalign, cell_spacing
        else:
            return xalign
Пример #6
0
 def lossfunc_D2_Cx(pos, idx, vrts):
     ax = pos[to_seg, :3, 2]
     cn = pos[to_seg, :3, 3]
     mn, mni = 9e9, -1
     mxdot, mxdoti = 0, -1
     for i in range(d_2folds.shape[0]):
         d = hm.numba_line_line_distance_pa(cn, ax, origin, d_2folds[i])
         if d < mn:
             mn, mni = d, i
         dot = abs(np.sum(d_2folds[i] * ax))
         if dot > mxdot:
             mxdot, mxdoti = dot, i
     if mxdoti == mni:
         # intersect same axis as parallel to, bad
         return 9e9
     carterr2 = mn**2
     angerr2 = (np.arccos(mxdot) * lever)**2
     return np.sqrt(carterr2 + angerr2)
Пример #7
0
        def lossfunc_Dx_C2(pos, idx, vrts):
            ax = pos[to_seg, :3, 2]
            cn = pos[to_seg, :3, 3]

            if abs(ax[2]) > 0.5:
                # case: c2 on z
                mn = 9e9
                for i in range(d_2folds.shape[0]):
                    d = hm.numba_line_line_distance_pa(cn, ax, origin,
                                                       d_2folds[i])
                    mn = min(d, mn)
                carterr2 = mn**2
                angerr2 = (np.arccos(abs(ax[2])) * lever)**2
                return np.sqrt(carterr2 + angerr2)
            else:
                # case: C2 in plane of sym and perp to one of d_2folds axis
                dot = 9e9
                for i in range(d_2folds.shape[0]):
                    dot = min(dot, abs(np.sum(d_2folds[i] * ax)))
                angerr2_a = (np.arcsin(dot) * lever)**2  # perp to d_2fold
                angerr2_b = (np.arcsin(ax[2]) * lever)**2  # axis in plane
                carterr2 = cn[2]**2  # center in plane
                return np.sqrt(angerr2_a + angerr2_b + carterr2)