Como devo criar um algoritmo para o baricentro de qualquer objeto System.Windows.Media.Geometry?

StackOverflow https://stackoverflow.com/questions/1324544

Pergunta

Estou pensando em ter que dividir o objeto Geometry em uma série de formas mais simples, e combinar suas centroids usando esta fórmula:

detalhes matemáticos desta fórmula pode ser encontrada no este artigo Wikipedia .

AVISO: Do not ser surpreendido se a minha visão da matemática está incorreto. Eu não fiz nenhuma matemática complexa passado trigonometria, e eu nunca teve de lidar com letras gregas. Eu acho que entendo este muito bem, mas por favor deixe-me saber se eu tenho errado.

Uma nota informativa : o baricentro de uma forma gometric ou prisma não é apenas o meio da forma. É o centro de gravidade, ou centro de massa. Presumo que objetos Geometry podem encapsular prismas 3D, bem, então eu posso ter que levar isso em conta no futuro, mas por agora estou focando apenas em 2D Geometrias. Para uma forma 2D você tem que imaginar que seja uma peça rígida de papel com uma determinada forma, e o baricentro seria o ponto em que este pedaço de papel seria equilibrar em uma agulha.

O primeiro problema que estou enfrentando é que eu preciso encontrar uma maneira de dividir com precisão qualquer dado objeto Geometry em formas simples o suficiente, de modo que esta fórmula pode funcionar corretamente. Alguém tem alguma idéia de como isso pode ser feito? Ou existe um procedimento melhor que continuará a funcionar universalmente?

O segundo problema que estou enfrentando é que, após a geometria é dividida, como faço para ir sobre encontrar o centróide de cada peça? Cada tipo de forma simples (triângulo, quadrilátero, semicírculo, etc) tem a sua própria fórmula centróide. Existe uma maneira para eu figura que tipo de forma cada peça é?

Foi útil?

Solução

Tesselation ou discretização de formatos arbitrários planares 2D é um problema comum na análise de elemento finito. É comumente feito com triângulos planares ou quadriláteros. Tente uma pesquisa no Google sobre " elemento finito 2d malha geração " ou quadtree ou octree geração de malhas. Você pode calcular o centróide de cada forma simples e aplicar a fórmula (correto) que você citou.

Algo como este . Ou estes . Você teria que fornecer a geometria cru para o organismo em questão, é claro.

Você tem uma longa fila para cavar ainda. Você vai ter que fazer todo o seguinte:

  1. Encontre um programa de auto engrenagem e aprender a entrada a geometria para a sua forma 2D.
  2. Execute o mesher auto e obter uma saída de malha que será composto por todos os 2D pontos no espaço e as conectividades de todo o triangular e elementos quadriláteros.
  3. Escreva um programa para ler na malha e calcular a área e centróide de cada elemento.
  4. Ligue esses valores na fórmula que você citou para calcular o baricentro da sua forma original 2D. Este meio de um loop sobre todos os elementos e acumulando as áreas de um dos produtos de a (x, y) as coordenadas de cada elemento centróide e a sua área.
  5. Uma vez que você tem uma resposta, você precisa verificar a convergência. Você pode fazer isso por refinação de sua malha, fazendo os elementos menores e recalcular. Você sabe que convergiram quando você refinar a malha e as respostas mudar pelo menos de uma pequena tolerância (5% ou o que você está disposto a tolerar).

É ainda uma boa quantidade de trabalho.

UPDATE: esta parece muito bom, e é open source .

Outras dicas

Eu não tenho qualquer código para isso, mas eu vi que a forma foi Tesselated (neste caso usando polígono triangulação ) para que você teria um bom conjunto de triângulos. Em seguida, calcular o centróide combinado com base na média ponderada do triângulos centróide.

EDIT:

Há um blog, os caras trabalhando em um produto chamado Insight3D por AGI. Neste entrada , eles falam sobre triangulação. Ele pode ajudá-lo a fazê-lo uma vez que eles dão mais algumas indicações sobre algoritmos. Dependendo do seu uso, você pode ser capaz de reutilização um de sua implementações . Ele é gratuito para desenvolvimento e uso não-comercial.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top