# Implementation of module {contact_example} # Last edited on 2021-03-21 13:22:46 by jstolfi import contact_example import move import move_parms import path import path_example import contact import job_parms import hacks import rn import pyx from math import nan, inf, sqrt import sys parms = job_parms.typical() parms['solid_raster_width'] = 1.00 parms['contour_trace_width'] = 0.50 mp_jump = move_parms.make_for_jumps(parms) mp_cont = move_parms.make_for_contours(parms) mp_fill = move_parms.make_for_fillings(parms) wd_fill = move_parms.width(mp_fill) wd_cont = move_parms.width(mp_cont) # CONTACTS def raster_raster_contact(oph0, oph1): # The {X} range of the contact will be {[xlo _ xhi]} xlo = -inf xhi = +inf mv = [None,None] # Top raster traces at top of {oph0} and bottom of {oph1}. for k in range(2): ophk = (oph0, oph1)[k] # Find the top and bottom rasters {omvk_lo, omvk_hi}: nmvk = path.nelems(ophk) omvk_lo = path.elem(ophk,0) omvk_hi = path.elem(ophk,nmvk-1) if move.pini(omvk_lo)[1] > move.pini(omvk_hi)[1]: omvk_lo, omvk_hi = omvk_hi, omvk_lo # Now pick the relevant trace for this block omvk = omvk_hi if k == 0 else omvk_lo # Save the unoriented move into {mv[k]}: mv[k], drk = move.unpack(omvk) # Find the {X} span and intersect with current {[xlo _ xhi]} pk, qk = move.endpoints(mv[k]) assert pk[1] == qk[1] # Trace must be horizontal. xlok = min(pk[0], qk[0]) xhik = max(pk[0], qk[0]) xlo = max(xlo, xlok) xhi = min(xhi, xhik) # Check coordinates: y0 = move.pini(mv[0])[1]; wd0 = move.width(mv[0]) y1 = move.pini(mv[1])[1]; wd1 = move.width(mv[1]) assert abs((y0 + wd0/2) - (y1 - wd1/2)) < 0.01*(wd0+wd1), "traces are not adjacent" assert xlo < xhi, "{X} randges do not overlap" # Create the contact: ymd = (y0 + y1 + (wd0 - wd1)/2)/2 ct = contact.make((xlo,ymd), (xhi, ymd), mv[0], mv[1]) return ct def misc_A(mp_fill): # Create a contact {ct}: p00 = (1,1) p01 = (4,1) mv0 = move.make(p00, p01, mp_fill) p10 = (2,2) p11 = (5,2) mv1 = move.make(p10, p11, mp_fill) q0 = (2, 1.5) q1 = (4, 1.5) ct = contact.make(q0, q1, mv0, mv1) return ct # ---------------------------------------------------------------------- def misc_B(mp_trace, mp_jump): # Create five paths with ten traces and five jumps: OPHS, TRS, JMS = path_example.misc_E(mp_trace, mp_jump) assert TRS != None # Make some contacts between the traces: q00 = (2.0, 3.5) q01 = (3.0, 3.5) ct0 = contact.make(q00, q01, TRS[0], TRS[1]) q10 = (4.0, 3.5) q11 = q10 ct1 = contact.make(q10, q11, TRS[1], TRS[2]) q20 = (3.5, 3.0) q21 = (3.5, 3.0) ct2 = contact.make(q20, q21, TRS[0], TRS[2]) dq3 = (1.0/sqrt(5), 0.5/sqrt(5)) q30 = tuple(rn.sub(move.pini(TRS[3]), dq3)) q31 = tuple(rn.add(move.pfin(TRS[2]), dq3)) ct3 = contact.make(q30, q31, TRS[2], TRS[3]) q40 = (5.0, 4.5) q41 = (5.0, 4.5) ct4 = contact.make(q40, q41, TRS[1], TRS[4]) q50 = (3.0, 7.5) q51 = (4.0, 7.5) ct5 = contact.make(q50, q51, TRS[7], TRS[9]) q60 = (5.0, 7.5) q61 = (6.0, 7.5) ct6 = contact.make(q60, q61, TRS[8], TRS[9]) q70 = (3.0, 6.5) q71 = (4.0, 6.5) ct7 = contact.make(q70, q71, TRS[7], TRS[5]) CTS = [ ct0, ct1, ct2, ct3, ct4, ct5, ct6, ct7, ] return CTS, OPHS, TRS # ---------------------------------------------------------------------- def misc_C(mp_trace): mp_trace = mp_fill wd = move_parms.width(mp_trace) nrs = [7, 3] # Number of rasters in each path. plo = [None,None] # Lower left corner of bbox each path. sz = [ 3*wd, 5*wd] plo[0] = ( 2, 1 ) plo[1] = ( plo[0][0] + sz[0] + wd, 2) PHS = [None, None] # The two paths. for i in range(2): axis = i alt = True PHSi, TRSi = path_example.raster_rectangle(plo[i], axis, nrs[i], alt, sz[i], wd, mp_trace,None) PHS[i] = PHSi[0] szmin = 0.25 rszmin = 0.50 CTS = contact.from_paths(PHS[0], PHS[1], szmin, rszmin) return CTS, PHS # ----------------------------------------------------------------------