2013-04-12 25 views
0

我有一個python腳本,其中我導入三角形元素的座標,並從兩個單獨的文本文件中導入元素定義。Python:調整座標到重心

座標文件看起來如下:

id,x,y, 
    1, 0, 0 
    2, 0, 1 
    3, 0, 2 
    4, 1, 0 
    5, 1, 1 
    6, 1, 2 
    7, 2, 0 
    8, 2, 1 
    9, 2, 2 

元件文件看起來像這樣:

id, n1, n2, n3 
1, 1, 2, 4 
2, 1, 2, 5 
3, 2, 3, 5 
4, 3, 5, 6 
5, 5, 6, 8 
6, 6, 8, 9 
7, 5, 7, 8 
8, 4, 5, 7 

在腳本我定義一個新的元件(矩形)時三角形單元的兩個邊緣在同一個地方。我首先爲每個三角形元素定義唯一的節點(所以元素不再共享同一個節點),然後我通過角落中的四個節點定義一個新的元素。下面

enter image description here

這只是正常 見圖像,然而在新定義的元素的厚度爲零。而且我確實希望讓他們有一個無形的厚度。因此,我想調整三角形元素的節點的座標,並將它們稍微移動到元素的重心。

如何找到三角形單元的重心,然後在單元重心方向上以0.001的水平值和0.001的垂直距離值更改節點的座標?

腳本目前,我有如下:

#!/usr/bin/env python 


open("D://Documents//SkyDrive//afstuderen//99 EEM - Abaqus 6.11.2//scripting//_COORDINATEN.txt", "r") 
import csv 
import itertools 

with open("_COORDINATEN.txt") as file: 
    data = csv.reader(file) 
    next(data) 
    coords = [] 
    coords = ([[float(x) for x in line[1:]] for line in data]) 


open("D://Documents//SkyDrive//afstuderen//99 EEM - Abaqus 6.11.2//scripting//_ELEMENTEN.txt", "r") 
import csv 
import itertools 

with open("_ELEMENTEN.txt") as file: 
    data2 = csv.reader(file) 
    next(data2) 
    elems = [] 
    elems = ([[int(x)-1 for x in line[1:]] for line in data2]) 


#Flip the original elements if required 
for i,elem in enumerate(elems): 
    ecoords = [coords[e] for e in elem] 

    a = [x2-x1 for x1,x2 in zip(ecoords[0],ecoords[1])] 
    b = [x2-x1 for x1,x2 in zip(ecoords[1],ecoords[2])] 

    n = a[0]*b[1]-a[1]*b[0] 

    if n < 0: 
     elems[i] = [ elem[0], elem[2], elem[1] ] 

#bewerking elementen 
newcoords = [] 
newelems = [] 
for elem in elems: 
    ecoords = [coords[e] for e in elem] 
    newelem = range(len(newcoords), len(newcoords)+len(ecoords)) 

    newcoords += ecoords 
    newelems.append(newelem) 

cohelems = [] 
for e,elem in enumerate(elems): 
    for edge in [[0,1],[1,2],[2,0]]: 

    eedge = [elem[i] for i in edge] 

    for e2,elem2 in enumerate(elems[e+1:]): 

     e2 += e+1 

     for edge2 in [[0,1],[1,2],[2,0]]: 

     eedge2 = [elem2[i] for i in edge2] 

     if all([i in eedge2 for i in eedge]): 

      newedge = [newelems[e][i] for i in edge ] 
      newedge += [newelems[e2][i] for i in edge2] 

      cohelems.append(newedge[-1::-1]) 
+1

你看過嗎? http://en.wikipedia.org/wiki/Centroid#Of_triangle_and_tetrahedron –

+0

謝謝你的回覆,我知道如何找到三角形的重心。但是我不知道如何在Python中編程,特別是如何改變三角形元素在重心方向上的座標 – user1967364

回答

1

我不會試圖讓這個完全對應的變量名。相反,我會給出一個通用示例來說明如何進行收縮。你應該能夠將它應用於你自己的事情。我正在使用Michael Mauderer鏈接的頁面上的一個公式。

問題只是矢量代數。如果你不使用向量類一般點的規劃,它會至少有助於定義一些向量運算:

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] 

有了這些,其餘變得容易一些:

triangle = [[0,0], [1,0], [1,1]] 

# finding the center of mass: 
# CM = (1/3) * (a + b + c) 
# CM:  position vector to the center of mass 
# a, b, c: position vectors to the corners 

CM = mul_by_scalar(add_vectors(*triangle), 1.0/3) 

# For every point of the triangle, find a vector that points towards its CM. 
# Scale the vectors to 10% (in this instance). 

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

# Make a new triangle, contracted by 10%. 

new_triangle = [] 
for point, motion in zip(triangle, point_to_CM_vectors): 
    new_triangle.append(add_vectors(point, mul_by_scalar(motion, 0.10))) 

您可以很容易地看到如何內嵌add_vectors,subtract_vectorsmul_by_scalar的功能來「手動」執行操作,但是您會不斷重複自己,代碼會很混亂。