• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Zwei Knoten nacheinander auswählen und Pfad dazwischen anzeigen.

- wenn startNode = 0, dann ist path = 0 && startNode.path(d) = 0
??? path ist eine funktion am knotenobjekt und damit nicht 0
wenn startNode = 0 dann wird der ausdruck startNode && startNode.path(d) nur bis zu startNode ausgewertet und als ergebnis der wert von startNode (also 0) zurückgeliefert.

- wenn als Beispielwert startNode = 1, dann ist path = 1 && startNode.path(d) = was genau?
??? path ist eine funktion am knotenobjekt und damit auch nicht 1
wenn startNode = 1 kommt es zu einem laufzeitfehler, da im gegensatz zu vorhin auch der 2. teil des ausdrucks ausgewertet wird.
das wäre bei startNode = 1 also 1.path(d)
1 hat aber keine methode path

wenn startNode aber ein objekt mit einer funktion path wäre, dann würde das ergebnis der funktion path zurückgeliefert werden
 
Hey danke dir! Blöde frage, aber wie nennt man diese Regel? Wenn ich nach logischen Operatoren im Netz suche, dann finde ich nichts zu der Regel.
 
wenn startNode aber ein objekt mit einer funktion path wäre, dann würde das ergebnis der funktion path zurückgeliefert werden

Ich glaube ich checke das langsam bezüglich

Code:
 var path =  startNode && startNode.path(d)

wenn also startNode existiert, dann wird quasi startNode.path(d) wiedergegeben. wichtig ist also nur, ob startNode existiert oder nicht, oder?
Was ich nicht verstehe ist, warum man dann in der Zeile danach startNode = d setzt und nicht eine Zeile vorher.
 
wenn also startNode existiert, dann wird quasi startNode.path(d) wiedergegeben. wichtig ist also nur, ob startNode existiert oder nicht, oder?
sieh dir doch einfach die 5 kleinen beispiele aus #15 an, lass sie mal laufen und dann sollte das klar sein.

Was ich nicht verstehe ist, warum man dann in der Zeile danach startNode = d setzt und nicht eine Zeile vorher.
weil dann startNode und d dann immer identisch wären und du damit immer den kürzesten pfad von dem knoten auf den du gerade geklickt hast zu dem knoten auf den du gerade geklickt hast berechnen würdest
 
ich meine du kopierst das als script in eine leere html seite
das hat mit force layout nichts zu tun, das sind js grundlagen
 
ich meine du kopierst das als script in eine leere html seite
das hat mit force layout nichts zu tun, das sind js grundlagen

danke, habe ich mal gemacht und es kommt nur eine leere seite raus. wenn ich die konsole öffne, zeigt er mir dies an

startNode ist null:
startNode ist nicht null:
startNode ist wieder null: Array [ ]
startNode ist wieder nicht null: d


ist das richtig so?
 
ah, hatte
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

drin und nun entfernt...

er zeigt mir trotzdem

Code:
startNode ist null:  null 
startNode ist nicht null:  d
startNode ist wieder null:  Array [  ]
startNode ist wieder nicht null:  d
d
an

also der allerletze eintrag ist nicht gleich wie deiner
 
Hey, danke wieder mal! Beim 3. Eintrag steht ja

startNode ist wieder null: Array [ ]


schreibt die konsole "Array" automatisch zum [] dazu, wenn ein Array angezeigt wird?
 
und nochmal eine kleine nachfrage: in deinem zip sind ja 3 programme...hast du mir die gesendet, um zu zeigen, dass es bessere vorschläge gibt, als das programm, welches ich gefunden habe? also das mit dem anklicken durch shift?
das mit dem shift ist ja in deinem fall ja anders. gedacht ist das ja, du wählst mit einem klick ohne shift immer 1 knoten und bei klick mit shift mehrere knoten. du willst immer 2 knoten wählen. start und ende. das könntest du auch mit shift lösen, sprich klick ohne schift = start und klick mit schift = end

da würde mir "d3 v4 path" besser zum lernen für mein beispiel gefallen, da hier die nodes, die zwischen den beiden angeklickten nodes sind, schön fett hervorgehoben werden.
das ist doch nur grafischer schnickschnack und kannst du anpassen wie du lustig bist.
in dem dijkstra bsp. hab ich einfach mal die distanz zum startknoten als radius genommen im path bsp. allen beteiligten knoten einen größeren radius verpasst.

aber jedoch bei "dijkstra": die nodes laden sich immer ewig neu und erst danach wird der pfad angezeigt...ist das so bei "dijkstra" gewollt? was hat das denn für einen sinn?
im worst case berechnet dijkstra den abstand jedes knotens zum startknoten. und das über mehrere wege. das kann je nach größe des graphen dazu führen das der browser mit "Ein Script spinnt hier rum, soll das so sein?" nachfragt. um das zu umgehen wird immer nur knoten für knoten gearbeitet und zwischendurch die kontrolle an den browser zurückgegeben. das sorgt natürlich für lange laufzeit.
wenn du den endknoten mit übergibst - ist bei mir auskommentiert - bricht er beim endknoten die berechnung ab. das geht dann schneller.
 
Sooo, habe jetzt mal den Part, bei dem man 2 Nodes anklicken kann, direkt an meine eigenen Nodes im Force-Layout gepackt. Leider funktioniert es nicht. Kannst du mir da nochmal helfen?
Gruss

https://embed.plnkr.co/HxoglNWPRrEnD0SriTpN/

Es ist im Grunde dieser Part (Kommentare weggelassen) :

Code:
var node = svg.selectAll(".node")
              .data(nodes)
            .enter().append("g")
              .attr("class", "node")
              .call(force.drag);


node
  .append("circle")
  .attr("r", node_radius)//.style("fill", "...") nicht anwenden, da sonst umfärben per mouseover nicht funktioniert
  .on("click", function(d, i) 
              {
                var path = startNode && startNode.path(d) || [];
                startNode = d;
                link.style("stroke", function(d) 
                {
                  return path.includes(d.source) && path.includes(d.target) ? "#900" : "#999";
                });
                node.attr("r", function(d) 
                {
                  return path.includes(d) || startNode == d ? 10 : 4.5;
                });
              });

Mache ich hierbei einen fehler?
 
Zuletzt bearbeitet:
sooo, da leider
Code:
  .on("click", function(d, i) 
              {
                var path = startNode && startNode.path(d) || [];
                startNode = d;
                link.style("stroke", function(d) 
                {
                  return path.includes(d.source) && path.includes(d.target) ? "#900" : "#999";
                });
                node.attr("r", function(d) 
                {
                  return path.includes(d) || startNode == d ? 10 : 4.5;
                });
              });

nicht in meinem code funktioniert, nehme ich nun

Code:
 .on("click", function(d)
            {
              points.push(d);
              if (points.length > 2)
              {
                points.shift();
              }
              if (points.length > 1)
              {
                console.log("start: ", points[0].name, "end: ", points[1].name)
				
              }
            });

und baue darauf auf. Und zwar möchte ich erstmal, dass der startknoten points[0] sich rot färbt und der endknoten points[1] sich blau färbt.

dazu habe ich den code erweitert:

Code:
.on("click", function(d)
            {
              points.push(d);
              if (points.length > 2)
              {
                points.shift();
              }
              if (points.length > 1)
              {
                console.log("start: ", points[0].name, "end: ", points[1].name)
				points[0].style("fill", "red");
				points[1].style("fill", "blue");
				
				
              }
            });

Aber leider tut sich da nichts...kannst du nochal helfen?
 
Zuletzt bearbeitet:
Zurück
Oben