# CaRMetal

CaRMetal é um software de geometria dinâmica que herdou o mecanismo do software Régua e Compasso. O programa foi criado por Eric Hakenholz na linguagem de programação Java.
O CARMetal é um software livre, sob os termos da licença GNU GPL. Ele mantém uma quantidade das funcionalidades do R.e.C., mas utiliza uma interface gráfica diferente que permite eliminar algumas caixas de diálogo intermediárias e fornece acesso direto a numerosos efeitos. As construções são feitas através de uma paleta principal, que contém alguns atalhos de construção úteis, em adição às ferramentas padrão de régua e compasso. Tais ferramentas incluem a mediatriz, o círculo definido por três pontos e seções cônicas definidas por cinco pontos. Igualmente interessantes são as ferramentas de lugar geométrico, funções, curvas paramétricas e gráficos implícitos. A espessura do elemento, sua cor, sua etiqueta e outros atributos (incluindo a assim chamada propriedade magnética) podem ser configuradas através de um painel separado.
O CaRMetal também suporta uma paleta de construção configurável e possui capacidades de atribuição, as quais usam um recurso exclusivo chamado Macaco. O programa possui uma linguagem de script (atualmente, JavaScript com o motor Rhino, da Fundação Mozilla) que permite ao usuário construir figuras bastante complexas, tais como fractais.
O programa está traduzido para muitos idiomas, tais como Francês, Inglês, Espanhol, Alemão, Italiano, holandês, Português e Árabe.

## Interesse didático
### Antecipação

Quando alguém escolhe uma ferramenta como a paralela por uma reta através de um ponto, ou uma circunferência, o objeto desejado aparece em uma cor amarela e segue os movimentos do mouse. Isso permite fazer hipóteses antes mesmo de a construção estar terminada. Esta interação constante entre o aluno e o objeto de experimentação está de acordo com teorias modernas sobre didática e, neste ponto de vista, o CaRMetal é planejado para ser utilizado pelos alunos.

### Amodalidade

As janelas que mostram o histórico, a paleta de ferramentas e as propriedades do objeto selecionado estão em torno da figura e nunca acima dela. Essas janelas não são modais no sentido em que elas nunca escondem a construção. Por exemplo, sempre que o usuário quiser mudar a cor de um polígono, ele vê a nova cor imediatamente.

### Transformações

Quando uma transformação (por exemplo, uma macro) foi definida, de tal forma que ela transforma pontos em pontos, essa transformação também pode ser aplicada a curvas. Isso permite ao sujeito da aprendizagem visualizar as propriedades da transformação em um piscar de olhos, mesmo antes de a transformação ter sido aplicada.

### Atribuições

As pastas de trabalho (veja abaixo) podem ser exportadas como arquivos html com uma paleta de ferramentas restrita (por exemplo, deixar apenas as ferramentas de intersecção e de círculo permite ao aluno fazer construções apenas com o compasso). Para criar uma atribuição, o professor escolhe os objetos iniciais, os objetos a serem criados pelo aluno, e escreve um texto explicando a atividade. Em uma funcionalidade existente desde a versão do ano de 2010, quando o aluno terminou a construção e quer testá-la, as variações aleatórias são testadas (com uma ferramenta chamada Macaco) e uma nota de qualidade é atribuída ao aluno (atualmente, uma porcentagem das boas construções juntamente com as variações).

### Macros

As macros podem ser organizadas em uma hierarquia de pastas, o que torna fácil transformar o CaRMetal em uma ferramenta para explorar geometrias não euclidianas.

## Recursos especiais
### Pastas de trabalho

Desde a versão do ano de 2010, o CarMetal usa um sistema de pastas, chamada de "Pasta de trabalho", que permite ao usuário colocar muitas figuras em uma pasta. É fácil navegar entre as folhas de uma pasta de trabalho, duplicar uma folha (ou figura), fundir várias pastas em uma. O CaRMetal permite ao usuário incluir arquivos de imagens e de JavaScript em uma figura. A extensão de arquivo de uma figura é zir, assim como no C.a.R, indicando as múltiplas compatibilidades entre ambos os programas. A estrutura de arquivos é uma meta-descrição da figura na linguagem XML. No entanto, uma pasta de trabalho é salva como uma pasta compactada no formato ZIP contendo todas as figuras zir, mais as imagens incluidas (GIF, JPEG ou PNG) e um arquivo de preferências.

### Display numérico

É possível converter quaisquer medidas numéricas da figura em texto, para fins de exibição. Por exemplo, se um segmento chamado 's1' possui comprimento de 4,5 unidades, escrevendo-se
"O comprimento do segmento é %s1%"
cria uma cadeia de caracteres que é exibida como O comprimento do segmento é 4.5. Essa cadeia de caracteres pode ser incluída na figura mas também configurada como o pseudônimo de um objeto (por exemplo s1) ou o nome de uma expressão. Quando uma das extremidades do segmento é movida com o mouse, o texto é editado em tempo real. Isso é chamado um texto dinâmico.
O CaRMetal usa HotEqn e JLatexMath, que são interpretadores LaTeX, e é possível escrever fórmulas LaTeX no interior de objetos de texto. Por exemplo, se poly1 é um quadrado, e alguém deseja encontrar um círculo cuja área seja a mesma do quadrado, é possível construir uma expressão textual como esta:
"O raio do círculo seria $\sqrt{\frac{%poly1%}{\pi}}\simeq %sqrt(poly1/pi)%$"
Isso pode fornecer um texto como esse: ${\mbox{O raio do círculo seria }}{\sqrt {\frac {4}{\pi }}}\simeq 1.13$
A rubustez dessa ferramenta vem do fato de que é possível misturar textos dinâmicos com fórmulas LaTeX, obtendo LaTeX dinâmico (quando o tamanho do quadrado muda, o display muda também)!

### 2.5D

O CaRMetal permite ao usuário configurar algumas propriedades dos objetos, como sua cor ou o fato de eles serem visíveis ou não, como condicionais. Cada objeto pode ter um número de camada. Uma aplicação importante desses recursos é o modo 3D do CaRMetal, que surge com um tetraedro regular, um cubo, um diamante e um dodecaedro. Também é possível ligar um ponto ao interior de uma circunferência ou polígono. Este recurso, herdado do C.a.R., é baseado nas coordenadas do baricentro. É possível falar de 2.5D porque o CaRMetal não é exatamente um software 3D, mas é, também, mais do que um software 2D.

### Magnetismo

Um ponto pode ser tornado magnético com uma distância e uma lista de objetos pelos quais ele é atraído sempre que o ponto esteja suficientemente próximo de um ou de muitos desses objetos (suficientemente próximo significa que a distância entre eles é menor do que a distância mínima que é uma propriedade do ponto, e é medida em unidades de pixel);
Por exemplo: quando um ponto é atraído para um conjunto finito de pontos que estão fixos, ele pode explorar uma geometria finita.

### Rede

Desde a versão do ano de 2013 existe a possibilidade de se executar uma imagem do CaRMetal como servidor (tipicamente, a do professor) e muitas como clientes. Portanto, é possível:
* enviar uma figura para o servidor
* do servidor, enviar uma figura correta para um estudante que perdeu a sua, ou não pode criá-la no tempo exigido
* coletar dados, geométricos ou não, dentro de uma única figura (a do servidor)
* manipular a mesma figura ao mesmo tempo, para muitas pessoas que compartilham seus trabalhos
* enviar e receber programas JavaScript (veja abaixo)
* conversar sobre uma figura compartilhada...

## JavaScript dentro do CaRMetal

A ferramenta de script mistura algorítmos e geometria. Tais ferramenta de scripts também existem no DrGeo, no Kig e no Cinderela. Para executar um script, o usuário clica sobre um ícone representando um semáforo. Um script pode ser anexado a um ou a muitos pontos, de modo que qualquer movimento de um desses pontos executa o script. Isso permite tipos de Cinemática Inversa e GeoLicia.

### Variáveis

Para criar um objeto geométrico em JavaScript é suficiente clicar em um ícone que o represente. A instrução em JavaScript aparece no editor, que predefine os parâmetros. O usuário necessita apenas editá-los, sem precisar usar técnicas de memorização. Mas quando um objeto geométrico é criado, a variável que chama a rotina é realmente uma cadeia de caracteres contendo o nome do objeto.
Por exemplo,
cria um ponto, geralmente chamado de P1 e a variável a contém a cadeia de caracteres "P1". Isso possibilita referir-se ao ponto através do seu nome.
As coordenadas do ponto são inicializadas, mas ainda é possível mover o ponto com a utilização do mouse. Também é possível criar um ponto em programação procedural com:
Neste caso, o nome do ponto é "A" (a menos que já exista um objeto chamado "A"), e nenhuma variável é configurada para o nome "A".

### Entrada e saída

Existem quatro maneiras de exibir a saída de uma variável:
* Criar uma expressão dentro da figura (ou exibir com uma média gráfica, tal como um histograma);
* Print que abre uma nova janela e imprime o conteúdo da variável nela;
* Println que também vai para a linha;
* Alert que abre uma janela de alerta, que é fechada assim que o usuário pressionar OK.
Para entrar com uma variável:
* Input que abre uma janela de entrada (com um texto) e aguarda pelo clique no botão OK
* InteractiveInput que permite ao usuário escolher um objeto na figura
Este paradigma considera as variáveis do programa não necessariamente como variáveis numéricas ou textuais, mas também pode atuar em objetos gráficos. Este é um recurso comum com os softwares Kig (mas, neste caso, a linguagem é Python) e DrGeo (neste caso, com a linguagem Scheme).

### Strings

É possível configurar as coordenadas de um ponto como texto escrito na linguagem do CaRMetal. Por exemplo: para ter um ponto B que se segue de A, exceto se as coordenadas de B são inteiras (para modelar um inteiro de Gauss), o usuário pode escrever:

### Loops

Como um exemplo, o Triângulo de Sierpinski pode ser construído como um Sistemas de funções iterativas com um script recursivo, que é bastante curto devido às instruções gráficas já disponíveis, tais como MidPoint:
Após a nuvem de pontos ter sido construída (e inclusive enquanto o script permanece em execução!) o usuário pode mover A, B e C com o mouse (ou automaticamente com o Macaco): o triângulo é dinâmico!

### Objetos JavaScript

O CaRMetal também pode usar objetos JavaScript, tais como:
* matrizes, úteis para fazer estatísticas em figuras geométricas;
* O objeto date, útil para medir tempo;
* Objetos String e expressão regular, que tornam fácil implementar sistemas de Lindenmayer;
* Objetos JavaScript gerais podem ser utilizados para criar novos objetos geométricos, tais como números complexos, matrizes, entre outros. Esta programação orientada a objetos funciona como os scripts em Python do Kig, apesar de, até hoje, ninguém aparentemente publicou algo que os utilize.