Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Linien zeichnen

Diskussion: Linien zeichnen im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hallo, Ich habe ein Script geschrieben, indem man mittels zweier Klicks eine Linie zwischen den beiden angeklickten Stellen zeichnen ...

Antwort
Alt 16.02.08, 23:10   #1 (permalink)
 
Registriert seit: 17.10.06
:::Lük::: Leistung: Facit NTK
:::Lük::: eine Nachricht über ICQ schicken
Likes: 0
Standard Linien zeichnen

Anzeige

Hallo,
Ich habe ein Script geschrieben, indem man mittels zweier Klicks eine Linie zwischen den beiden angeklickten Stellen zeichnen kann.
Das Ganze funktioniert auch schon ganz gut nur liegen die Endpunkte nicht genau auf den angeklickten Stellen. Außerdem denke ich, dass das Script durchaus noch zu verbessern ist. Habt ihr da ein paar Vorschläge?

JS   

Code:
<script type="text/javascript">
clicks = 0;
var a, b = new Array();
document.onclick = function(e) {
	clicks++;
	
	if (clicks == 1) {
		a = new Array(e.pageX, e.pageY);
	} else if (clicks == 2) {
		b = new Array(e.pageX, e.pageY);
		
		line(a, b);
		
		clicks = 0;
	}
}

function line(point1, point2) {
	if (point1[0] == point2[0] && point1[1] == point2[1]) { alert("Ungültige Koordinaten"); return; }
	
	bot = point2;
	top = point1;
	
	//höchsten bzw. am weitesten links liegenden punkt als top bestimmen
	if (point1[1] > point2[1]) {
		top = point2;
		bot = point1;
	} else if (point1[1] == point2[1]) {
		if (point1[0] < point2[0]) {
			top = point2;
			bot = point1;
		}
	}
	
	//richtung des bot punktes im verhältniss zu top
	direction = "R";
	if (top[0] > bot[0]) {
		direction = "L";
	} else if (top[0] == bot[0]) {
		direction = "V";
	}
	
	// zeichenbereich ermitteln
	parent = document.createElement("div");
	
	drawArea = new Array();
	drawArea[1] = bot[1] - top[1];
	if (direction == "L") {
		drawArea[0] = top[0] - bot[0];
		
		parent.style.marginLeft = bot[0];
	} else if (direction == "R") {
		drawArea[0] = bot[0] - top[0];
		
		parent.style.marginLeft = top[0];
	} else {
		drawArea[0] = 1;
	}

	parent.style.marginTop = top[1];
	parent.style.width = drawArea[0];
	parent.style.height = drawArea[1];
	parent.style.position = "absolute";
	document.getElementById("table").appendChild(parent);
	
	//pixelachse ermittlen
	if (drawArea[1] >= drawArea[0]) {
		pxPerLayer = drawArea[1] / drawArea[0];
		
		top = 0;
		if (direction == "R") {
			for (i = 0; i <= drawArea[0]; i++) {
				el = document.createElement("div");
				el.style.marginLeft = i;
				el.style.marginTop = top;
				el.style.backgroundColor = "red";
				el.style.width = "1px";
				el.style.height = pxPerLayer + "px";
				el.style.position = "absolute";
				parent.appendChild(el);
				
				top += pxPerLayer;
			}
		} else if (direction = "L") {
			for (i = drawArea[0]; i >= 0; i--) {
				el = document.createElement("div");
				el.style.marginLeft = i;
				el.style.marginTop = top;
				el.style.backgroundColor = "red";
				el.style.width = "1px";
				el.style.height = pxPerLayer + "px";
				el.style.position = "absolute";
				parent.appendChild(el);
				
				top += pxPerLayer;
			}
		}
	} else if (drawArea[1] < drawArea[0]) {
		pxPerLayer = drawArea[0] / drawArea[1];
		
		left = 0;
		if (direction == "R") {
			for (i = 0; i <= drawArea[1]; i++) {
				el = document.createElement("div");
				el.style.marginLeft = left;
				el.style.marginTop = i;
				el.style.backgroundColor = "red";
				el.style.width = pxPerLayer + "px";
				el.style.height = "1px";
				el.style.position = "absolute";
				parent.appendChild(el);
				
				left += pxPerLayer;
			}
		} else if (direction = "L") {
			for (i = drawArea[1]; i >= 0; i--) {
				el = document.createElement("div");
				el.style.marginLeft = left;
				el.style.marginTop = i;
				el.style.backgroundColor = "red";
				el.style.width = pxPerLayer + "px";
				el.style.height = "1px";
				el.style.position = "absolute";
				parent.appendChild(el);
				
				left += pxPerLayer;
			}
		}
	}
}
</script>
<div id="table"></div>

Ach ja: Bitte keine fertigen Scripte aus externen Quellen, ich würde gerne wissen wo mein Denkfehler liegt. ;)

MfG Lük
:::Lük::: ist offline   Mit Zitat antworten
Alt 17.02.08, 00:29   #2 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Arrow

Grundsätzlich: Warum operierst du mit marginLeft und marginTop, und nicht direkt mit left und top? Außerdem solltest du konsequent "px" an die Maßangaben anhängen, sonst funktioniert's nicht überall.

Wenn das bedacht ist, und auch die Default-Margins und -Paddings des HTML-Bodys, die die Browser definieren, ausgeschaltet sind, hauen die Linien bei mir schon meistens hin. Problematisch wird's nur dann, wenn man in einer Koordinate nur wenig Abweichung hat, beispielsweise fast auf gleicher Höhe 2 Punkte in größerem Abstand definiert... dann wird die Linie nämlich länger als sie soll (genau 1 "Element" länger). Ich tippe mal, das kommt durch Rundungsprobleme. Linien, die genau senkrecht oder waagerecht verlaufen, kann ich auch nicht malen, dieser Fall wird bei dir noch nicht berücksichtigt.
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 17.02.08, 01:29   #3 (permalink)
Themenstarter
 
Registriert seit: 17.10.06
:::Lük::: Leistung: Facit NTK
:::Lük::: eine Nachricht über ICQ schicken
Likes: 0
Standard

Zitat:
Grundsätzlich: Warum operierst du mit marginLeft und marginTop, und nicht direkt mit left und top?
Keine Ahnung ist geändert.

Zitat:
Außerdem solltest du konsequent "px" an die Maßangaben anhängen, sonst funktioniert's nicht überall.
Auch getan.

Zitat:
Wenn das bedacht ist, und auch die Default-Margins und -Paddings des HTML-Bodys, die die Browser definieren, ausgeschaltet sind, hauen die Linien bei mir schon meistens hin.
Das lässt sich doch mit <body marginheight="0" marginwidth="0"> abschalten, oder?

Zitat:
Problematisch wird's nur dann, wenn man in einer Koordinate nur wenig Abweichung hat, beispielsweise fast auf gleicher Höhe 2 Punkte in größerem Abstand definiert... dann wird die Linie nämlich länger als sie soll (genau 1 "Element" länger). Ich tippe mal, das kommt durch Rundungsprobleme.
Ursache war nicht die Rundung, sondern ein = in der for-Schleife, hier reicht ein einfaches < bzw. >.

Zitat:
Linien, die genau senkrecht oder waagerecht verlaufen, kann ich auch nicht malen, dieser Fall wird bei dir noch nicht berücksichtigt.
Ist jetzt möglich.

Vielen Dank schonmal! Mittlerweile läuft das Script ganz ordentlich. Hier mal die aktuelle Version:

fixed   

Code:
<script type="text/javascript">
clicks = 0;
var a, b = new Array();
document.onclick = function(e) {
	clicks++;
	
	if (clicks == 1) {
		a = new Array(e.pageX, e.pageY);
	} else if (clicks == 2) {
		b = new Array(e.pageX, e.pageY);
		
		line(a, b);
		
		clicks = 0;
	}
}

function line(point1, point2) {
	if (point1[0] == point2[0] && point1[1] == point2[1]) { alert("Ungültige Koordinaten"); return; }
	
	bot = point2;
	top = point1;
	
	//höchsten bzw. am weitesten links liegenden punkt als top bestimmen
	if (point1[1] > point2[1]) {
		top = point2;
		bot = point1;
	} else if (point1[1] == point2[1]) {
		if (point1[0] < point2[0]) {
			top = point2;
			bot = point1;
		}
	}
	
	//richtung des bot punktes im verhältniss zu top
	direction = "R";
	if (top[0] >= bot[0]) {
		direction = "L";
	}
	
	// zeichenbereich ermitteln
	parent = document.createElement("div");
	
	drawArea = new Array();
	drawArea[1] = (bot[1] - top[1]) + 1;
	if (direction == "L") {
		drawArea[0] = (top[0] - bot[0]) + 1;
		
		parent.style.left = bot[0] + "px";
	} else if (direction == "R") {
		drawArea[0] = (bot[0] - top[0]) + 1;
		
		parent.style.left = top[0] + "px";
	}

	parent.style.top = top[1] + "px";
	parent.style.width = drawArea[0] + "px";
	parent.style.height = drawArea[1] + "px";
	parent.style.position = "absolute";
	document.getElementById("table").appendChild(parent);
	
	//pixelachse ermittlen
	if (drawArea[1] >= drawArea[0]) {
		pxPerLayer = drawArea[1] / drawArea[0];
		
		top = 0;
		if (direction == "R") {
			for (i = 0; i < drawArea[0]; i++) {
				div(i, top, pxPerLayer, 1, "red");
				top += pxPerLayer;
			}
		} else if (direction = "L") {
			for (i = drawArea[0]; i > 0; i--) {
				div(i, top, pxPerLayer, 1, "red");
				top += pxPerLayer;
			}
		}
	} else if (drawArea[1] < drawArea[0]) {
		pxPerLayer = drawArea[0] / drawArea[1];
		
		left = 0;
		if (direction == "R") {
			for (i = 0; i < drawArea[1]; i++) {
				div(left, i, 1, pxPerLayer, "red");
				left += pxPerLayer;
			}
		} else if (direction = "L") {
			for (i = drawArea[1]; i > 0; i--) {
				div(left, i, 1, pxPerLayer, "red");
				left += pxPerLayer;
			}
		}
	}
	
	function div(left, top, height, width, color) {
		el = document.createElement("div");
		el.style.left = left + "px";
		el.style.top = top + "px";
		el.style.backgroundColor = color;
		el.style.width = width + "px";
		el.style.height = height + "px";
		el.style.position = "absolute";
		parent.appendChild(el);
	}
}
</script>
<body marginheight="0" marginwidth="0">
<div id="table"></div>
</body>


Jetzt kommt mir aber eine weitere Frage auf: Ist es Möglich die Länge einer diagonalen Linie in px-Einheit zu messen?
:::Lük::: ist offline   Mit Zitat antworten
Alt 17.02.08, 01:58   #4 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Arrow

Die Margins und Paddings würde ich ja lieber mittels CSS abschalten, marginheight und marginwidth sind nicht ganz state-of-the-art

Zitat:
Original von :::Lük:::
Jetzt kommt mir aber eine weitere Frage auf: Ist es Möglich die Länge einer diagonalen Linie in px-Einheit zu messen?
Das konnte schon Meister Pythagoras vor zweieinhalbtausend Jahren
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
Alt 18.02.08, 02:23   #5 (permalink)
 
Registriert seit: 17.02.06
Harry Boeck Leistung: Facit NTK
Likes: 0
Standard

Ähmmm... "State of the Art" im Zusammenhang mit Liniendarstellung, indem man Pixel als Divs erzeugt und mit deren Aneinanderreihung Linien darstellt? Na ja...

Ansonsten (die Prämisse mal geschluckt, daß es ein sinnvolles Einsatzgebiet gibt): Das Programm müßte dringend entwanzt werden!

- Etwa 20...30 Stellen, wo Variablen ohne Deklaration verwendet werden.
- Mehrere Stellen, wo ein Vergleich stattfinden soll, aber eine Zuweisung ausgeführt wird.
- Fehlerhafte CSS-Wertzuweisungen, die vom Browser einfach ignoriert werden.

Für das Zeichnen: Besser geeignet wäre "SVG": Das versteht heutzutage jeder Browser.
Es wird dabei etwas weniger als hunderte Kilo- oder gar Megabyte RAM pro einfacher Linie verbraucht und so etwa um den Faktor zigtausend schneller gezeichnet.
Wobei ich aber selbst noch auf der Suche nach einem anständigen Tutorial für direktes Steuern einer SVG aus dem Javascript des umgebenden Dokuments heraus bin: Für Javascript INNERHALB eines SVGs gibt es ausreichend Material, aber für dessen Erzeugung von außen habe ich noch nichts gefunden.

Ob Lük mal einen Blick auf SVG werfen kann?
Harry Boeck ist offline   Mit Zitat antworten
Alt 18.02.08, 18:19   #6 (permalink)
Themenstarter
 
Registriert seit: 17.10.06
:::Lük::: Leistung: Facit NTK
:::Lük::: eine Nachricht über ICQ schicken
Likes: 0
Standard

Zitat:
Original von LX
Das konnte schon Meister Pythagoras vor zweieinhalbtausend Jahren
thx

Zitat:
Original von Harry Boeck
die Prämisse mal geschluckt, daß es ein sinnvolles Einsatzgebiet gibt
Habe ich das behauptet?

Zitat:
- Etwa 20...30 Stellen, wo Variablen ohne Deklaration verwendet werden.
Naja...natürlich gehört dies zu einem gutem Stil aber ändern tut sich dadurch doch nichst (oder?)

Zitat:
Mehrere Stellen, wo ein Vergleich stattfinden soll, aber eine Zuweisung ausgeführt wird.
Danke

Zitat:
Fehlerhafte CSS-Wertzuweisungen, die vom Browser einfach ignoriert werden.
Welchen Browser benutzt du denn? Bei mir funtioniert es.

Zitat:
Für das Zeichnen: Besser geeignet wäre "SVG": Das versteht heutzutage jeder Browser.
Naja... Der IE wird zum Beispiel nicht von Haus aus damit ausgestattet.

Zitat:
Ob Lük mal einen Blick auf SVG werfen kann?
Klar kann er das allerdings war mir nicht wichtig das Programm möglichst perfomant zu machen (sonst hätte ich das ganze sowiso mit einer GUI in C++ gemacht).
Javascript finde ich persönlich sehr bequem und desshalb ich das Problem damit gelöst.
:::Lük::: ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » Linien zeichnen
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mit der WinAPI zeichnen nookstar Code Kitchen 9 24.07.09 19:19
Direkt auf PC zeichnen !? Caleb Hardware Probleme 5 01.05.05 01:41
Taskmanager die ganze Zeit rote linien SteVe_O Windows 3 06.01.05 12:46
Programm zum zeichnen von Funktionen matrixII Linux/UNIX 6 28.09.04 15:15
c++ Augabe von Linien cAMP Code Kitchen 4 26.07.03 13:45


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61