File:Penang island.stl
De Wikimedia Commons, el repositorio multimedia libre
Ir a la navegación
Ir a la búsqueda
![File:Penang island.stl](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Penang_island.stl/800px-Penang_island.stl.png?20180331125410)
Tamaño de esta previsualización PNG del archivo STL: 800 × 600 píxeles. Otras resoluciones: 320 × 240 píxeles | 640 × 480 píxeles | 1024 × 768 píxeles | 1280 × 960 píxeles | 2560 × 1920 píxeles | 5120 × 3840 píxeles.
Archivo original (5120 × 2880 píxeles; tamaño de archivo: 2,54 MB; tipo MIME: application/sla)
Información del archivo
Datos estructurados
Leyendas
Leyendas
Añade una explicación corta acerca de lo que representa este archivo
View Penang island.stl on viewstl.com
Resumen
[editar]DescripciónPenang island.stl |
English: Penang Island terrain 3D model based on ASTER Global DEMv2 data by CMG Lee. |
|
Fecha | ||
Fuente | Trabajo propio | |
Autor | Cmglee | |
Otras versiones |
|
Python source
[editar]#!/usr/bin/env python
header = 'Penang Island terrain 3D model based on ASTER Global DEM data by CMG Lee.'
path_dem = 'Penang_Island_heightmap_ASTGTM2_N05E100_dem_20pc.png'
scale = 5e-2
thickness = 1
import re, struct, math, png
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]
## Read elevation data
(map_width, map_height, map_pixels, map_metadatas) = png.Reader(path_dem).read_flat()
print(map_width, map_height, len(map_pixels), map_metadatas)
heightss = [[map_pixels[4 * (map_width * y + x) + 1]
for y in range(map_height)] for x in range(map_width)]
## Add facets
facetss = []
for y in range(map_height - 1):
for x in range(map_width - 1):
(x0, y0, x1, y1) = (x, -y, x + 1, -(y + 1))
z00 = heightss[x ][y ] * scale
z01 = heightss[x ][y + 1] * scale
z11 = heightss[x + 1][y + 1] * scale
z10 = heightss[x + 1][y ] * scale
if (abs(z00 - z11) < abs(z01 - z10)):
if (z11 != 0 or z10 != 0 or z00 != 0):
facetss.append([None,0,0, x1,y1,z11, x1,y0,z10, x0,y0,z00])
if (z00 != 0 or z01 != 0 or z11 != 0):
facetss.append([None,0,0, x0,y0,z00, x0,y1,z01, x1,y1,z11])
else:
if (z10 != 0 or z00 != 0 or z01 != 0):
facetss.append([None,0,0, x1,y0,z10, x0,y0,z00, x0,y1,z01])
if (z01 != 0 or z11 != 0 or z10 != 0):
facetss.append([None,0,0, x0,y1,z01, x1,y1,z11, x1,y0,z10])
# sys.stdout.write(chr(int(math.ceil(heightss[x][y] * 0.1)) + 32))
# print('')
# writer = png.Writer(width=map_width, height=map_height, alpha=map_metadatas['alpha'])
# writer.write_array(open('test.png', 'wb'), map_pixels)
facetss += [facets[0: 5] + [max(0, facets[ 5] - thickness)] +
facets[9:11] + [max(0, facets[11] - thickness)] +
facets[6: 8] + [max(0, facets[ 8] - thickness)] for facets in facetss]
# facetss = [facets[:3] + facets[6:9] + facets[3:6] + facets[9:] for facets in facetss] ## flip
## 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)
Licencia
[editar]Yo, el titular de los derechos de autor de esta obra, la publico en los términos de la siguiente licencia:
![w:es:Creative Commons](https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/CC_some_rights_reserved.svg/90px-CC_some_rights_reserved.svg.png)
![atribución](https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Cc-by_new_white.svg/24px-Cc-by_new_white.svg.png)
![compartir igual](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Cc-sa_white.svg/24px-Cc-sa_white.svg.png)
Este archivo está disponible bajo la licencia Creative Commons Attribution-Share Alike 4.0 International.
- Eres libre:
- de compartir – de copiar, distribuir y transmitir el trabajo
- de remezclar – de adaptar el trabajo
- Bajo las siguientes condiciones:
- atribución – Debes otorgar el crédito correspondiente, proporcionar un enlace a la licencia e indicar si realizaste algún cambio. Puedes hacerlo de cualquier manera razonable pero no de manera que sugiera que el licenciante te respalda a ti o al uso que hagas del trabajo.
- compartir igual – En caso de mezclar, transformar o modificar este trabajo, deberás distribuir el trabajo resultante bajo la misma licencia o una compatible como el original.
![]() |
La persona que subió este archivo aceptó la licencia de patente 3D de la Fundación Wikimedia: Este archivo y cualquier objeto en 3D representado en el archivo son fruto de mi propio trabajo. Por medio de la presente otorgo a cada usuario, fabricante o distribuidor del objeto representado en el archivo una licencia a nivel mundial, libre de regalías, plenamente liberada, no exclusiva, irrevocable y perpetua sin costo adicional en virtud de cualquier patente o solicitud de patente que sea de mi propiedad actualmente o en el futuro, para hacer, solicitar que se haga, usar, ofrecer en venta, vender, importar y distribuir este archivo y cualquier objeto 3D representado en el archivo que de otra manera infringiría cualquier reclamo de cualquier patente que yo tenga ahora o en el futuro. Téngase en cuenta que en caso de diferencias de significado o interpretación entre la versión original en inglés de esta licencia y una traducción, la versión original en inglés tiene prioridad. |
Historial del archivo
Haz clic sobre una fecha y hora para ver el archivo tal como apareció en ese momento.
Fecha y hora | Miniatura | Dimensiones | Usuario | Comentario | |
---|---|---|---|---|---|
actual | 12:54 31 mar 2018 | ![]() | 5120 × 2880 (2,54 MB) | Cmglee (discusión | contribs.) | User created page with UploadWizard |
No puedes sobrescribir este archivo.
Usos del archivo
Las siguientes páginas usan este archivo:
Uso global del archivo
Las wikis siguientes utilizan este archivo:
- Uso en bn.wikipedia.org
- Uso en en.wikipedia.org
- Uso en vi.wikipedia.org
- Uso en www.wikidata.org