Jump to content


Photo

Aprenda A Desenhar Com Dhtml


  • Faça o login para participar
10 replies to this topic

#1 Thales Medeiros

Thales Medeiros

    24 Horas

  • Usuários
  • 426 posts
  • Sexo:Não informado
  • Localidade:Juiz de Fora/MG
  • Interesses:Programação em geral. Programo em PHP, ASP, PERL, VB, Delphi, C/C++, Java e com banco d dados<br><br>Gosto tb d ajudar. Se precisar d mim, basta postar uma msg no Forum! Se eu souber, te responderei...

Posted 17/12/2004, 15:09

Olá, galera! Tudo bem?

Estava eu aqui no meu atual trabalho, com toda a minha parte feita, esperando os chefes me passarem mais trabalho (continuo assim), até que resolvi brincar um pouco. Como estou revoltado por aqui não ter nenhum compilador para linguagem nenhuma, excetuando o j2sdk que por algum motivo está com problemas na Virtual Machine, então o jeito foi brincar com DHTML.

Como adoro animações gráficas e meus recentes estudos têm sido em cima da área de desenvolvimento de jogos, e como qualquer biblioteca de animação gráfica tem sua base em funções que desenham na tela, resolvi começar uma biblioteca assim em DHTML.

Comecei a escrever uma simples classe que tem duas funções básicas que, com elas, dá para se fazer qualquer desenho: função que faz um ponto e uma função que faz uma reta. A partir da necessidade, criei outra função para escrever na tela, e outra para fazer uma linha tracejada, para brincar com os exemplos que eu fazia. Aqui eu vou mostrar um exemplo de relógio, que não vai usar a linha tracejada, mas eu deixei ela ainda assim no código. A classe é uma classe que eu chamei de graficos. Vamos a ela:

function graficos(janela) {
	this.wnd=janela;
	this.htm="";

	this.texto=function(txt,x,y,fonte,cor) {this.htm+='<div style="position:absolute;left:'+x+';top:'+y+';overflow:hidden;font:'+fonte+';color:'+cor+'">'+txt+'</div>'}

	this.ponto=function(x,y,w,h,cor) {this.htm+='<div style="position:absolute;left:'+x+';top:'+y+';width:'+w+';height:'+h+';overflow:hidden;background-color:'+cor+'"></div>'}

	this.reta=function(x1,y1,x2,y2,cor) {
  var dx=x2-x1, dy=y2-y1;
  if(Math.abs(dx)>Math.abs(dy)) for(var i=x1,j=y1;i<=x2;i++,j+=dy/dx) this.ponto(i,j,1,1,cor);
  else for(var i=x1,j=y1;j<=y2;j++,i+=dx/dy) this.ponto(i,j,1,1,cor);
  if(Math.abs(dx)>Math.abs(dy)) for(var i=x1,j=y1;i>=x2;i--,j+=dy/dx*-1) this.ponto(i,j,1,1,cor);
  else for(var i=x1,j=y1;j>=y2;j--,i+=dx/dy*-1) this.ponto(i,j,1,1,cor);
	}

	this.clear=function() {this.htm=''}

	this.draw=function() {this.wnd.innerHTML=this.htm}
}

Esta é a classe. Minha idéia inicial não era fazer com que vocês entendessem todo o funcionamento desta classe. Para isto eu teria que ficar aqui escrevendo por duas horas sobre geometria analítica pra explicar a função que desenha uma reta. É óbvio que se vocês quiserem aprender a fazer uma reta, terei o maior prazer em explicá-los, mas não será o objetivo deste tópico. Qualquer coisa, abram outro ou perguntem aqui.

Vamos aos detalhes da classe. Ela possui duas variáveis de propriedade: wnd e htm. A primeira propriedade é onde guardamos uma referência para o objeto dentro da página onde iremos desenhar dentro dele. No meu exemplo, usarei um <div> com borda. Mas como eu já expliquei num tópico anterior, qualquer container poderia fazer este papel (tabela, span, iframe, etc). A segunda propriedade, htm, é o código HTML que fará todo o desenho. Se chamarmos o método clear() desta classe, limpamos a variável htm. E se chamarmos o método draw() desta classe, fazemos com que o código HTML dentro do container seja a variável htm.

Para fins de fácil explicação, chamarei nosso alvo de desenho de JANELA (a propriedade wnd da classe). Portanto, se quisermos desenhar um ponto de 1 pixel de largura por um pixel de altura na nossa JANELA, basta chamar o método com a posição X e Y do ponto dentro da JANELA, a largura e a altura 1 e a cor desejada. O que o método ponto() faz? Simplesmente acrescenta à propriedade htm um DIV de dimensões WxH (largura x altura, que no meu exemplo de ponto será 1x1) sem nada dentro desse DIV, e a cor de fundo deste DIV é a cor escolhida. Para que isto funcione como desejado, existem alguns detalhes a serem seguidos: no Internet Explorer, o DIV não aparece na tela se não colocar a propriedade OVERFLOW como HIDDEN. Para quem não conhece, OVERFLOW é se vai ou não ter barra de rolagem. Como nosso DIV será muito pequeno e como a função de um DIV é guardar conteúdo, por padrão esse pequeno DIV entraria com uma barra de rolagem invisível para nós, mas que simplesmente não deixa a cor de fundo aparecer.

O método texto() desta classe é um método simples, que também adiciona um DIV com o texto específico.

Um detalhe desta classe é que só dá para fazer o desenho realmente aparecer na JANELA quando chamarmos o método DRAW. Isto é para fins de eficiência de processamento. Para se desenhar uma reta, por exemplo, sucessivos pontos são feitos na JANELA. Se toda vez que um ponto fosse adicionado eu enviaria o código HTML para a JANELA, muito processamento seria consumido. Então ao desenhar um ponto (chamar o método ponto()), eu simplesmente adiciono o código à variável htm. Só no final do desenho é que eu chamo o método draw().

Vamos exemplificar um uso desta classe:

<html><head><title>Exemplo de desenho</title>
<script language=JavaScript>
function graficos(janela) {
	this.wnd=janela;
	this.htm="";

	this.texto=function(txt,x,y,fonte,cor) {this.htm+='<div style="position:absolute;left:'+x+';top:'+y+';overflow:hidden;font:'+fonte+';color:'+cor+'">'+txt+'</div>'}

	this.ponto=function(x,y,w,h,cor) {this.htm+='<div style="position:absolute;left:'+x+';top:'+y+';width:'+w+';height:'+h+';overflow:hidden;background-color:'+cor+'"></div>'}

	this.reta=function(x1,y1,x2,y2,cor) {
  var dx=x2-x1, dy=y2-y1;
  if(Math.abs(dx)>Math.abs(dy)) for(var i=x1,j=y1;i<=x2;i++,j+=dy/dx) this.ponto(i,j,1,1,cor);
  else for(var i=x1,j=y1;j<=y2;j++,i+=dx/dy) this.ponto(i,j,1,1,cor);
  if(Math.abs(dx)>Math.abs(dy)) for(var i=x1,j=y1;i>=x2;i--,j+=dy/dx*-1) this.ponto(i,j,1,1,cor);
  else for(var i=x1,j=y1;j>=y2;j--,i+=dx/dy*-1) this.ponto(i,j,1,1,cor);
	}

	this.clear=function() {this.htm=''}

	this.draw=function() {this.wnd.innerHTML=this.htm}
}

function desenha(onde) {
var g=new graficos(onde);
g.ponto(10,10,1,1,'black');
g.draw();
}
</script></head>
<body onLoad=desenha(this.alvo)>
<div id=alvo style="position:relative;border:1 solid black;width:500;height:400"></div>
</body></html>

Emocionante, né? Fizemos um ponto! Hehehehe... Era só pra mostrar como se faz uso desta classe. Agora vamos a um exemplo um pouco melhorzinho. Vou desenhar um relógio analógico que é atualizado de segundo em segundo.

<html><head><title>Teste</title>
<script language=JavaScript>
function graf(janela) {
	this.wnd=janela;
	this.htm="";
	this.texto=function(txt,x,y,fonte,cor) {this.htm+='<div style="position:absolute;left:'+x+';top:'+y+';overflow:hidden;font:'+fonte+';color:'+cor+'">'+txt+'</div>'}
	this.ponto=function(x,y,w,h,cor) {this.htm+='<div style="position:absolute;left:'+x+';top:'+y+';width:'+w+';height:'+h+';overflow:hidden;background-color:'+cor+'"></div>'}
	this.reta=function(x1,y1,x2,y2,cor) {
  var dx=x2-x1, dy=y2-y1;
  if(Math.abs(dx)>Math.abs(dy)) for(var i=x1,j=y1;i<=x2;i++,j+=dy/dx) this.ponto(i,j,1,1,cor);
  else for(var i=x1,j=y1;j<=y2;j++,i+=dx/dy) this.ponto(i,j,1,1,cor);
  if(Math.abs(dx)>Math.abs(dy)) for(var i=x1,j=y1;i>=x2;i--,j+=dy/dx*-1) this.ponto(i,j,1,1,cor);
  else for(var i=x1,j=y1;j>=y2;j--,i+=dx/dy*-1) this.ponto(i,j,1,1,cor);
	}
	this.clear=function() {this.htm=''}
	this.draw=function() {this.wnd.innerHTML=this.htm}
}


var g;
function roda(x) {g=new graf(x);clock()}
function clock() {
	var t=new Date();
	var s=t.getSeconds();
	var m=t.getMinutes();
	var h=t.getHours();

	g.clear();
	for(var i=0,j=1;i<2*Math.PI;i+=Math.PI/6,j++)
  g.texto(j,187-50*Math.cos(i+(4/6)*Math.PI),169-50*Math.sin(i+(4/6)*Math.PI),'11 arial','black');
	for(var i=0;i<2*Math.PI;i+=0.01)
  g.ponto(190+60*Math.cos(i),175-60*Math.sin(i),1,1,'black');
	g.reta(190,175,190-40*Math.cos(Math.PI/30*s+Math.PI/2),175-40*Math.sin(Math.PI/30*s+Math.PI/2),'red');
	g.reta(190,175,190-35*Math.cos(Math.PI/30*m+Math.PI/2),175-35*Math.sin(Math.PI/30*m+Math.PI/2),'black');
	g.reta(190,175,190-25*Math.cos(Math.PI/6*h+Math.PI/2),175-40*Math.sin(Math.PI/6*h+Math.PI/2),'black');
	g.texto(h+':'+m+':'+s,10,10,'black');
	g.draw();
	setTimeout("clock()", 1000);
}
</script></head>
<body onLoad=roda(this.quadro)>
<div id=quadro style="border:1 solid black;width:400;height:350;position:relative"></div>
</body></html>

Vale dizer que este exemplo envolve MUITO processamento por segundo. Aqui nesta máquina que eu estou no trabalho, que é um P4 2.66Ghz, roda numa boa. Mas se em sua máquina ficar lento ou travando o navegador, retire só a parte que cria a circunferência em torno do relógio. Basta arrancar estas linhas:

for(var i=0;i<2*Math.PI;i+=0.01)
g.ponto(190+60*Math.cos(i),175-60*Math.sin(i),1,1,'black');

Isto retira 728 instruções de processamento por segundo. Pouca coisa, né?

Estou editando agora, e resolvi aprimorar um pouco o processamento e o visual do meu relógio. Dêem uma olhada:

<html><head><title>Teste</title>
<script language=JavaScript>
function graf(janela) {
	this.wnd=janela;
	this.htm="";
	this.texto=function(txt,x,y,fonte,cor) {this.htm+='<div style="position:absolute;left:'+x+';top:'+y+';overflow:hidden;font:'+fonte+';color:'+cor+'">'+txt+'</div>'}
	this.ponto=function(x,y,w,h,cor) {this.htm+='<div style="position:absolute;left:'+x+';top:'+y+';width:'+w+';height:'+h+';overflow:hidden;background-color:'+cor+'"></div>'}
	this.reta=function(x1,y1,x2,y2,cor) {
  var dx=x2-x1, dy=y2-y1;
  if(Math.abs(dx)>Math.abs(dy)) for(var i=x1,j=y1;i<=x2;i++,j+=dy/dx) this.ponto(i,j,1,1,cor);
  else for(var i=x1,j=y1;j<=y2;j++,i+=dx/dy) this.ponto(i,j,1,1,cor);
  if(Math.abs(dx)>Math.abs(dy)) for(var i=x1,j=y1;i>=x2;i--,j+=dy/dx*-1) this.ponto(i,j,1,1,cor);
  else for(var i=x1,j=y1;j>=y2;j--,i+=dx/dy*-1) this.ponto(i,j,1,1,cor);
	}
	this.clear=function() {this.htm=''}
	this.draw=function() {this.wnd.innerHTML=this.htm}
}

var g;
function roda(x) {g=new graf(x);clock()}
function clock() {
	var t=new Date();
	var s=t.getSeconds();
	var m=t.getMinutes();
	var h=t.getHours();

	g.clear();
	for(var i=0,j=1;i<2*Math.PI;i+=Math.PI/6,j++) {
  g.texto(j,187-50*Math.cos(i+(4/6)*Math.PI),169-50*Math.sin(i+(4/6)*Math.PI),'11 arial','black');
	}
	for(var i=0,j=0;i<2*Math.PI;i+=Math.PI/30,j++) {
  var l=(j%5==0)?2:1;
  g.ponto(190+60*Math.cos(i),175-60*Math.sin(i),l,l,'black');
	}
	g.reta(190,175,190-40*Math.cos(Math.PI/30*s+Math.PI/2),175-40*Math.sin(Math.PI/30*s+Math.PI/2),'red');
	g.reta(190,175,190-35*Math.cos(Math.PI/30*m+Math.PI/2),175-35*Math.sin(Math.PI/30*m+Math.PI/2),'black');
	g.reta(190,175,190-25*Math.cos(Math.PI/6*h+Math.PI/2),175-40*Math.sin(Math.PI/6*h+Math.PI/2),'black');
	g.texto(h+':'+m+':'+s,10,10,'black');
	g.draw();
	setTimeout("clock()", 1000);
}
</script></head>
<body onLoad=roda(this.quadro)>
<div id=quadro style="border:1 solid black;width:400;height:350;position:relative"></div>
</body></html>

Espero que tenham gostado!

Aqui é o início da criação de um jogo em DHTML. A ferramenta básica nós já temos. Como já falei anteriormente, dá para se fazer quase qualquer coisa com DHTML, excetuando rotação de objetos, que é um recurso que nos impossibilita de fazer muitas coisas. Claro que ainda existem outros contras, mas meu intuito aqui é estimulá-los a aprender esta magnífica ferramenta para que você possam praticamente dominar assuntos relacionados à web.

Qualquer dúvida, perguntem!

Um abraço,
Thales Medeiros.

Edição feita por: Thales Medeiros, 17/12/2004, 16:25.

Sucesso é ganhar dinheiro fazendo o que você faria de graça.

#2 Alex Hiroshi

Alex Hiroshi

    Super Veterano

  • Ex-Admins
  • 4923 posts
  • Sexo:Masculino
  • Localidade:São Paulo - SP

Posted 18/12/2004, 00:39

Bem legal vc estar ajudando o pessoal aqui..
mais tarde vou dar uma olhadinha mais detalhadamente nesse seu script...

so vou mover o topico para Tutoriais e artigos aqui dessa seção ok?


curti o ultimo reloginho :P
Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Ex-Administrador

#3 Without a Nick

Without a Nick

    Sem culpa no cartório

  • Usuários
  • 2378 posts
  • Sexo:Não informado
  • Localidade:Guarulhos

Posted 18/12/2004, 13:20

Eu entendi bem esse script depois de reler minhas lições de trigonometria... =P

Parabéns, muito legal mesmo.

#4 Thales Medeiros

Thales Medeiros

    24 Horas

  • Usuários
  • 426 posts
  • Sexo:Não informado
  • Localidade:Juiz de Fora/MG
  • Interesses:Programação em geral. Programo em PHP, ASP, PERL, VB, Delphi, C/C++, Java e com banco d dados&lt;br&gt;&lt;br&gt;Gosto tb d ajudar. Se precisar d mim, basta postar uma msg no Forum! Se eu souber, te responderei...

Posted 20/12/2004, 12:53

Caraca! Descobri pq não foi tão interessante... : )

Em primeiro lugar, valeu pelo elogio! Em segundo lugar, concordo que este é o forum mais adequado de se colocar meu POST. Valeu, Alex!

Com relação ao motivo de este post não ter sido tão interessante é o fato de envolver um assunto um pouco complexo... Trigonometria! Meu intuito era de fazer as pessoas se interessarem um pouco mais pela linguagem JavaScript, e parece que eu acabei complicando as coisas, né? Vou ver se faço algo mais simples... Vou pensar em um joguinho fácil que seja controlado pelo teclado que não use trigonometria. Se quiserem palpitar, ajudem! Pode ser uma imagem que anda por um caminho com a opção de pular, subir escadas, ou pode ser um carrinho de corrida. Nos dois eu posso colocar uma imagem de fundo e outra imagem que é o personagem a se mover de acordo com o controle do teclado. O homenzinho que pula pode ser interessante pelo fato de eu poder usar mais de uma imagem fazendo um movimento do personagem, mas é um pouco sem graça. Já o carro de corrida vai ser um pouco mais complicado pois eu terei que usar variáveis de velocidade. Isto pode não ser tão simples para os leitores... Vou pensando enquanto isto. Sugestões são bem-vindas!

Um abraço,
Thales Medeiros.
Sucesso é ganhar dinheiro fazendo o que você faria de graça.

#5 Without a Nick

Without a Nick

    Sem culpa no cartório

  • Usuários
  • 2378 posts
  • Sexo:Não informado
  • Localidade:Guarulhos

Posted 26/12/2004, 16:31

trigonometria td bem... é só saber seno, cosseno, tangente, arco-tangente, entre outras fórmulas...

Com o teclado fica + fácil...

mas blz...

#6 _Renan_

_Renan_

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Não informado

Posted 27/12/2004, 23:42

Realmente muito incrivel o que conseguiu fazer... eu achei bem legal, que tou querendo fazer o meu próprio relógio...
Para tal tenho que começar do começo né, eu fiz uma função que faz um ponto , e outra que faz a reta usando a anterior. Só que deu MUITO calculo mesmo!!!!!!! Demora para caramba para gerar uma simples retinha! Imagina se fosse para atualizar de segundo em segundo né... Se você tiver alguma dica de como eu posso melhorar aqui meu script, avisa aê...

Falows

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv="Content-Language" content="pt-br">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

<title>Nova pagina 1</title>
</head>

<body onload="">
<div id="papel_em_branco">

</div>
<div align="center"  id=quadro style="border:1 solid black;width:982px;height:348px;position:relative">
	&nbsp;<p>&nbsp;</p>
	<p>&nbsp;</p>
	<p>&nbsp;</p>
	<p></div>
<script>

desenho = "";

function desenha_ponto(px,py,cor)
{
	desenho += "\n<span style=\"position : absolute; top="+py+"; left="+px+"\"><font color=\""+cor+"\">.</font></span>";
	document.getElementById("papel_em_branco").innerHTML = desenho;

}

function desenha_reta(p1x,p1y,p2x,p2y,cor)
{
	
	if ( (p2x - p1x) >= (p2y - p1y) )
	{
	
  for (x=p1x; x<=p2x; x += 1.5)
  {
 	 var y = (   ( (p1y-p2y)/(p1x-p2x) )*x + ( (p2x*p1y-p2y*p1x)/(p2x-p1x) )    );
 	 desenha_ponto(x,y,cor);
 	 
  }
	
	}
	else 
	{
  for (x=p1x; x<=p2x; x += 0.2)
  {
 	 var y = (   ( (p1y-p2y)/(p1x-p2x) )*x + ( (p2x*p1y-p2y*p1x)/(p2x-p1x) )    );
 	 desenha_ponto(x,y,cor);
 	 
  }

	}
	
}

</script>

<p><a href="javascript:desenha_reta(105,100,125,264,'blue')">Desenha Reta 1</a></p>
<p><a href="javascript:desenha_reta(90,200,350,60,'red')">Desenha Reta 2</a></p>
<p>Desenha Reta 3</p>
<p>Desenha Reta 4</p>
<p>Desenha Reta 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</p>

</body>

</html>

Edição feita por: _Renan_, 28/12/2004, 11:41.


#7 Thales Medeiros

Thales Medeiros

    24 Horas

  • Usuários
  • 426 posts
  • Sexo:Não informado
  • Localidade:Juiz de Fora/MG
  • Interesses:Programação em geral. Programo em PHP, ASP, PERL, VB, Delphi, C/C++, Java e com banco d dados&lt;br&gt;&lt;br&gt;Gosto tb d ajudar. Se precisar d mim, basta postar uma msg no Forum! Se eu souber, te responderei...

Posted 28/12/2004, 15:08

Oi, Renan! Blz?

Olha... Como eu expliquei lá em cima, se toda vez que desenharmos um ponto a gente passar isto para o container, vai demorar demais o processamento! O navegador trabalha bem rápido com armazenamento de dados em variável. Mas pra ele transferir os dados de uma variável para um container que vai aparecer na tela não é tão rápido assim. Por isso que na função de desenho a gente só manda armazenar os dados numa variável. No final de todo o desenho é que a gente manda o valor dela para o <span> que você criou. Entendeu? Eu fiz uma pequena mudança no seu código pra vc perceber a diferença de performance. Ao invés de usar

document.getElementById("papel_em_branco").innerHTML = desenho;

toda vez que um ponto for criado, nós vamos chamar isto só no final do desenho da reta, ok? Aí vai o código. Teste-o e me diga se ficou mais rápido...

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv="Content-Language" content="pt-br">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

<title>Nova pagina 1</title>
</head>

<body onload="">
<div id="papel_em_branco">

</div>
<div align="center"  id=quadro style="border:1 solid black;width:982px;height:348px;position:relative">
&nbsp;<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p></div>
<script>

desenho = "";

function desenha_ponto(px,py,cor)
{
desenho += "\n<span style=\"position : absolute; top="+py+"; left="+px+"\"><font color=\""+cor+"\">.</font></span>";
}

function desenha_reta(p1x,p1y,p2x,p2y,cor)
{

if ( (p2x - p1x) >= (p2y - p1y) )
{

 for (x=p1x; x<=p2x; x += 1.5)
 {
  var y = (   ( (p1y-p2y)/(p1x-p2x) )*x + ( (p2x*p1y-p2y*p1x)/(p2x-p1x) )    );
  desenha_ponto(x,y,cor);
  
 }

}
else 
{
 for (x=p1x; x<=p2x; x += 0.2)
 {
  var y = (   ( (p1y-p2y)/(p1x-p2x) )*x + ( (p2x*p1y-p2y*p1x)/(p2x-p1x) )    );
  desenha_ponto(x,y,cor);
  
 }
}
document.getElementById("papel_em_branco").innerHTML = desenho;
}

</script>

<p><a href="javascript:desenha_reta(105,100,125,264,'blue')">Desenha Reta 1</a></p>
<p><a href="javascript:desenha_reta(90,200,350,60,'red')">Desenha Reta 2</a></p>
<p>Desenha Reta 3</p>
<p>Desenha Reta 4</p>
<p>Desenha Reta 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</p>

</body>

</html>

Um abraço,
Thales Medeiros.
Sucesso é ganhar dinheiro fazendo o que você faria de graça.

#8 _Renan_

_Renan_

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Não informado

Posted 28/12/2004, 21:38

Nossa, agora sim... está criando retas instantaneamente, eu subestimei esse pequeno detalhe , obrigado pela dica! Eu vou fazer um relógio igual ao seu, você vai ver.

Falows

#9 _Renan_

_Renan_

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Não informado

Posted 18/01/2005, 19:30

Olá denovo Thales, beleza?

Bem como eu havia prometido no meu ultimo post... eu terminei meu relógio em javascript :D :D !!! Eu parti da idéia de que uma reta e um circulo são pontos alinhados que seguem suas respectivas específicas funções, assim eu fiz funções que servem para criar retas, criar circulos e inclinar retas dado um ângulo, com isso eu começei a pensar em fazer o relógio, que nada mais é do que retas que mudam seus ângulos em determinados periodos. A forma que eu fiz parece ser mais "primitiva" do que a sua pelo fato do código ter ficado um tanto que ... ENORME, hauehaeueaeheuaeeaheaae. Mas eu consegui, em anexo a essa mensagem está o arquivo .js das funções.


E abaixo segue o código de uma page que usa esse .js...

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Nova pagina 1</title>
</head>

<body>
<a href="javascript:;" onclick="javascript:ativar_relogio(460,140,'black',60)">Acionar Relógio</a>

<p>
<a href="javascript:;" onclick="javascript:chama()">Desenhar Cubo</a>

<script src="funcao_classe_relogio.js"></script>


<script>
function chama()
{

desenha_reta(400,200,520,200,'gray',3,'marcas');
inclina_reta(520,200,60,Math.PI/4,'gray',3,'marcas');
desenha_reta(562.4264068711928,157.57359312880715,562.4264068711928,37.57359312880715,'gray',3,'marcas');
desenha_reta(520,200,520,80,'gray',3,'marcas');
inclina_reta(520,80,60,Math.PI/4,'gray',3,'marcas');
desenha_reta(442.42640687119285,157.57359312880715,562.4264068711928,157.57359312880715,'gray',3,'marcas');
desenha_reta(400,200,400,80,'gray',3,'marcas');
desenha_reta(400,80,520,80,'gray',3,'marcas');
inclina_reta(400,80,60,Math.PI/4,'gray',3,'marcas');
desenha_reta(442.42640687119285,37.573593128807154,562.42640687119285,37.573593128807154,'gray',3,'marcas');
inclina_reta(400,200,60,Math.PI/4,'gray',3,'marcas');
desenha_reta(442.42640687119285,157.57359312880715,442.42640687119285,37.57359312880715,'gray',3,'marcas');

}
</script>

</p>
</body>
</html>

Esse relógio funciona no IE e no Netscape pois eu testei aqui, a única diferença é que no Netscape o ponteiro do segundo fica mais "lerdo" , acho que o NN é meio lerdo pra imprimir containers na tela...

Falows

Attached Files


Edição feita por: _Renan_, 25/01/2005, 22:13.


#10 _Renan_

_Renan_

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Não informado

Posted 03/02/2005, 18:43

Alguem testou o meu relógio em outros browseres para ver se ele funciona??

Falows

#11 marcosgeo

marcosgeo

    Novato no fórum

  • Usuários
  • 4 posts
  • Sexo:Não informado

Posted 08/04/2007, 22:56

Olá pessoal beleza!?

Estou colocando este tópico em debate novamente depois de mais de dois anos sem nenhuma mensagem!

É o seguinte: eu usei as duas funções criadas pelo Renan para desenhar linhas na tela, no entanto existe um problema. Quando as linhas são traçadas da direita para esquerda, ou seja X2 > X1, a função não as desenha, porque?

Muito obrigado.
Marcos




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq