跳至內容

File:Szilassi polyhedron.stl

頁面內容不支援其他語言。
這個檔案來自維基共享資源
維基百科,自由的百科全書

原始檔案 (5,120 × 2,880 像素,檔案大小:1 KB,MIME 類型:application/sla


View Szilassi polyhedron.stl  on viewstl.com

摘要

描述
English: Szilassi polyhedron (polyhedron with complete face adjacency) by CMG Lee.
日期
來源 自己的作品
作者 Cmglee

Python source

#!/usr/bin/env python

header    = 'Szilassi polyhedron (polyhedron with complete face adjacency) by CMG Lee.'
vertexsss = [ ## [i_vertex][property][x,y,z etc]
             {'xyz':(-240,   0, 240), 'colour':'#f90', 'label':'G'},
             {'xyz':( 240,   0, 240), 'colour':'#960', 'label':'H'},
             {'xyz':(   0,-252,-240), 'colour':'#069', 'label':'B'},
             {'xyz':(   0, 252,-240), 'colour':'#0cf', 'label':'M'},
             {'xyz':(  40,-100,-160), 'colour':'#060', 'label':'C'},
             {'xyz':( -40, 100,-160), 'colour':'#090', 'label':'L'},
             {'xyz':( -75, -75, -60), 'colour':'#009', 'label':'D'},
             {'xyz':(  75,  75, -60), 'colour':'#00f', 'label':'K'},
             {'xyz':(  90, -50,  40), 'colour':'#909', 'label':'E'},
             {'xyz':( -90,  50,  40), 'colour':'#f0f', 'label':'J'},
             {'xyz':(-140,   0,  40), 'colour':'#000', 'label':'A'},
             {'xyz':( 140,   0,  40), 'colour':'#666', 'label':'N'},
             {'xyz':(-140, -50,  40), 'colour':'#900', 'label':'F'},
             {'xyz':( 140,  50,  40), 'colour':'#f00', 'label':'I'}]
facesss = [ ## [i_face][property][i_vertex etc]
           {'vertexss':[(11,13, 9,10,12, 8)      ],'flip':False, 'colour':'#999'},
           {'vertexss':[( 6, 4, 2,10, 9, 7)      ],'flip':False, 'colour':'#f66'},
           {'vertexss':[( 7, 5, 3,11, 8, 6)      ],'flip':False, 'colour':'#66f'},
           {'vertexss':[( 9,13, 1, 0, 5, 7)      ],'flip':False, 'colour':'#0c0'},
           {'vertexss':[( 8,12, 0, 1, 4, 6)      ],'flip':False, 'colour':'#fc0'},
           {'vertexss':[( 5,10, 2, 3),(0,12,10,5)],'flip':False, 'colour':'#c9f'},
           {'vertexss':[( 4,11, 3, 2),(1,13,11,4)],'flip':False, 'colour':'#6cf'}]

import re, struct, math
def fmt(string): ## string.format(**vars()) using tags {expression!format} by CMG Lee
 def f(tag): i_sep = tag.rfind('!'); return (re.sub('\.0+$', '', str(eval(tag[1:-1])))
  if (i_sep < 0) else ('{:%s}' % tag[i_sep + 1:-1]).format(eval(tag[1:i_sep])))
 return (re.sub(r'(?<!{){[^{}]+}', lambda m:f(m.group()), string)
         .replace('{{', '{').replace('}}', '}'))
def append(obj, string): return obj.append(fmt(string))
def tabbify(cellss, separator='|'):
 cellpadss = [list(rows) + [''] * (len(max(cellss, key=len)) - len(rows)) for rows in cellss]
 fmts = ['%%%ds' % (max([len(str(cell)) for cell in cols])) for cols in zip(*cellpadss)]
 return '\n'.join([separator.join(fmts) % tuple(rows) for rows in cellpadss])
def hex_rgb(colour): ## convert [#]RGB to #RRGGBB and [#]RRGGBB to #RRGGBB
 return '#%s' % (colour if len(colour) > 4 else ''.join([c * 2 for c in colour])).lstrip('#')
def viscam_colour(colour):
 colour_hex      = hex_rgb(colour)
 colour_top5bits = [int(colour_hex[i:i+2], 16) >> 3 for i in range(1,7,2)]
 return (1 << 15) + (colour_top5bits[0] << 10) + (colour_top5bits[1] << 5) + colour_top5bits[2]
def roundm(x, multiple=1):
 if   (isinstance(x, tuple)): return tuple(roundm(list(x), multiple))
 elif (isinstance(x, list )): return [roundm(x_i, multiple) for x_i in x]
 else: return int(math.floor(float(x) / multiple + 0.5)) * multiple
def flatten(lss): return [l for ls in lss for l in ls]
def rotate(facetss, degs): ## around x then y then z axes
 (deg_x,deg_y,deg_z) = degs
 (sin_x,cos_x) = (math.sin(math.radians(deg_x)), math.cos(math.radians(deg_x)))
 (sin_y,cos_y) = (math.sin(math.radians(deg_y)), math.cos(math.radians(deg_y)))
 (sin_z,cos_z) = (math.sin(math.radians(deg_z)), math.cos(math.radians(deg_z)))
 facet_rotatess = []
 for facets in facetss:
  facet_rotates = []
  for i_point in range(4):
   (x, y, z) = [facets[3 * i_point + i_xyz] for i_xyz in range(3)]
   if (x is None or y is None or z is None):
    facet_rotates += [x, y, z]
   else:
    (y, z) = (y * cos_x - z * sin_x,  y * sin_x + z * cos_x) ## rotate about x
    (x, z) = (x * cos_y + z * sin_y, -x * sin_y + z * cos_y) ## rotate about y
    (x, y) = (x * cos_z - y * sin_z,  x * sin_z + y * cos_z) ## rotate about z
    facet_rotates += [round(value, 9) for value in [x, y, z]]
  facet_rotatess.append(facet_rotates)
 return facet_rotatess
def translate(facetss, ds): ## ds = (dx,dy,dz)
 return [facets[:3] + [facets[3 * i_point + i_xyz] + ds[i_xyz]
                       for i_point in range(1,4) for i_xyz in range(3)]
         for facets in facetss]

## Add facets
facetss = []
for facess in facesss:
 for face_vertexs in facess['vertexss']:
  face_vertexss = [list(vertexsss[i_vertex]['xyz'])
                   for i_vertex in (face_vertexs[::-1] if (facess['flip']) else face_vertexs)]
  for i_face_vertex in range(len(face_vertexss) - 2):
   facetss.append(flatten([(None,0,0), face_vertexss[0], face_vertexss[i_face_vertex + 1],
                           face_vertexss[i_face_vertex + 2], [facess['colour']]]))
facetss = [facets[:3] + facets[6:9] + facets[3:6] + facets[9:] for facets in facetss] ## flip facets

## Calculate normals
for facets in facetss:
 if (facets[0] is None or facets[1] is None or facets[2] is None):
  us      = [facets[i_xyz + 9] - facets[i_xyz + 6] for i_xyz in range(3)]
  vs      = [facets[i_xyz + 6] - facets[i_xyz + 3] for i_xyz in range(3)]
  normals = [us[1]*vs[2] - us[2]*vs[1], us[2]*vs[0] - us[0]*vs[2], us[0]*vs[1] - us[1]*vs[0]]
  normal_length = sum([component * component for component in normals]) ** 0.5
  facets[:3] = [-round(component / normal_length, 10) for component in normals]

print(tabbify([['N%s'  % (xyz   )                   for xyz in list('xyz')] +
               ['%s%d' % (xyz, n) for n in range(3) for xyz in list('XYZ')] + ['RGB']] + facetss))
## Compile STL
outss = ([[('STL\n\n%-73s\n\n' % (header[:73])).encode('utf-8'), struct.pack('<L',len(facetss))]] +
         [[struct.pack('<f',float(value)) for value in facets[:12]] +
          [struct.pack('<H',0 if (len(facets) <= 12) else
                            viscam_colour(facets[12]))] for facets in facetss])
out   = b''.join([bytes(out) for outs in outss for out in outs])
# out += ('\n\n## Python script to generate STL\n\n%s\n' % (open(__file__).read())).encode('utf-8')
print("# bytes:%d\t# facets:%d\ttitle:\"%-73s\"" % (len(out), len(facetss), header[:73]))
with open(__file__[:__file__.rfind('.')] + '.stl', 'wb') as f_out: f_out.write(out)

授權條款

我,本作品的著作權持有者,決定用以下授權條款發佈本作品:
w:zh:創用CC
姓名標示 相同方式分享
您可以自由:
  • 分享 – 複製、發佈和傳播本作品
  • 重新修改 – 創作演繹作品
惟需遵照下列條件:
  • 姓名標示 – 您必須指名出正確的製作者,和提供授權條款的連結,以及表示是否有對內容上做出變更。您可以用任何合理的方式來行動,但不得以任何方式表明授權條款是對您許可或是由您所使用。
  • 相同方式分享 – 如果您利用本素材進行再混合、轉換或創作,您必須基於如同原先的相同或兼容的條款,來分布您的貢獻成品。
Wikimedia Foundation
The uploader of this file has agreed to the Wikimedia Foundation 3D patent license: This file and any 3D objects depicted in the file are both my own work. I hereby grant to each user, maker, or distributor of the object depicted in the file a worldwide, royalty-free, fully-paid-up, nonexclusive, irrevocable and perpetual license at no additional cost under any patent or patent application I own now or in the future, to make, have made, use, offer to sell, sell, import, and distribute this file and any 3D objects depicted in the file that would otherwise infringe any claims of any patents I hold now or in the future.

Please note that in the event of any differences in meaning or interpretation between the original English version of this license and a translation, the original English version takes precedence.

說明

添加單行說明來描述出檔案所代表的內容

在此檔案描寫的項目

描繪內容

檔案歷史

點選日期/時間以檢視該時間的檔案版本。

日期/時間縮⁠圖尺寸使用者備⁠註
目前2018年3月29日 (四) 19:10於 2018年3月29日 (四) 19:10 版本的縮圖5,120 × 2,880(1 KB)CmgleeTry to fix z-fighting.
2018年3月29日 (四) 18:57於 2018年3月29日 (四) 18:57 版本的縮圖5,120 × 2,880(1 KB)CmgleeRemove redundant facets.
2018年3月29日 (四) 18:49於 2018年3月29日 (四) 18:49 版本的縮圖5,120 × 2,880(2 KB)CmgleeUser created page with UploadWizard

下列頁面有用到此檔案:

全域檔案使用狀況

以下其他 wiki 使用了這個檔案: