#! /usr/bin/python3 # Last edited on 2023-06-12 17:05:48 by stolfi # Compute a vector {v} with tree nonzero and distinct coordinates # such that the 48 sign-flips and permutations are as separated as possible. from math import inf, sqrt def main(): # v = (0.8343526900035698, 0.5094884257056673, 0.2104213220084118) # v = (0.8253501198358801, 0.5215643061465987, 0.21625876685284984) # v = (0.825883912599991, 0.5207186912677729, 0.2162586587235475) # v = (0.8259935240003327, 0.5207878011076222, 0.21567281823864468) # v = (0.8259577330612125, 0.5208243435244877, -0.21572164098362878) # v = (0.8259434156067079, 0.5208389595498422, -0.21574116999535153) # v = (0.8259418154023249, 0.5208414971364776, -0.21574116999438067) # v = (0.8259427137773173, 0.5208408814277186, -0.21573921709266863) # v = (0.8259425705997766, 0.5208410275849338, -0.21573941238286357) # v = (0.8259425705997767, 0.5208410275849339, -0.2157394123828636) # v = (0.8259425866018402, 0.5208410022090799, -0.2157394123828635) # v = (0.8259425901812791, 0.5208409985551501, -0.21573940750060858) # v = (0.8259425910796527, 0.5208409979394399, -0.21573940554770663) # v = (0.8259425911708956, 0.5208409979969779, -0.21573940505948114) # v = (0.825942591027718, 0.5208409981431351, -0.21573940525477134) # v = (0.825942591027718, 0.5208409981431351, -0.21573940525477134) v = (0.8259425910240683, 0.5208409981408336, -0.21573940527430036) print("v = ", v) print("|v| = ", vlen(v)) u = vdir(( +v[1], -v[0], 0 )) w = vdir(vcross(u, v)); dminmax = 0 tminmax = None for ku in range(-10,11): for kw in range(-10,11): print(" k = ", ku, kw) t = vdir(vmix(vmix(v, 1, u, 0.00000000002*ku), 1, w, 0.00000000002*kw)) print(" t = ", t) dmin = enum_trimmed_octahedron(None, t) print("dmin = ", dmin) if abs(dmin) > abs(dminmax): dminmax = dmin tminmax = t print("") print("dminmax = ", dminmax) print("tminmax = ", tminmax) return 0; # ---------------------------------------------------------------------- def enum_trimmed_octahedron(wr, v): # Generate all permutations and sign-flips of {v}: wmin = None dmin = +inf w = v; k = 0; for eo in range(2): for cy in range(3): for s0 in range(2): for s1 in range(2): for s2 in range(2): if wr != None: wr.write("#declare pt[%2d] = < %+19.16f, %+19.16f, %+19.16f >;\n" % (k, w[0], w[1], w[2])) if (v != w): d = vdist(v, w) if abs(d) < abs(dmin): dmin = d wmin = w k = k + 1 w = ( +w[0], +w[1], -w[2] ) w = ( +w[0], -w[1], +w[2] ) w = ( -w[0], +w[1], +w[2] ) w = ( w[1], w[2], w[0] ) w = ( w[1], w[0], w[2] ) print("") print("dmin = ", dmin) print("wmin = ", wmin) return dmin # ---------------------------------------------------------------------- def vcross(x, y): return( x[1]*y[2] - x[2]*y[1], x[2]*y[0] - x[0]*y[2], x[0]*y[1] - x[1]*y[0] ) # ---------------------------------------------------------------------- main()