1

I have a bunch of vertices - e.g., (321, -190, 475). I need to apply a "transform" to each vertex. For example, if I apply the transform (-3, 1, -2) to the preceding vertex I would get (-475, 321, 190). Transforms can be any permutation of (1, 2, 3) - list(itertools.permutations((1, 2, 3))). In addition, each number can be positive or negative. In other words I could have (3, 2, 1) or (3, -2, -1) or (-3, 2, 1), ...

This seems pretty straight forward, but I feel like my solution is still sub-optimal:

def vert_transform(vertex, offsets):
    x_index = offsets.index(1) if offsets.count(1) else offsets.index(-1)
    y_index = offsets.index(2) if offsets.count(2) else offsets.index(-2)
    z_index = offsets.index(3) if offsets.count(3) else offsets.index(-3)

    match (x_index, y_index, z_index):
        case 0, 1, 2:
            new_vertex = [vertex[0], vertex[1], vertex[2]]
        case 0, 2, 1:
            new_vertex = [vertex[0], vertex[2], vertex[1]]
        case 1, 0, 2:
            new_vertex = [vertex[1], vertex[0], vertex[2]]
        case 1, 2, 0:
            new_vertex = [vertex[2], vertex[0], vertex[1]]
        case 2, 0, 1:
            new_vertex = [vertex[1], vertex[2], vertex[0]]
        case 2, 1, 0:
            new_vertex = [vertex[2], vertex[1], vertex[0]]

    xoff = offsets[x_index]
    yoff = offsets[y_index]
    zoff = offsets[z_index]

    if xoff == -1:
        new_vertex[x_index] = -new_vertex[x_index]
    if yoff == -2:
        new_vertex[y_index] = -new_vertex[y_index]
    if zoff == -3:
        new_vertex[z_index] = -new_vertex[z_index]

    return new_vertex

I feel like there should be a better/simpler way to do this - any suggestions?

Thanks in advance,

--Jim

James S.
  • 475
  • 3
  • 10

2 Answers2

1

This can be accomplished through a simple loop:

# from https://stackoverflow.com/q/1986152/#comment90218429_16726462
def sign(a):
    return -1 if x < 0 else 1

def vert_transform(vertex, offsets):
    return tuple(vertex[abs(offset) - 1] * sign(offset) for offset in offsets)
SuperStormer
  • 4,997
  • 5
  • 25
  • 35
1

You could do it the following way:

vertex = [321, -190, 475]
offset = [-3, 1, -2]

sign = [-1 if e < 0 else 1 for e in offset]
indices = [abs(e) for e in offset]

new_vertex = [vertex[e-1]*s for e, s in zip(indices, sign)]

fhorrobin
  • 362
  • 1
  • 10