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|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
#include
#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: " <
O código acima é compilado com o seguinte comando:
g++ -DANSI_DECLARATORS test.cpp triangle.o -o teste