File:Csaszar polyhedron.stl

出自Wikimedia Commons
跳至導覽 跳至搜尋

原始檔案 (5,120 × 2,880 像素,檔案大小:784位元組,MIME 類型:application/sla

說明

說明

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

View Csaszar polyhedron.stl  on viewstl.com


摘要

[編輯]
描述
English: Császár polyhedron (one of only two diagonal-less polyhedra) by CMG Lee.
日期
來源 自己的作品
作者 Cmglee

Python source

[編輯]
#!/usr/bin/env python

# header    = 'Cs\xe1sz\xe1r polyhedron (one of only two diagonal-less polyhedra) by CMG Lee.' ## non-ASCII characters hex-encoded
header    = 'Csaszar polyhedron (one of only two diagonal-less polyhedra) by CMG Lee.'
vertexsss = [ ## [i_vertex][property][x,y,z etc]
             {'xyz':(-6, 6,-6), 'colour':'#c00', 'label':'G'},
             {'xyz':(-6,-6,-5), 'colour':'#090', 'label':'C'},
             {'xyz':(-2,-3, 0), 'colour':'#069', 'label':'D'},
             {'xyz':( 2, 3, 0), 'colour':'#c60', 'label':'E'},
             {'xyz':( 6, 6,-5), 'colour':'#c0f', 'label':'F'},
             {'xyz':( 6,-6,-6), 'colour':'#00f', 'label':'B'},
             {'xyz':( 0, 0, 6), 'colour':'#000', 'label':'A'}]
facesss = [ ## [i_face][property][i_vertex etc]
           {'vertexs':[0,2,3], 'flip':True , 'colour':'#f00'}, ## face down 1
           {'vertexs':[2,3,5], 'flip':False, 'colour':'#00f'}, ## face down 2
           {'vertexs':[1,2,4], 'flip':False, 'colour':'#069'}, ## bottom inner 1
           {'vertexs':[1,3,4], 'flip':True , 'colour':'#960'}, ## bottom inner 2
           {'vertexs':[1,2,6], 'flip':True , 'colour':'#0f0'}, ## top inner 1
           {'vertexs':[3,4,6], 'flip':False, 'colour':'#f0f'}, ## top inner 2
           {'vertexs':[2,4,5], 'flip':True , 'colour':'#09f'}, ## bottom outer 2
           {'vertexs':[0,1,3], 'flip':False, 'colour':'#f90'}, ## bottom outer 2
           {'vertexs':[0,2,6], 'flip':False, 'colour':'#ff0'}, ## top outer 1
           {'vertexs':[3,5,6], 'flip':True , 'colour':'#ccc'}, ## top outer 2
           {'vertexs':[0,4,6], 'flip':True , 'colour':'#f66'}, ## outside 1
           {'vertexs':[1,5,6], 'flip':False, 'colour':'#66f'}, ## outside 2
           {'vertexs':[0,4,5], 'flip':False, 'colour':'#606'}, ## base 1
           {'vertexs':[0,1,5], 'flip':True , 'colour':'#060'}] ## base 2

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:
 vertexs        = facess['vertexs']
 vertex_facetss = [vertexsss[i_vertex]['xyz']
                   for i_vertex in (vertexs[::-1] if (facess['flip']) else vertexs)]
 facetss.append(flatten([(None,0,0)] + vertex_facetss + [[facess['colour']]]))
# facetss = [facets[:3] + facets[6:9] + facets[3:6] + facets[9:] for facets in facetss]

## 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日 (四) 08:45於 2018年3月29日 (四) 08:45 版本的縮圖5,120 × 2,880(784位元組)Cmglee留言 | 貢獻Rotate, and reduce height to better show hole.
2018年3月28日 (三) 19:37於 2018年3月28日 (三) 19:37 版本的縮圖5,120 × 2,880(784位元組)Cmglee留言 | 貢獻User created page with UploadWizard

全域檔案使用狀況

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