{
Line objetoOsso = new Line();
objetoOsso.StrokeThickness = larguraDesenho;
objetoOsso.Stroke = corDesenho;
72
Casa do Código
Capítulo 6. Fluxo de Esqueleto do Usuário
objetoOsso.X1 = origemX;
objetoOsso.X2 = destinoX;
objetoOsso.Y1 = origemY;
objetoOsso.Y2 = destinoY;
return objetoOsso;
}
Agora temos que criar o método DesenharOsso, ele utilizará duas articulações
para criar um osso entre elas e inseri-lo no Canvas. A lógica deste método é bastante similar ao método DesenharArticulacao, pois teremos que converter as coordenadas 3D das duas articulações para um plano 2D utilizando o CoordinateMapper
e usaremos o método descrito anteriormente para criar o objeto Line que será adicionado ao Canvas. O resultado deve ser similar ao código a seguir.
public void DesenharOsso
(Joint articulacaoOrigem,
Joint articulacaoDestino,
Canvas canvasParaDesenhar)
{
int larguraDesenho = 4;
Brush corDesenho = Brushes.Green;
ColorImagePoint posicaoArticulacaoOrigem =
ConverterCoordenadasArticulacao(
articulacaoOrigem,
canvasParaDesenhar.ActualWidth,
canvasParaDesenhar.ActualHeight);
ColorImagePoint posicaoArticulacaoDestino =
ConverterCoordenadasArticulacao(
articulacaoDestino,
canvasParaDesenhar.ActualWidth,
canvasParaDesenhar.ActualHeight);
Line objetoOsso =
CriarComponenteVisualOsso(larguraDesenho, corDesenho,
posicaoArticulacaoOrigem.X, posicaoArticulacaoOrigem.Y,
posicaoArticulacaoDestino.X, posicaoArticulacaoDestino.Y);
73
6.2. Desenhando o Esqueleto do Usuário
Casa do Código
if (Math.Max(objetoOsso.X1, objetoOsso.X2) <
canvasParaDesenhar.ActualWidth &&
Math.Min(objetoOsso.X1, objetoOsso.X2) > 0 &&
Math.Max(objetoOsso.Y1, objetoOsso.Y2) <
canvasParaDesenhar.ActualHeight &&
Math.Min(objetoOsso.Y1, objetoOsso.Y2) > 0)
canvasParaDesenhar.Children.Add(objetoOsso);
}
Agora sim, temos todos os métodos preparados. O próximo passo é criar
uma nova classe no namespace Auxiliar chamada Extensao. Ela irá utilizar
os métodos que preparamos acima para criar um método de extensão na classe
SkeletonFrame para desenhar o esqueleto do usuário em um Canvas de forma
coerente.
Métodos de Extensão
Na linguagem C# é possível criar métodos de extensão. Estes méto-
dos são um tipo especial de métodos estáticos que permitem ao desen-
volvedor adicionar funcionalidades em um tipo existente sem que você
crie um tipo derivado, recompile ou modifique o código original. Este é
um recurso poderoso e bastante utilizado nesta linguagem, não cabe ao
escopo deste livro definir todas as possibilidades.
Para mais informações visite o link: http://msdn.microsoft.com/
en-us/library/vstudio/bb383977.aspx
Para que a classe
Extensao possa criar métodos de extensão para ou-
tros tipos é necessário que ela seja declarada como estática para isso,
utilize a palavra reservada
static.
Nesta classe iremos declarar o mé-
todo estático
DesenharEsqueletoUsuario para servir de extensão para a
classe SkeletonFrame. Este método deve receber via parâmetros o sensor (
KinectSensor) que ele utilizará para mapear o esqueleto e o canvas ( Canvas)
em que o esqueleto deve ser desenhado, além, é claro, do próprio objeto de extensão.
Para declarar o objeto que será estendido você deve incluí-lo como primeiro pa-
râmetro antecedido pela palavra reservada this. Desta forma, este método será um método de extensão de uma instância da classe SkeletonFrame. Para garantir que
74
Casa do Código
Capítulo 6. Fluxo de Esqueleto do Usuário
não haverá parâmetros inválidos, é necessário fazer uma validação nos parâmetros informados no método.
Caso todas as validações sejam cumpridas, iremos utilizar a lógica defi-
nida para obter o esqueleto do usuário no teste anterior e utilizar nossa classe EsqueletoUsuarioAuxiliar para primeiramente desenhar todas as articula-
ções sem os ossos, seu método deve ficar similar ao código seguinte.
public static void DesenharEsqueletoUsuario
( this SkeletonFrame quadro,
KinectSensor kinectSensor,
Canvas canvasParaDesenhar )
{
if (kinectSensor == null)
throw new ArgumentNullException("kinectSensor");
if (canvasParaDesenhar == null)
throw new ArgumentNullException("canvasParaDesenhar");
Skeleton[] esqueletos =
new Skeleton[quadro.SkeletonArrayLength];
quadro.CopySkeletonDataTo(esqueletos);
IEnumerable<Skeleton> esqueletosRastreados =
esqueletos.Where( esqueleto =>
esqueleto.TrackingState ==
SkeletonTrackingState.Tracked);
if (esqueletosRastreados.Count() > 0)
{
Skeleton esqueleto =
esqueletosRastreados.First();
EsqueletoUsuarioAuxiliar esqueletoUsuarioAuxiliar =
new EsqueletoUsuarioAuxiliar(kinectSensor);
foreach (Joint articulacao in esqueleto.Joints)
esqueletoUsuarioAuxiliar
.DesenharArticulacao(articulacao, canvasParaDesenhar);
}
75
6.2. Desenhando o Esqueleto do Usuário
Casa do Código
Este método ficou bastante similar ao que já havíamos criado em nossa janela,
mas além de passarmos a lógica para um método de extensão, podemos melhorar
separando a lógica em partes. Obter o esqueleto do primeiro usuário é uma tarefa comum e bastante utilizada, então criaremos mais um método de extensão, que, dessa vez, retornará o esqueleto do primeiro usuário do sensor. Para fazer isso, basta utilizarmos a lógica já feita no método descrito anteriormente.