Os autores Dmitry Anisimov, David Bommes, Kai Hormann, e Pierre Alliez
O pacote 2D Coordenadas Baricêntricas Generalizadas oferece uma implementação eficiente e robusta de coordenadas baricêntricas bidimensionais de forma fechada generalizada definidas para polígonos bidimensionais simples. Se forem necessárias coordenadas com respeito a pontos dispersos multivariados em vez de um polígono, por favor consulte as coordenadas naturais vizinhas do pacote 2D e Interpolação da Função de Superfície.
Em particular, o pacote inclui uma implementação de Wachspress, valor médio, e coordenadas harmónicas discretas e fornece algumas funções extra para calcular coordenadas baricêntricas com respeito a segmentos (coordenadas de segmento) e triângulos (coordenadas triangulares). A seção Teoria das Coordenadas Baricêntricas Generalizadas 2D dá uma breve introdução ao tópico de coordenadas baricêntricas.
Cada classe que computa coordenadas baricêntricas é parametrizada por uma classe de traços. Esta classe de traços especifica tipos e primitivas geométricas que são usadas no cálculo e deve ser um modelo do conceito BarycentricTraits_2
.
O principal ponto de entrada para o componente é um iterador de entrada sobre os vértices de um polígono. Os vértices do polígono devem seguir a ordem no sentido horário ou anti-horário e podem ser de qualquer tipo. Entretanto, internamente as classes usam o tipo CGAL::Point_2
, por isso uma classe de traços apropriada que converte o tipo do usuário para CGAL::Point_2
deve ser fornecida. O mesmo argumento vale para os pontos de consulta.
Coordenadas de valor do método são as coordenadas mais genéricas neste pacote porque permitem um polígono simples arbitrário como entrada. Wachspress e discretas coordenadas harmônicas são, por definição, limitadas a polígonos estritamente convexos. As coordenadas de segmento tomam como entrada qualquer segmento não degenerado, e as coordenadas triangulares permitem um triângulo não degenerado arbitrário.
As coordenadas de segmento e triângulo podem ser calculadas usando uma função global ou criando a classe correspondente. Todas as outras coordenadas generalizadas podem ser calculadas criando uma instância da classe CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2
parametrizada por um tipo de coordenada apropriado que deve ser um modelo do conceito BarycentricCoordinates_2
.
Any point in the plan pode ser tomado como um ponto de consulta. No entanto, não recomendamos a utilização de Wachspress e discretas coordenadas harmônicas com pontos de consulta fora do fechamento de um polígono porque em alguns desses pontos essas coordenadas não estão bem definidas, como explicado na seção Degeneracies e Casos Especiais.
Once instanciadas para algum polígono, as coordenadas podem ser computadas várias vezes para diferentes pontos de consulta com respeito a todos os vértices do polígono fornecido. Use o Manual de Referência para a interface detalhada.
A saída do cálculo é um conjunto de valores de coordenadas no ponto de consulta atual com respeito a todos os vértices do polígono. Esta saída pode ser armazenada em um recipiente arbitrário, fornecendo um iterador de saída apropriado. Além disso, todas as classes retornam um ponteiro para o último elemento armazenado e um status do cálculo (Boolean true ou false).
- Segment Coordinates
- Triangle Coordinates
- Wachspress Coordinates
- Coordenadas Harmônicas Discretas
- Coordenadas do valor médio
- Interpolação em altura para modelação de terreno
- Degenerações e casos especiais
- Coordenadas do segmento
- Coordenadas Triangulares
- Wachspress Coordinates
- Coordenadas Harmónicas Discretas
- Coordenadas do valor médio
- Performance
- Detalhes de Implementação
- Teoria das Coordenadas Baricêntricas Generalizadas 2D
- Agradecimentos
Segment Coordinates
Este é um exemplo simples para mostrar o uso da função global CGAL::Barycentric_coordinates::compute_segment_coordinates_2(). Nós calculamos coordenadas em três pontos verdes ao longo do segmento \(\) e em dois pontos azuis fora deste segmento mas ao longo da sua linha de suporte. Usamos o kernel exato e as coordenadas de retorno como um array de dois valores. Novamente, a simetria dos pontos de consulta nos ajuda a reconhecer erros que podem ter ocorrido durante o cálculo.
Arquivo_coordenadas_baricêntricas_2/Segmento_coordenadas_exemplo.cpp
Triangle Coordinates
Neste exemplo mostramos como usar a classe CGAL::Barycentric_coordinates::Triangle_coordinates_2
com o kernel Simple_cartesian
para tipo duplo. Calculamos as coordenadas para três conjuntos de pontos: interior (verde), limite (vermelho), e exterior (azul). Note que alguns dos valores das coordenadas para os pontos exteriores são negativos. Usamos um container padrão do tipo std::vector
e std::insert_iterator
para acessar e armazenar os valores das coordenadas resultantes.
Arquivo_coordenadas_baricêntricas_2/Triângulo_coordenadas_exemplo.cpp
Wachspress Coordinates
No exemplo seguinte criamos 1000 pontos aleatórios, depois tomamos o casco convexo deste conjunto de pontos como nosso polígono, e calculamos as coordenadas Wachspress em todos os pontos definidos. Usamos o kernel Simple_cartesian
com duplo tipo como uma classe de traços e armazenamos os valores das coordenadas obtidas em um container do tipo std::vector
. O iterador de saída é std::back_insert_iterator
.
File Barycentric_coordinates_2/Wachspress_coordinates_example.cpp
Coordenadas Harmônicas Discretas
Neste exemplo calculamos coordenadas harmônicas discretas para um conjunto de pontos verdes (interior), vermelhos (limite), e azuis (exterior) em relação a um quadrado unitário. Também mostramos como especificar a localização de um ponto de consulta usando parâmetros adicionais da função. O kernel utilizado é exato, e usamos um container de saída do tipo std::vector
. Como todos os pontos são simétricos, é fácil debugar a correção dos valores das coordenadas obtidas. O iterador de saída é std::back_insert_iterator
.
Arquivo_coordenadas_baricêntricas_2/Discretas_coordenadas_armónicas_exemplo.cpp
Coordenadas do valor médio
Este é um exemplo que mostra como calcular as coordenadas do valor médio para um conjunto de pontos verdes num polígono em forma de estrela. Observamos que este tipo de coordenadas é bem definido para um polígono tão côncavo enquanto que Wachspress e discretas coordenadas harmónicas não o são. No entanto, ele pode dar valores de coordenadas negativas para pontos fora do núcleo do polígono (mostrado em vermelho). Usamos um tipo de dado inexato, um container de saída do tipo std::vector
, e um iterador de saída do tipo std::back_insert_iterator para calcular, acessar, e armazenar os valores das coordenadas resultantes. Também mostramos como escolher diferentes algoritmos para calcular coordenadas baricêntricas generalizadas (uma é mais precisa enquanto a outra é mais rápida).
File Barycentric_coordinates_2/Mean_value_coordinates_example.cpp
Interpolação em altura para modelação de terreno
Este é um exemplo avançado que mostra como usar coordenadas baricêntricas generalizadas para interpolação em altura com aplicações para modelação de terreno. Ele também mostra como usar uma classe de traços não-definidos com nosso pacote ao invés de uma classe de traços Kernel
. Suponha que conhecemos o limite de um pedaço de terreno tridimensional que pode ser representado como um polígono com vários vértices tridimensionais, onde a terceira dimensão dá a altura correspondente. A tarefa é propagar a altura a partir dos pontos de amostra conhecidos no limite para o interior do polígono. Isto dá uma estimativa aproximada da superfície do terreno nesta região.
Neste exemplo projetamos um polígono tridimensional ortogonalmente no plano bidimensional usando a classe CGAL::Projection_traits_xy_3
, triangulamos seu interior usando a classe CGAL::Delaunay_mesher_2
, e calculamos as coordenadas do valor médio para todos os pontos obtidos em relação a todos os vértices do polígono. Finalmente, interpolamos os dados de altura do limite do polígono para o seu interior usando as coordenadas computadas e a função de interpolação global do pacote 2D e Interpolação da Função de Superfície.
File Barycentric_coordenates_2/Terrain_height_modeling.cpp
>
>
>
>
Como resultado obtemos uma função suave dentro do polígono que se aproxima da superfície do terreno subjacente.
Degenerações e casos especiais
Coordenadas do segmento
As coordenadas do segmento podem ser calculadas exatamente se um tipo exato de dado for escolhido. O segmento em si, com respeito ao qual calculamos as coordenadas, deve ser não degenerado. Se ambas as condições forem satisfeitas, então o cálculo nunca falha. No entanto, para calcular as coordenadas, o usuário deve ter certeza de que o ponto de consulta está exatamente na linha que suporta o segmento. Como em muitas aplicações este não é o caso, e um ponto de consulta pode estar muito próximo mas não exatamente nesta linha, a classe também é capaz de lidar com esta situação.
Suponha que algum ponto de interrogação (v) não esteja exatamente na linha (L), mas esteja a alguma distância como mostrado na figura acima. Se quisermos calcular a coordenada baricêntrica do segmento (b_1(v)) com respeito ao vértice (v_1), primeiro encontramos a projecção ortogonal do vector (p’p) sobre o vector (q) e depois normalizamo-la pelo comprimento do vértice (q). Isto dá a coordenada baricêntrica do segmento \(b_1(v’) = b_1(v)) se o segmento estiver exactamente na linha.
Aviso: não abuse da funcionalidade descrita acima porque não dá coordenadas baricêntricas correctas do segmento para o ponto mas sim para o ponto. Além disso, as coordenadas baricêntricas do segmento para um ponto (v), que não está exatamente sobre a linha (L), não existem. Mas se a distância não zero for devida a alguma instabilidade numérica no cálculo da localização do ponto ou qualquer outro problema, que faça com que o ponto não esteja exactamente na linha, as coordenadas finais do segmento serão, pelo menos aproximadamente, correctas.
Com tipos de dados inexactos, os valores das coordenadas resultantes são correctos até à precisão do tipo escolhido.
Coordenadas Triangulares
Estas coordenadas podem ser calculadas exactamente se for escolhido um tipo de dados exacto, para qualquer ponto de consulta no plano e em relação a qualquer triângulo não degenerado. Nenhum caso especial é tratado. O cálculo dá sempre o resultado correcto. A noção de exatidão depende da precisão do tipo de dado utilizado. Note que para pontos exteriores alguns valores de coordenadas serão negativos.
Wachspress Coordinates
Wachspress coordinates are welldefined in the closure of any strict convex polygon. Portanto, para qualquer ponto de consulta do fechamento do polígono com um tipo de dado exato, estas coordenadas são computadas exatamente e nenhum resultado falso é esperado. Para tipos de dados inexatos, a precisão resultante do cálculo é devido ao algoritmo envolvido e ao tipo de dados escolhido. No parágrafo seguinte discutimos dois algoritmos disponíveis para o cálculo das coordenadas Wachspress. Um deles é CGAL::Barycentric_coordinates::PRECISE
, o outro é CGAL::Barycentric_coordinates::FAST
.
Para calcular os pesos do Wachspress, seguimos e usamos a fórmula
with \(i = 1\pontos n\) onde \(n\) é o número dos vértices do polígono. Para calcular as coordenadas, normalizamos estes pesos,
Após a normalização como acima, isto nos dá o algoritmo preciso para computar as coordenadas Wachspress mas apenas com o desempenho {\n^2)}. O algoritmo rápido \i(O(n)^2)\i usa os pesos padrão. Note que matematicamente esta modificação não altera as coordenadas.
Sabe-se que para polígonos estritamente convexos o conjunto zero do denominador das coordenadas Wachspress ( \(W^{wp} = 0~\)) é uma curva, que (em muitos casos) fica bastante distante do polígono. Falando precisamente, ela interpola os pontos de intersecção das continuações das arestas do polígono. Portanto, o cálculo das coordenadas Wachspress fora do polígono só é possível em pontos que não pertencem a esta curva.
Aviso: não recomendamos a utilização das coordenadas Wachspress para pontos exteriores!
Coordenadas Harmónicas Discretas
As coordenadas harmónicas discretas têm os mesmos requisitos que as coordenadas Wachspress. Elas são bem definidas no fechamento de qualquer polígono estritamente convexo e, se um tipo de dado exato for escolhido, elas são computadas exatamente. Mas, ao contrário das funções básicas Wachspress, estas coordenadas não são necessariamente positivas. Em particular, o peso é positivo se e só se o peso for positivo se e só se o peso for <pi) (ver a figura abaixo para a notação). Para tipos de dados imprecisos, a precisão do cálculo deve-se ao algoritmo envolvido e ao tipo de dados escolhido. Mais uma vez, descrevemos dois algoritmos para calcular as coordenadas: um é preciso e outro rápido.
Para calcular os pesos harmónicos discretos, seguimos e usamos a fórmula
with \(i = 1\\i n=) onde { n=) é o número dos vértices do polígono. Para calcular as coordenadas, normalizamos estes pesos,
Após a normalização como acima, isto dá o algoritmo preciso para calcular coordenadas harmónicas discretas mas apenas com desempenho \(O(n^2)\). O algoritmo rápido \i(O(n)^2)\i usa os pesos padrão. Mais uma vez, matematicamente esta modificação não altera as coordenadas.
Aviso: tal como para as coordenadas Wachspress, não recomendamos a utilização de coordenadas harmónicas discretas para pontos exteriores porque a curva \(W^{dh} = 0\) pode ter vários componentes, e um deles interpola os vértices do polígono. No entanto, se tiver a certeza que o ponto de consulta não pertence a esta curva, pode calcular as coordenadas como mostrado neste exemplo.
Coordenadas do valor médio
Não como as coordenadas anteriores, as coordenadas do valor médio não podem ser calculadas exactamente devido a uma inevitável operação da raiz quadrada. Embora, se for utilizado um tipo de dado exato, a precisão padrão do cálculo depende apenas de duas funções CGAL: CGAL::to_double()
e CGAL::sqrt()
. Por outro lado, as coordenadas do valor médio são bem definidas em qualquer parte do plano para qualquer polígono simples. Além disso, se a sua classe de características fornece uma versão mais precisa da função raiz quadrada, a precisão final do cálculo com tipos de dados exatos dependerá apenas da precisão daquela função.
Para estas coordenadas também temos dois algoritmos: um é preciso e outro é rápido. O primeiro trabalha em todo o plano, e a precisão do cálculo depende apenas do tipo de dado escolhido, incluindo as observações acima. Este algoritmo é baseado na seguinte fórmula de peso de
Desde que o sinal é sempre positivo, temos de lhe anexar o sinal correcto do peso médio assinado, que pode ser encontrado de forma eficiente (ver as figuras abaixo). Basicamente, este peso é sempre positivo para a esquerda da curva linear de secção vermelha, e é negativo para a direita desta curva, deslocando-se no sentido contrário ao dos ponteiros do relógio.
|
|
Após a normalização destes pesos como antes
obtemos o algoritmo preciso \(O(n^2)}(O(n^2)}). O algoritmo rápido O(n) calcula os pesos \\(w_i}) usando o pseudo-código daqui. Estes pesos
também estão normalizados. Note que eles são instáveis se um ponto de consulta estiver mais próximo do que \(aprox. 1.0e-10) do limite do polígono, de forma semelhante ao Wachspress e coordenadas harmônicas discretas.
Performance
Parte do requisito mais importante em coordenadas baricêntricas para ser o mais preciso possível, é muito importante que eles sejam o mais rápido possível para avaliar. Estas coordenadas são utilizadas em muitas aplicações onde devem ser calculadas para milhões de pontos e, portanto, a utilização em tempo real das coordenadas é crucial. Ao escrever o código, tentamos cumprir este importante requisito, e nesta seção apresentamos alguns resultados sobre os tempos de cálculo das coordenadas implementadas.
A estrutura do teste de velocidade que executamos para todas as funções consiste em calcular valores de coordenadas (ou pesos) a >= 1 milhão de pontos estritamente interiores em relação a algum polígono (ou triângulo, ou segmento). A cada iteração do laço criamos um ponto de consulta, passamos para a função, e calculamos todas as coordenadas relacionadas. Executamos este loop 10 vezes seguidas, e o tempo apresentado no gráfico da escala log-log no final da seção é a média aritmética de todos os testes.
Um exemplo típico deste teste de desempenho para coordenadas triangulares com número reduzido de pontos de consulta pode ser encontrado abaixo. Este exemplo também ilustra como construir um iterador e passá-lo para a classe. Neste exemplo criamos um iterador que escreve valores de coordenadas para cada novo ponto de consulta sobre valores de coordenadas do ponto anterior no array C++ padrão de tamanho fixo, de modo que a memória seja alocada apenas uma vez.
File Barycentric_coordinates_2/Triangle_coordinates_speed_test.cpp
O tempo para calcular coordenadas depende de muitos factores como alocação de memória, kernel de entrada, contentor de saída, número de pontos, etc. Em nossos testes usamos as características mais padrão C++ e CGAL com alocação mínima de memória. Portanto, o tempo final apresentado é o tempo médio que pode ser esperado sem otimização profunda, mas ainda com alocação eficiente de memória. Isso também significa que pode variar dependendo do uso do pacote.
Para todos os testes usamos um MacBook Pro 2011 com processador Intel Core i7 de 2 GHz (2 núcleos) e memória DDR3 de 8 GB 1333 MHz. O sistema operacional instalado foi o OS X 10.9 Maverick. Para compilar o conjunto de testes de velocidade, usamos o compilador Clang 5.0 de 64 bits. Os tempos resultantes podem ser encontrados na figura abaixo.
Da figura acima é fácil ver que o algoritmo \(O(n^2)\) é tão rápido quanto o algoritmo \(O(n)\) se tivermos um polígono com um pequeno número de vértices. Mas como o número de vértices é aumentado, o algoritmo linear supera o quadrático, como esperado. Uma das razões para este comportamento é que para um pequeno número de vértices as multiplicações de elementos dentro do algoritmo O(n^2) com os algoritmos rápido (tracejado) e lento (sólido) levam quase o mesmo tempo que a divisão correspondente no algoritmo O(n^2). Para um polígono com muitos vértices esta multiplicação é muito mais lenta.
Detalhes de Implementação
O desenho genérico do pacote foi desenvolvido em 2013 por Dmitry Anisimov e David Bommes com muitos comentários úteis por Kai Hormann e Pierre Alliez. O pacote consiste de 6 classes, 2 enumerações e um namespace. Iteradores apropriados são usados para fornecer um acesso eficiente aos dados e para passá-los para um dos algoritmos genéricos para o cálculo de coordenadas. Uma vez instanciadas para um polígono (triângulo, segmento), as coordenadas podem ser calculadas várias vezes para diferentes pontos de consulta com respeito a todos os vértices do polígono fornecido (triângulo, segmento). Todas as classes são totalmente modeladas e têm um desenho simples e similar. Em particular, seguimos a mesma convenção de nomenclatura para todas as funções. No entanto, o número de funções pode diferir de uma classe para outra.
Os algoritmos implementados para calcular coordenadas não dependem de um kernel em particular, e todas as coordenadas podem ser computadas exatamente, se um kernel exato for usado, além das coordenadas de valor médio. As últimas coordenadas envolvem uma operação de raiz quadrada, o que resulta em uma precisão ligeiramente pior com tipos de dados exatos, devido à conversão temporal em um tipo de ponto flutuante. As coordenadas computadas podem ser armazenadas em um container arbitrário se um iterador de saída apropriado for fornecido.
Vale notar que a classe CGAL::Barycentric_coordinates::Segment_coordinates_2
é usada para computar coordenadas baricêntricas generalizadas ao longo do limite do polígono. Portanto, pode-se usar o truque para as coordenadas de segmento da Seção Degenerações e Casos Especiais se estiver convencido de que um ponto deve estar exatamente no limite do polígono mas devido a algumas instabilidades numéricas ele não está.
O pacote é implementado de forma que mais tarde, se necessário, outras coordenadas bidimensionais generalizadas baricêntricas podem ser facilmente adicionadas a este pacote.
Teoria das Coordenadas Baricêntricas Generalizadas 2D
Em 1827, o matemático e astrônomo teórico alemão August Ferdinand Möbius (1790-1868) propôs um método para encontrar coordenadas de um ponto no plano em relação aos vértices de um triângulo. Estas coordenadas são chamadas de coordenadas triangulares baricêntricas (às vezes coordenadas de área), e são amplamente utilizadas em uma variedade de aplicações. Algumas destas aplicações são interpolação linear sobre um triângulo e um teste de inclusão de triângulos. A primeira é usada para o chamado sombreamento, e a segunda surge no passo de rasterização quando uma imagem em formato gráfico vetorial precisa ser convertida em uma imagem rasterizada.
Triângulo baricêntrico de coordenadas tem muitas propriedades importantes, incluindo precisão constante e linear, a propriedade Lagrange, e positividade dentro de um triângulo. Estas propriedades fazem destas coordenadas uma ferramenta única em muitos campos científicos. Se restringirmos as coordenadas triangulares a uma das arestas de um triângulo e sua linha de suporte, obtemos coordenadas baricêntricas em relação a um segmento e as chamamos de coordenadas de segmento.
Vamos mostrar um par de gráficos para as coordenadas descritas acima. Para traçar coordenadas de segmentos, pegamos uma linha \(y = 0,4\) e definimos um segmento \(\) nesta linha. Em seguida, fazemos uma amostragem deste segmento e calculamos as coordenadas do segmento para todos os pontos da amostra. Se traçarmos a função de coordenadas do segmento em todos os pontos definidos em relação ao vértice (v_1), obtemos a linha azul representada na figura abaixo. Ela cresce de zero no vértice \(v_0\) para um no vértice \(v_1\).
Se quisermos traçar coordenadas triangulares, seguimos uma abordagem semelhante. Pegamos um triângulo \(\) no plano e amostramos seu interior e seu limite com um número de pontos. Uma vez que temos esta amostragem, plotamos uma das funções de coordenadas triangulares (aqui com respeito ao terceiro vértice do triângulo) em todos os pontos de amostra definidos. Da mesma forma, podemos traçar a função de coordenadas em relação ao primeiro ou segundo vértice. A função resultante é linear (mostrada na figura abaixo) que cresce de zero ao longo da primeira aresta \(v_2) para uma no vértice escolhido \(v_2).
Desde que muitas aplicações requerem trabalhar com formas geométricas planares mais complexas do que segmentos e triângulos, parece natural investigar uma versão generalizada de coordenadas triangulares com respeito a polígonos arbitrários. A primeira tentativa foi feita em 1975 por E. L. Wachspress , e as coordenadas baricêntricas generalizadas resultantes são agora chamadas de coordenadas Wachspress . Estas coordenadas são bem definidas para polígonos arbitrários estritamente convexos e têm todas as propriedades das coordenadas triangulares. Infelizmente, elas não são bem definidas para polígonos fracamente convexos e côncavos.
Analogamente aos casos anteriores, queremos plotar as coordenadas Wachspress e ver como elas se parecem. Vamos escolher um hexágono não regular, rodá-lo ligeiramente e mover um de seus vértices em direção à linha através de seus dois vizinhos adjacentes. Amostra-se o interior e o limite deste polígono como antes e traçamos a função de coordenadas em relação ao vértice que movemos em todos os pontos de amostra. Vemos que obtemos uma função suave, que é linear ao longo de todas as bordas e cresce de zero para um, como a barra de cor indica.
Um outro tipo de coordenadas baricêntricas generalizadas volta a Pinkall e Polthier em 1993 e Eck et al. em 1995 no contexto da parametrização da malha triangular. Elas são chamadas de coordenadas harmônicas discretas. Estas coordenadas são bem definidas, à semelhança das coordenadas Wachspress, para polígonos arbitrários estritamente convexos e herdam todas as propriedades das coordenadas triangulares, à excepção da positividade dentro de um polígono porque podem assumir valores negativos para alguns polígonos. Outra propriedade interessante destas funções de coordenadas é que elas coincidem com as coordenadas Wachspress para qualquer polígono cujos vértices se encontram num círculo comum.
Para traçar coordenadas harmónicas discretas tomamos o mesmo polígono que para as coordenadas Wachspress e traçamos a função de coordenadas em relação ao mesmo vértice. Mais uma vez, obtemos uma função suave, que é linear ao longo de todas as arestas e cresce de zero para um. Isolines no gráfico mostram a diferença entre as coordenadas harmônicas discretas e as coordenadas Wachspress para o polígono e vértice escolhidos.
O último tipo de coordenadas baricêntricas generalizadas que discutimos são coordenadas de valores médios propostos por M. Floater em 2003. Com base no teorema do valor médio, estas coordenadas, ao contrário do Wachspress e das coordenadas harmônicas discretas, são bem definidas para polígonos simples arbitrários, herdam todas as propriedades das coordenadas triangulares para qualquer polígono convexo, e carecem apenas da propriedade de positividade para polígonos côncavos gerais. Hormann e Floater provam que estas coordenadas são positivas dentro do núcleo de um polígono em forma de estrela. Elas também são positivas no fechamento de qualquer quadrilátero. Como pesos harmónicos discretos, os pesos médios são frequentemente usados no contexto da parametrização da malha triangular.
Para mostrar o comportamento particular das coordenadas de valores médios com uma aplicação a polígonos côncavos, tomamos um polígono em forma de estrela com dez vértices, amostramos o seu interior e limite, e traçamos a função de coordenadas em relação ao quarto vértice. Como a barra de cores indica, a função obtida cresce de um valor ligeiramente negativo para um no vértice escolhido. Ela também é lisa dentro do polígono e linear em todas as bordas.
Fato interessante: todas as coordenadas discutidas nesta seção e implementadas no pacote vêm de uma mesma família de coordenadas barycentric generalizadas nomeadas família de coordenadas de 3 pontos .