"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Zeichnen mit PHP

grOOvekill@ 23.01.2003 - 11:19 754 12
Posts

grOOvekill@

Legend
Vienna Badass
Avatar
Registered: Nov 2001
Location: @home
Posts: 2297
Ich hätt da mal eine Frage:

Hab ein Schulprojekt laufen, in dem es um Graphentheorie geht. Ist auch schon fertig, funktioniert bestens. Hab's mittels PHP realisiert. Nun habe ich mich gefragt, ob man Graphen nicht auch zeichnen kann. Nachdem PHP ja über diverse Mittel zur Grafikerstellung verfügt, sollte das doch technisch kein Problem sein. Nachdem ich die Matrix-Informationen in mehrdimensionalen Arrays zur Verfügung habe, bräuchte ich das doch nur mehr irgendwie in eine Grafik umwandeln.

Und hier ist mein Problem: Ich habe keine Ahnung, wie schwierig und aufwendig das sein könnte, eine Matrix grafisch darzustellen. Im Prinzip geht es um ein paar Knoten, die mit einer Kante (Strich) verbunden sind. Also nix aufregendes.

Hat irgendwer schon einmal so etwas in der Art programmiert und könnte mir Tipps geben, wie ich das angehen soll? Irgendwelche Tut-Sites würden mir da auch schon weiterhelfen.

Oder soll ich komplett den Hut draufhauen und mir den Streß gar nicht antun? Eine grafische Implementierung der Graphen wurde nämlich gar nicht verlangt, wäre sozusagen ein Bonus von mir.

Bin dankbar für jeden brauchbaren Tipp!

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
du wirst ein zweites script schreiben müssen, und ihm irgendwie all deine daten übergeben (form, get, database, ...) müssen, da du das bild über ein normales <IMG SRC="otherscript.php?...."> einbinden mußt.

crashman

OC Addicted
Avatar
Registered: Oct 2001
Location: Vienna
Posts: 891
Zitat von grOOvekill@
Im Prinzip geht es um ein paar Knoten, die mit einer Kante (Strich) verbunden sind.

Vielleicht mißversteh ich dic aber ich glaub diese art von graphen "automatisch" zeichnen zu lassen ist keine triviale aufgabe. Vorallem wenn es nachher noch ein mensch lesen können soll. Das Problem ist das du nur mit geraden linien net weit kommen wirst. Mit Kurven wirds aber recht mühsam. Sollen sie die kanten auch noch net überschneiden wirds sicher lustig.
Ist meine meinung vielleicht irr ich mich und es gibt perfekt libarys die dir solche graphen zeichnen aber selbergemacht ist es sicher eine tolle leistung.

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
du hast recht, für einen allgemeinen graph ist die aufgabe nicht trivial, wenn man zb so constrains wie maximale abstände, geringste wegstrecken, verteilung , lesbarkeit mit hinein nimmt.

wenn er wirklich nur "eine handvoll" hat, wird es wohl reichen, wenn er sie auf einem kreis anordnet.

grOOvekill@

Legend
Vienna Badass
Avatar
Registered: Nov 2001
Location: @home
Posts: 2297
Also die maximale Anzahl der Knoten beträgt 15. Wobei eigentlich eh nur zwischen 5 und 10 Knoten eingegeben werden. Ich hatte auf jeden Fall vor, sie kreisförmig anzuordnen und dann einfach mit Kanten zu verbinden, sofern es eine Verbindung gibt. Überschneidung ist egal.
Mal sehen, ob die Links da oben was bringen. :)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
hmm, ich weiss nich genau, was du willst - ich hab mal sowas gemacht:
http://www.renn-weg.net/watchouts_scripts/graph.php

ps: is ne x³-funktion graphisch dargestellt...
das script fängt mit folgenden get-argumenten was an:
Xmin
Xmax
Ymin
Ymax
width
height
step

wobei step sich auf die pixel bezieht also nicht kleiner als 1 sein kann
Bearbeitet von watchout am 24.01.2003, 18:34

grOOvekill@

Legend
Vienna Badass
Avatar
Registered: Nov 2001
Location: @home
Posts: 2297
Okay. Also das hier wird nach der Eingabe der Knotenanzahl angezeigt:
http://www.braintenance.com/kemal/pics/matrix.jpg

und obenstehende Matrix stellt folgenden Graphen dar:
http://www.braintenance.com/kemal/pics/graph.jpg

Was ich eigentlich vorhabe ist, daß untenstehender Graph quasi mittels PHP gezeichnet wird. Ein paar Knoten die verbunden sind.

Kompliziert?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von grOOvekill@
Okay. Also das hier wird nach der Eingabe der Knotenanzahl angezeigt:
http://www.braintenance.com/kemal/pics/matrix.jpg

und obenstehende Matrix stellt folgenden Graphen dar:
http://www.braintenance.com/kemal/pics/graph.jpg

Was ich eigentlich vorhabe ist, daß untenstehender Graph quasi mittels PHP gezeichnet wird. Ein paar Knoten die verbunden sind.

Kompliziert?
theoretisch dürfte sowas kein problem darstellen, wenn ich mal kapieren würde, wie du von der matrix auf den graphen kommst... :rolleyes:

grOOvekill@

Legend
Vienna Badass
Avatar
Registered: Nov 2001
Location: @home
Posts: 2297
Zitat von watchout
theoretisch dürfte sowas kein problem darstellen, wenn ich mal kapieren würde, wie du von der matrix auf den graphen kommst... :rolleyes:

Okay, ein wenig Erklärung sollte ich wohl geben. Sorry, hab vergessen, daß sich nicht jeder mit dem Schei** auskennt! :D

Here goes:
Der Graph besteht aus 6 Knoten, von 1 bis 6 nummeriert. Wenn du dir die matrix ansiehst, wirst du merken, daß auch hier 6 Felder existieren. Okay, beginnen wir bei der ersten Zeile, neben dem 1'er. Da steht:
000101 und darüber steht 123456. Das ergibt untereinander:

123456
000101

Das bedeutet, daß es von Knoten 1 eine Verbindung zu Knoten 4 und Knoten 6 gibt.

In der 2. Zeile steht 001010 --> Von Knoten 2 geht eine Verbindung zu Knoten 3 und eine zu Knoten 5

usw.usw...

Alles klar?
:)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von grOOvekill@
Okay, ein wenig Erklärung sollte ich wohl geben. Sorry, hab vergessen, daß sich nicht jeder mit dem Schei** auskennt! :D

Here goes:
Der Graph besteht aus 6 Knoten, von 1 bis 6 nummeriert. Wenn du dir die matrix ansiehst, wirst du merken, daß auch hier 6 Felder existieren. Okay, beginnen wir bei der ersten Zeile, neben dem 1'er. Da steht:
000101 und darüber steht 123456. Das ergibt untereinander:

123456
000101

Das bedeutet, daß es von Knoten 1 eine Verbindung zu Knoten 4 und Knoten 6 gibt.

In der 2. Zeile steht 001010 --> Von Knoten 2 geht eine Verbindung zu Knoten 3 und eine zu Knoten 5

usw.usw...

Alles klar?
:)
oh... muss ehrlich sagen, dass ich von sowas noch nie was gehört habe :D

also:
- deine erste aufgabe wird sein müssen, die koordinaten für die einzelnen punkte zu berechnen - die legst du idealerweise in einem array ab (ich nenns mal $koordinaten_array)

- ok, weiter: da es ja egal sein dürfte, ob du die matrix spalten- oder zeilenweise abarbeitest, machst du am besten eine foreach-schleife (den key wirst du brauchen: $key_a), und darin gleich noch eine ($key_b)
ach, was red' ich... so sollt' der teil ca. gehn:

Code: PHP
foreach($eingabe_matrix as $key_a => $eingabe_zeile)
{
	foreach($eingabe_zeile as $key_b => $eingabe_zelle)
	{
		if(isset($eingabe_zelle))
		{
			imageline(
				$imagepointer,
				$koordinaten_array[$key_a]['x'],
				$koordinaten_array[$key_a]['y'],
				$koordinaten_array[$key_b]['x'],
				$koordinaten_array[$key_b]['y'],
				$color
				);
		}
	}
}

hth

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
man muß natürlich nur die hälte der matrix speichern bzw auswerten, da sie an der diagonale gespiegelt ist.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von atrox
man muß natürlich nur die hälte der matrix speichern bzw auswerten, da sie an der diagonale gespiegelt ist.
klar, es geht, fragt sich nur ob sich der aufwand lohnt ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz