Cardoso Gabriel Schade - Microsoft Kinect: Crie aplicações interativas стр 20.

Шрифт
Фон

{

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.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке