Programová manipulace s STL
Motivace
Kromě ručního zpracování meshe v programech, jako je netfabb Studio, je možné mesh zpracovávat i programově - tedy vytvářet programy, které s meshí něco více či méně zajímavého provádějí. Protože jsem na Fakultě informačních technologií, byla by škoda tento přístup neprozkoumat.
ADMesh
ADMesh je open-source program, který umožňuje manipulovat s STL meshí z příkazové řádky. Kromě rozhraní pro příkazový řádek je k dispozici také knihovní API.
Zde krátký program, který načte STL soubor model.stl
(binární nebo ASCII) a zapíše jej jako ASCII nebo binární STL do stejného souboru - z binárních dělá ASCII a z ASCII dělá binární.
#include <stdlib.h>
#include <admesh/stl.h>
int main(void) {
stl_file stl_in;
char *filename = "model.stl";
printf("Opening %s\n", filename);
stl_open(&stl_in, filename);
stl_exit_on_error(&stl_in);
if (stl_in.stats.type == binary) {
printf("Writing ASCII file %s\n", filename);
stl_write_ascii(&stl_in, filename, "ADMesh");
stl_exit_on_error(&stl_in);
} else {
printf("Writing binary file %s\n", filename);
stl_write_binary(&stl_in, filename, "ADMesh");
stl_exit_on_error(&stl_in);
}
stl_close(&stl_in);
return EXIT_SUCCESS;
}
Všimněte si, že:
- funkce přijímají jako první argument ukazatel na strukturu
stl_file
- po každém volání funkce je korektní volat
stl_exit_on_error()
, jinak můžete dostat SEGFAULT - na konci se sluší volat
stl_close()
Program se kompiluje pomocí:
gcc source.c -ladmesh
Případně, pokud nemáte amdesh ve standardních cestách:
gcc -L/cesta/k/adresáři/knihovnou -I/cesta/k/adresáři/s/hlavičkovým/souborem source.c -ladmesh
Pro ty méně šťastné z vás, používající Windows, bohužel instrukce neznáme.
Jednotlivé funkce a struktury najdete v souboru admesh/stl.h. Velkou dokumentací knihovna bohužel neoplývá.
Úkol
Za tři body na cvičení naprogramujte program v jazyce C, C++ nebo Python, který pro zadaný STL soubor (první argument volání programu) najde nejvhodnější rotaci kolem osy Z tak, aby plocha obdélníkové podstavy pomyslného opsaného hranolu objektu byla co nejmenší - hrany pomyslného opsaného hranolu jsou rovnoběžné s osami X, Y nebo Z.
Ilustrační obrázek z netfabbu ukazující opsaný hranol s obdélníkovou podstavou:

Program vypíše do terminálu úhel otočení (ve stupních) a do souboru zadaného druhým argumentem (z příkazové řádky) uloží orotovaný soubor v takovém formátu (ASCII/binary), v jakém byl načten vstupní soubor.
Vhodný úhel nalezněte bruteforce metodou pro úhly otočení v násobcích 5° (5°, 10°, 15°, …).
Vhodné funkce a údaje:
stl_rotate_z(&stl_in, angle_in_degrees)
- rotuje kolem osy Zstl_file.stats.number_of_facets
je počet trojúhelníků v STLstl_file.facet_start
je ukazatel na první trojúhelník (a jde k němu přistupovat jako k poli)- trojúhelníky jsou uloženy v strukturách
stl_facet
obsahující v trojprvkovém polivertex
tři vrcholy (strukturastl_vertex
obsahující tři floatyx
,y
az
) - zajímavé údaje jsou uloženy i ve
stl_file.stats