2017-04-05 8 views
3

持つ配列への座標1からeucledeanの距離を計算し、私はそれを編集した:のPython:私の前の質問は非常に不明確であったため、座標

私は、次の問題があります。

私はのためのパターンを構築したいです半径がr + fcr_sizeの球状球です。浅球の空洞は半径rを持つ必要があります。パターンを使って、私は多くの異なる球の中心でそれを使用し、多くの巨大な球を得ることができました。今私は最速のソリューションを探しています。私のアプローチは次のとおりです。

centoEdge = radius+fcr_size #Bounding box coordinates from center to edge 
    xyz_pattern=[] 

    #Create the Bounding Box only in positive x,y,z direction, because they are later mirrowed         

    x1 = range(0,int(centoEdge)+1) 
    y1 = range(0,int(centoEdge)+1) 
    z1 = range(0,int(centoEdge)+1) 

    #Check if coordinates are the hallow sphere and add them to xyz_pattern list 
    for coords in itertools.product(x1,y1,z1): 
     if radius < distance.euclidean([0,0,0],coords) <= (radius+fcr_size): 
      xyz_pattern.append(coords) 

    #mirrow the pattern arround center   
    out = [] 
    for point in xyz_pattern: 
     for factors in itertools.product([1, -1], repeat=3): # (1, 1, 1), (1, 1, -1), (1, -1, 1), ..., (-1, -1, -1) 
      out.append(tuple(point[i]*factors[i] for i in range(3))) 


    xyz_pattern=list(set(out)) 
+0

球形の空洞を持つ立方体ですか? –

+0

@ Ev.Kounis:バウンディングボックスに球形キャビティを持つ球 – Varlor

+1

しかし、バウンディングボックスも球形ですか?ボックスは常に私に長方形と聞こえるので、私は尋ねています。 – jotasi

答えて

1

このソリューションはPython Functional Programmingに基づいています。

import math 
from functools import partial 
import itertools 
import numpy as np 


def distance(p1, p2): 
    return math.sqrt(sum(math.pow(float(x1) - float(x2), 2) for x1, x2 in zip(p1, p2))) 


def inside_radius(radius, p): 
    return distance(p, (0, 0, 0)) < float(radius) 


def inside_squre(centoEdge, p): 
    return all(math.fabs(x) <= centoEdge for x in p) 


radius = 5 
fcr_siz = 5 
centoEdge = radius + fcr_siz 
x1 = range(0, int(centoEdge) + 1) 
y1 = range(0, int(centoEdge) + 1) 
z1 = range(0, int(centoEdge) + 1) 
coords = np.array(list(itertools.product(x1, y1, z1))) 


inside_squre_with_cento = partial(inside_squre, centoEdge) 
inside_radius_with_radius = partial(inside_radius, radius) 

result = filter(lambda p: not inside_radius_with_radius(p), filter(inside_squre_with_cento, coords)) 

print(result) 
関連する問題