Triangle é um software de distribuição livre para geração de malhas, triangulação de Delaunay e convex hull que pode ser baixado no link https://www.cs.cmu.edu/~quake/triangle.html.
Basicamente existem duas formas de utilizar o programa:
- A primeira e mais simples é compilando o código separadamente em um executável através do makefile, digitando no terminal:
make
O programa vem com um exemplo chamado A.poly onde é descrita a geometria e para realizar a triangulação basta digitar:
./triangle -p A
onde -p é um parâmetro opcional que indica o tipo de triangulação que será realizada e A é o arquivo contendo as informações da geometria. Ao executar o comando, as informações referentes aos nós da malha e aos elementos serão mostradas nos arquivos .node e .ele. Na página do programa consta um tutorial com todas as opções disponíveis.
- A segunda forma é quando deseja-se chamar o Triangle de outro programa, no nosso caso escrito em C++. O manual do Triangle consta informações de como proceder nesses casos, mas dada a linguagem arcaica C em que o código foi escrito, não foi possível integrar o Triangle ao nosso código de forma simples. Então, os seguintes passos foram feitos:
- Renomear o arquivo triangle.c para triangle.cpp;
- No makefile, alterar a variável CC para g++ e acrescentar à variável CSWITCHES o código -DANSI_DECLARATORS;
- Ainda no makefile, na parte das instruções de compilação, alterar os arquivos .c para .cpp;
- No arquivo triangle.h, acrescentar a linha de código “#define VOID int” antes da linha “#ifdef ANSI_DECLARATORS”;
- Incluir o header triangle.h no código externo onde o Triangle será utilizado;
- Ao compilar o código externo, acrescentar o arquivo triangle.o como uma dependência e utilizar a flag -DANSI_DECLARATORS após o comando g++.
Para gerar o arquivo triangle.o basta digitar:
make trilibrary
É normal que apareçam erros referentes ao arquivo tricall.c, esse arquivo é um exemplo de um script, também escrito em C arcaico, de como chamar o Triangle por meio de um código externo Para que esses erros não aconteçam, basta alterar o makefile e excluir o comando $(BIN)tricall da diretiva trilibrary e remover a instrução de compilação $(BIN)tricall.
No arquivo test.cpp é mostrado um simples exemplo de como chamar o Triangle de um código externo escrito em C++:
#ifdef SINGLE #define REAL float #else /* not SINGLE */ #define REAL double #endif /* not SINGLE */ #include <iostream> #include <stdlib.h> #include "triangle.h" int main() { struct triangulateio in, out; in.numberofpoints = 4; in.numberofpointattributes = 0; in.pointlist = (REAL *) malloc(in.numberofpoints * 2 * sizeof(REAL)); in.pointlist[0] = 0.0; in.pointlist[1] = 0.0; in.pointlist[2] = 1.0; in.pointlist[3] = 0.0; in.pointlist[4] = 1.0; in.pointlist[5] = 1.0; in.pointlist[6] = 0.0; in.pointlist[7] = 1.0; in.pointattributelist = (REAL *) NULL; in.pointmarkerlist = (int *) NULL; out.pointlist = (REAL *) NULL; out.pointattributelist = (REAL *) NULL; out.pointmarkerlist = (int *) NULL; out.trianglelist = (int *) NULL; char *param = (char *)"z"; triangulate(param, &in, &out, (struct triangulateio *) NULL); std::cout <<"Number of elements: " <<out.numberoftriangles <<std::endl; for (int i=0; i <out.numberoftriangles; i++) { std::cout <<"Nodes of element " <<i <<": " <<out.trianglelist[3*i] <<", " <<out.trianglelist[3*i+1] <<", " <<out.trianglelist[3*i+2] <<std::endl; } }
O código acima é compilado com o seguinte comando:
g++ -DANSI_DECLARATORS test.cpp triangle.o -o teste