Beispiel #1
0
 def __init__(self,
              symname,
              tgtaxis1,
              tgtaxis2,
              from_seg,
              *,
              tol=1.0,
              lever=50,
              to_seg=-1,
              distinct_axes=False):
     if from_seg == to_seg:
         raise ValueError('from_seg should not be same as to_seg')
     self.symname = symname
     self.from_seg = from_seg
     if len(tgtaxis1) == 2: tgtaxis1 += [0, 0, 0, 1],
     if len(tgtaxis2) == 2: tgtaxis2 += [0, 0, 0, 1],
     self.tgtaxis1 = (tgtaxis1[0], hm.hnormalized(tgtaxis1[1]),
                      hm.hpoint(tgtaxis1[2]))
     self.tgtaxis2 = (tgtaxis2[0], hm.hnormalized(tgtaxis2[1]),
                      hm.hpoint(tgtaxis2[2]))
     assert 3 == len(self.tgtaxis1)
     assert 3 == len(self.tgtaxis2)
     self.angle = hm.angle(tgtaxis1[1], tgtaxis2[1])
     self.tol = tol
     self.lever = lever
     self.to_seg = to_seg
     self.rot_tol = tol / lever
     self.distinct_axes = distinct_axes  # -z not same as z (for T33)
     self.sym_axes = [self.tgtaxis1, self.tgtaxis2]
Beispiel #2
0
   def __init__(self, symname, tgtaxis1, tgtaxis2, from_seg=0, origin_seg=None, *, tolerance=1.0,
                lever=50, to_seg=-1, nondistinct_axes=False, segs=None, tgtaxis3=None):
      """
        """
      if from_seg == to_seg:
         raise ValueError("from_seg should not be same as to_seg")
      self.symname = symname
      self.from_seg = from_seg
      if len(tgtaxis1) == 2:
         tgtaxis1 += ([0, 0, 0, 1], )
      if len(tgtaxis2) == 2:
         tgtaxis2 += ([0, 0, 0, 1], )
      self.tgtaxis1 = (
         tgtaxis1[0],
         hm.hnormalized(tgtaxis1[1]),
         hm.hpoint(tgtaxis1[2]),
      )
      self.tgtaxis2 = (
         tgtaxis2[0],
         hm.hnormalized(tgtaxis2[1]),
         hm.hpoint(tgtaxis2[2]),
      )
      if tgtaxis3:
         if len(tgtaxis3) == 2:
            tgtaxis3 += ([0, 0, 0, 1], )
         self.tgtaxis3 = (
            tgtaxis3[0],
            hm.hnormalized(tgtaxis3[1]),
            hm.hpoint(tgtaxis3[2]),
         )
         assert 3 == len(self.tgtaxis3)
      assert 3 == len(self.tgtaxis1)
      assert 3 == len(self.tgtaxis2)

      self.tgtangle = hm.angle(tgtaxis1[1], tgtaxis2[1])
      self.tolerance = tolerance
      self.lever = lever
      self.to_seg = to_seg
      self.rot_tol = tolerance / lever
      self.nondistinct_axes = nondistinct_axes  # -z not same as z (for T33)
      self.sym_axes = [self.tgtaxis1, self.tgtaxis2]
      self.is_cyclic = False
      self.origin_seg = None
      self.segs = segs
Beispiel #3
0
 def score(self, segpos, verbosity=False, **kw):
    cen1 = segpos[self.from_seg][..., :, 3]
    cen2 = segpos[self.to_seg][..., :, 3]
    ax1 = segpos[self.from_seg][..., :, 2]
    ax2 = segpos[self.to_seg][..., :, 2]
    if self.nondistinct_axes:
       p, q = hm.line_line_closest_points_pa(cen1, ax1, cen2, ax2)
       dist = hm.hnorm(p - q)
       cen = (p + q) / 2
       ax1c = hm.hnormalized(cen1 - cen)
       ax2c = hm.hnormalized(cen2 - cen)
       ax1 = np.where(hm.hdot(ax1, ax1c)[..., None] > 0, ax1, -ax1)
       ax2 = np.where(hm.hdot(ax2, ax2c)[..., None] > 0, ax2, -ax2)
       ang = np.arccos(hm.hdot(ax1, ax2))
    else:
       dist = hm.line_line_distance_pa(cen1, ax1, cen2, ax2)
       ang = np.arccos(np.abs(hm.hdot(ax1, ax2)))
    roterr2 = (ang - self.tgtangle)**2
    return np.sqrt(roterr2 / self.rot_tol**2 + (dist / self.tolerance)**2)