1

一連の三角形要素の座標を調整する必要があるこの Python スクリプトがあります。スクリプトは、ノードの座標を要素から要素の重心に向けて変更する必要があります。下の画像は、私が作成した問題のスケッチです。

ここに画像の説明を入力

しかし、スクリプトに何か問題があり、何が原因かわかりません。既存の座標を調整したいだけなのに、座標が正しい方向に変更されず、余分な新しい座標が生成されます。

Pythonでこれを正しくプログラムする方法を知っている人はいますか?

coords = [[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [0.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 1.0], [1.0, 1.0], [0.0, 2.0], [0.0, 2.0], [1.0, 1.0], [1.0, 2.0], [1.0, 1.0], [2.0, 1.0], [1.0, 2.0], [1.0, 2.0], [2.0, 1.0], [2.0, 2.0], [1.0, 1.0], [2.0, 0.0], [2.0, 1.0], [1.0, 0.0], [2.0, 0.0], [1.0, 1.0]]
elems = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20], [21, 22, 23]]

#define vectors
def add_vectors(*points):
  new_x = 0.0
  new_y = 0.0
  for point in points:
    new_x += point[0]
    new_y += point[1]
  return [new_x, new_y]

def subtract_vectors(a, b):
  new_x = a[0] - b[0]
  new_y = a[1] - b[1]
  return [new_x, new_y]


def mul_by_scalar(vector, scalar):
  new_x = vector[0] * scalar
  new_y = vector[1] * scalar
  return [new_x, new_y]

#define triangles
triangles = []
for elem in elems:
    triangles += [coords[e] for e in elem]

#adjust coordinates
CM = mul_by_scalar(add_vectors(*triangles), 1.0/3)

point_to_CM_vectors = []
for point in triangles:
  point_to_CM_vectors.append(subtract_vectors(CM, point))

new_triangle = []
for elem in elems:
    for point, motion in zip(triangles, point_to_CM_vectors):
      new_triangle.append(add_vectors(point, mul_by_scalar(motion, 0.01)))

print 'triangles =', triangles
print 'new_triangle =', new_triangle

助けてくれてありがとう!

4

1 に答える 1

2

これは、 numpyが提供するベクトル化演算子を使用して問題を修正したものです。

import numpy as np

#define triangles
triangles = np.array([[coords[e] for e in elem] for elem in elems])

#find centroid of each triangle
CM = np.mean(triangles,axis=1)

#find vector from each point in triangle pointing towards centroid
point_to_CM_vectors = CM[:,np.newaxis] - triangles

#calculate similar triangles 1% smaller
new_triangle = triangles + 0.01*point_to_CM_vectors
于 2013-04-13T23:48:19.780 に答える