Jump to content


Photo

Desenhando Pontos E Linhas Com Javascript Puro (sem Canvas)


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

#1 Micox

Micox

    Turista

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

Posted 07/02/2008, 08:55

Fonte: http://elmicox.blogs...linhas-com.html

Bem, infelizmente javascript não tem muitas capacidades de gerar gráficos, linhas, pontos, círculos, etc a não ser com CANVAS (infelizmente não bem suportado por todos os navegadores) ou por POG.

Fazer usando o canvas não teria graça hehe, então fui pro que eu gosto: a velha gambiarra.

Bom, gerar o ponto é fácil:

<style>
.ponto {  background-color: #0000FF; position: absolute; overflow: hidden;}
</style>
<script>
//global que guarda a largura da linha. Quanto maior, mais rápido o processamento.
window['larguraPonto']=2;
function geraPonto(x, y, nome, elempai) {
	//by Micox - www.elmicox.com - 31/01/08
	var pixel = document.createElement('div');
	pixel.id = nome;
	pixel.className = 'ponto';
	pixel.style.width = pixel.style.height = window['larguraPonto'] + 'px'
	pixel.style.left = x + 'px';
	pixel.style.top = y + 'px';
	return elempai.appendChild(pixel);
}
//chamando a função e gerando uma reta vertical
window.onload = function(){
 geraPonto(10,4,'ponto1',document.body)
 geraPonto(10,6,'ponto2',document.body)
 geraPonto(10,8,'ponto3',document.body)
 geraPonto(10,10,'ponto4',document.body)
 geraPonto(10,12,'ponto4',document.body)
 geraPonto(10,14,'ponto4',document.body)
 }
</script>

Perceba que eu coloquei algumas características do ponto via CSS e a definição da largura do ponto em uma variável global. Quanto MENOR for o valor da largura do ponto, logicamente irá demorar mais a plotagem do ponto.

Agora pra gerar uma linha inteira terei que usar meus exímios e velhos conhecimentos de matemática geométrica aprendidos no ensino médio hauehea (Vê se eu lembro disso. Lógico que colei do David Betz e dei umas adaptadas).

function geraLinha(x1, y1, x2, y2, nome, elempai) {
	//by Micox - www.elmicox.com - 31/01/08 - adaptado de http://www.davidbetz.net/graphics/
	var longPixel = document.createElement('div');
	if(elempai.constructor==String){ elempai = document.getElementById(elempai);}

	if(typeof(window['MicoxLinhas'])=='undefined'){
		window['MicoxLinhas'] = Array(); //este cidadão global irá guardar todas as linhas
	}
	window['MicoxLinhas'][nome] = Array()

	var steep = Math.abs(y2 - y1) > Math.abs(x2 - x1);
	if (steep) {
		var t = y1;
		y1 = x1; x1 = t;
		t = y2; y2 = x2;
		x2 = t;	}

	var deltaX = Math.abs(x2 - x1);
	var deltaY = Math.abs(y2 - y1);
	var error = 0;
	var deltaErr = deltaY;
	var xStep, yStep, modulo;
	var x = x1, y = y1;

	if (x1 < x2) {
		xStep = window['larguraPonto'];
		modulo = +1;
	}else {
		xStep = -window['larguraPonto'];
		modulo = -1;
	}

	if(y1 < y2) { yStep = window['larguraPonto']; }
	else { yStep = -window['larguraPonto']; }

	var nomeP = nome + x + '-' + y;

	if(steep) { window['MicoxLinhas'][nome][x] = geraPonto(y, x, nomeP, elempai);	}
	else { window['MicoxLinhas'][nome][x] = geraPonto(x, y, nomeP, elempai);	}

	var fim = modulo * x2;

	while( modulo * x < fim) {
		x = x + xStep;
		error = error + deltaErr;
		if(2 * error >= deltaX) {
			y = y + yStep;
			error = error - deltaX;
		}
		nomeP = nome + x + '-' + y;
		if(steep) { window['MicoxLinhas'][nome][x] = geraPonto(y, x, nomeP, elempai);	}
		else { window['MicoxLinhas'][nome][x] = geraPonto(x, y, nomeP, elempai);	}
	}
	return window['MicoxLinhas'][nome];
}

//brincando de desenhar
window.onload = function(){
 geraLinha(20,120,30,100,'minhaLinha1',document.body)
 geraLinha(30,100,60,100,'minhaLinha2',document.body)
 geraLinha(60,100,90,80,'minhaLinha3',document.body)
 geraLinha(90,80,130,80,'minhaLinha4',document.body)
 geraLinha(130,80,160,100,'minhaLinha5',document.body)
 geraLinha(160,100,210,105,'minhaLinha6',document.body)
 geraLinha(210,105,220,120,'minhaLinha7',document.body)
 geraLinha(220,120,20,120,'minhaLinha8',document.body)
 //agora só faltam as rodas haehaheuhaeu
}

Pronto, agora só falta fazer funções pra elipses e curvas hauheuhae. Não tô afim de brincar disso hoje não. Algum dia eu ou alguém faz uma função pra isso.

Percebam, senhores, que coloquei a opção de nomes nas linhas e pontos e coloquei elas dentro de um pai qualquer. Pra quê? Ué, pra poder apagar e mover as ditas cujas.

As funções de apagar:
function removePonto(nomeOuRef){
	//recebe o ID do ponto ou a referencia ao objeto HTML
	if(nomeOuRef.constructor==String){	nomeOuRef = document.getElementById(nome);	}
	nomeOuRef.parentNode.removeChild(nomeOuRef)
	try { delete nomeOuRef; } catch(e) { nomeOuRef = null }
}
function removeLinha(nomeOuRef){
	//recebe o ID da reta ou a referencia ao objeto array
	if(nomeOuRef.constructor==String){ nomeOuRef = window[nomeOuRef]; }
	for(var i in nomeOuRef){
		removePonto(nomeOuRef[i])
		try { delete nomeOuRef[i]; } catch(e) { nomeOuRef[i] = null }
	}
	try { delete nomeOuRef; } catch(e) { nomeOuRef = null }
}

As funções de mover nem precisava colocar aqui pois é aquele básico esquema de mover Divs:

function move(quem){
 //by Micox - www.elmicox.com - 30/01/08
 if(quem.constructor==String){ quem = document.getElementById(quem); }
 //movendo
 window['move'+quem.id] = setInterval( function(){
   quem.style.left = (quem.offsetLeft + 5) + 'px'
  }, 50);
}
function para(quem){
 //by Micox - www.elmicox.com - 30/01/08
 if(quem.constructor==String){ quem = document.getElementById(quem); }
 if(typeof(window['move'+quem.id])=='number'){
  clearInterval(window['move'+quem.id])
 }
}

Agora veja um exemplo completo e meu opalão se movimentando aqui.

- “xxxxxx mico, que mané você heim? Não é mais fácil abrir um programa de imagens qualquer e desenhar diboas?”

- Sim meu caro cidadão, porém, digamos que você queira fazer um fluxograma em javascript (aqui você vê o fluxograma finalizado).
E aí? Nunca se sabe quando vamos precisar de algo, como diria George Boole.

Té a próxima, malucada.
El Micox - elmicox.blogspot.com - concursosevagas.blogspot.com

#2 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 07/02/2008, 12:50

Interessante ... trabalho de presidiário eu diria... ^^

O exemplo do fluxograma ficou bem legal, visto que ao movimentar os elementos é atualizado instantâneamente. Mas para gráficos, como o de barras no exemplo que você se baseou, acredito que uma linguagem server-side tenha capacidade para um resultado melhor.

Parabéns.
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#3 Alex Hiroshi

Alex Hiroshi

    Super Veterano

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

Posted 08/02/2008, 10:18

É bem legal isso. Não tenho paciência para pensar e fazer essas coisas. =P
O Thales, ex-moderador, também postou uma vez como fazer desenhos.
http://forum.wmonlin...howtopic=100579
Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Ex-Administrador

#4 Micox

Micox

    Turista

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

Posted 11/03/2008, 16:26

É. Realmente foi um trabalho chato. Só pra excessões mesmo tipo a do fluxograma. Pro resto tudo existem soluções melhores com outras ferramentas.

#5 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 01/10/2017, 20:41

Kamagra Dr Simi Cialis Generic Overnight Shipping Comprar Cialis Malaga viagra online pharmacy Buy Lotrisone How to buy isotretinoin tablets without perscription online
Leukopenia Caused By Antibiotic Amoxicillin levitra billig Comprar Levitra Sin Receta Viagra Sin Receta Valencia Amoxicillin 875 Sinus Infection
Propecia Sperm Count Ejaculate buy viagra Buy Tadalafil Citrate Liquid
Zithromax Effects On Birth Control cialis and levitra Levitra Prix Pharmacie Le Cialis Prise

#6 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 15385 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 02/10/2017, 17:59

Propecia Low Sperm Count Medication Cheap Effexor cialis Table And Chair Rentals Temple Texas
Breast Milk Keflex Allergy Compra Viagra Por Internet Forum Viagra Donne viagra Hiconcil Buy Online Tablet Viagra Canada Prednisolone For Dogs
Order Generic Valtrex Online No Prescription viagra online Priligy Precio 2012 Cephalexin Low Cost
Procalis Levitra cialis Mono In Infants After Taking Amoxicillin Generic Acticin Internet Shop Shipped Ups
Metrogel buy viagra Vente Kamagra Oral Jelly

#7 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 11/10/2017, 20:23

Dosing Keflex Oral Suspension cost of levitra 20mg Discount Isotretinoin Where To Buy Viagra Prix Pharmacie Paris En Dijon Cialis Fabriquant
Acquistare Cialis Generico viagra Buy Viagra Online With No Prescription Todo Sobre Viagra
Precio De Cialis En Andorra Viagra E Cialis Buy Kamagra In Uk generic levitra for sale Cialis Daily Rezeptfrei Buy Flagyl In Pomona Rosa Impex Pvt Ltd Viagra

#8 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 15385 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 12/10/2017, 09:50

Cialis 5 Mg Dosis What All Is Valcylavore Perscribed For cialis Preis Viagra Sildenafil Fluoxetine Visa Accepted

#9 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 13/10/2017, 15:56

Propecia Without A Rx Generico Priligy (Dapoxetine) Vente Viagra Montreal buy viagra Hydrochlorothiazide Medicine Overseas Plymouth

#10 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 15385 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 14/10/2017, 13:41

Propecia Y Finasteride Cialis Costo A Quand Le Generique Di Cialis non prescription levitra Levitra Bayer Online Prix Viagra 100 Mg Par 8
Cialis Tadalafil Pas Cher viagra Indomethacin Comprar Online Siti Sicuri Per Acquistare Cialis Generico Amoxicillin Ld50
Estrogen Pills Propecia Elezioni generic viagra Registro De Propecia

#11 Miguceamma

Miguceamma

    MiguPenjisse

  • Usuários
  • 13201 posts

Posted 14/10/2017, 23:51

Tadalafil Online Sicuro Le Viagra Fatigue cialis price Buying Viagra In The Caribbean Cialis Meilleur Site Amoxicillin Ld50

#12 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 15/10/2017, 11:39

Ranbaxy Taladafil Accutane Without A Perscription buy viagra Anuncios De Kamagra
Efectos Viagra Espana viagra Levaquin Vs Amoxicillin Buy Real Viagra Online Acquistare Gel Kamagra Grenoble
Get Generic Free Shipping Amoxicilina 250mg Medicine Tablet Vasotec Pyridium Urinary Pain Delivered On Saturday viagra online prescription Kamagra Achat France Cytotec Online Uk

#13 Miguceamma

Miguceamma

    MiguPenjisse

  • Usuários
  • 13201 posts

Posted 15/10/2017, 18:33

Acquistare Caen Kamagra Cialis Sur Ebay Vente Viagra Lyon viagra online Viagra Kaufen Ohne Zoll Levitra Controindicazioni Acquisto
Buy Clonidine Online Overnight Delivery Orlistat Canada Acheter Dapoxetine Usa viagra online pharmacy Clobetasol 0.05% In Internet Cialis Nebenwirkungen Durchfall
Amoxicillin Out Of Date Stendra 50mg Erectile Dysfunction Whats Does Keflex Do viagra Comprar Cialis Andorra Precio Viagra Canada 50 Mg Pharmacy
Prednisone Canada buy viagra Levitra 10 Mg Caratteristiche Kamagra Gelatina 100mg Amoxicillin For Cats Without A Prescription
Propecia Farmacopea How Do You Take Zithromax cialis Amoxicillin Libido No Precription Synthroid 125mcg Daily Priligy Approved Countries
Cialis Viagra Sans Ordonnance Buy En Language Levitra viagra Abuse Propecia And Rogaine
Cephalexin Adverse Reactions Kamagra Portugal Sildenafil Pas Cher 150 Mg viagra Farmacia Levitra Generico Amoxicillin What Is If For

#14 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 20/10/2017, 21:28

Doxycycline 100mg Tablets In Canada How Can I Get Samples Of Metformin Clomid Et Bb viagra Sexual Dysfunction Keflex Pregnancy

#15 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 23/10/2017, 03:33

Purchase Effexor Xr Online Vente Generique Cialis Professional Tab Elocon 0.1% cheap cialis Doxycycline Where To Purchase
Achat Amoxicillin Pilule Pharmacie Patch Et viagra Cialis Generique Effet Secondaire Revatio 20mg Buy Online
Precio Propecia Espana viagra Amoxicillin Cats Allergic Reaction Vomit Do I Need Prescription For Cialis
Generic Doryx 100mg Bacterial Infections Direct Free Consultation Can I Buy Nexium In Canada viagra online prescription How Much Is Zithromax Skin Rash Amoxicillin Sun Exposure Cialis Mode D'Emploi
Propecia Achat En Ligne Kaufen Viagra 100mg Online Propecia Buy generic cialis How To Use Propecia Levitra Professionnel
Levitra Erektionsdauer cialis Propecia Klachten
Buy Xenical Online For Canada viagra Cheapest Cialis India where can i buy isotretinoin skin health low price mastercard Viagra Wirkung Animation
Cialis Brand Name Buy Online viagra Vidal Tamoxifene




0 user(s) are reading this topic

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

IPB Skin By Virteq