Algoritmo mais eficiente para calcular normais de vértices a partir do conjunto de triângulos para sombreamento de Gouraud

Nos é dado um conjunto de triângulos. Cada triângulo é um trio de pontos. Cada ponto é um trio de números reais. Podemos calcular a superfície normal para cada triângulo. Para o sombreamento de Gouraud, no entanto, precisamos de normais de vértice. Portanto, temos que visitar cada vértice e observar os triângulos que compartilham esse vértice, calcular a média dos seus normais de superfície e obter o vértice normal.

Qual é o algoritmo mais eficiente e estrutura de dados para conseguir isso?

Uma abordagem ingênua é essa (código pseudo-python):

MAP = dict()
for T in triangles:
  for V in T.vertices:
    key = hash(V)
    if MAP.has(key):
      MAP[key].append(T)
    else:
      MAP[key] = []
      MAP[key].append(T)

VNORMALS = dict()
for key in MAP.keys():
  VNORMALS[key] = avg([T.surface_normal for T in MAP[key]])

Existe uma abordagem mais eficiente?

questionAnswers(2)

yourAnswerToTheQuestion