Ich habe Mühe, die richtige Geometrie zu finden, um einen Mittelpunkt eines Pfads entlang eines Bogens zu finden. Sagen wir, ich habe zwei Punkte: x1, y1 und x2, y2. wie unten in einer Linie:Berechnen des Bogens/Punkts in d3-Pfad
x1, y1 ist A. x2, y2 B.
Im Versuch, eine Funktion zu schreiben, die den Abstand i liefern können (-1 oder 1) im obigen Bild und es gibt die x- und y-Koordinaten zurück.
[update]
Sie müssen verwenden, um den Winkel der Linie Figur aus x und y im Blick: So kann ich einen mittleren Punkt in dem Pfad hinzufügen können Sie die Zeile die folgenden machen zum. Unten wird angezeigt, dass die Linie 45 Grad beträgt, eine Seite des Dreiecks ist 5, eine Seite ist 1. Daraus können Sie x und y berechnen.
Ich glaube, ich es mit dem Code unten herausgefunden und Geige fiddle Beispiel:
var svgContainer = d3.select("#canvas").append("svg")
.attr("width", 400)
.attr("height", 400);
var lineData = [ { "x": 0, "y": 0}, { "x": 100, "y": 100}];
var midPoint = {
x:Math.abs(lineData[1].x - lineData[0].x)/2,
y:Math.abs(lineData[1].x - lineData[0].x)/2
};
function calcAngle(x1, x2, y1, y2) {
var calcAngleVal = Math.atan2(x1-x2,y1-y2)*(180/Math.PI);
if (calcAngleVal < 0) {
calcAngleVal = Math.abs(calcAngleVal);
} else{
calcAngleVal = 360 - calcAngleVal;
}
return calcAngleVal;
}
var angle = calcAngle(lineData[0].x, lineData[1].x,lineData[0].y,lineData[1].y);
var sin = Math.sin(angle * Math.PI/180);
var cos = Math.cos(angle * Math.PI/180);
var xLen = Math.abs(lineData[1].x - lineData[0].x)/2;
var yLen = Math.abs(lineData[1].y - lineData[0].y)/2;
var n = 1.5;
var midpointArc = {
x: midPoint.x + (sin * (n * 25)),
y: midPoint.y + (cos * (n * 25))
};
lineData.splice(1,0,midpointArc);
var lineFunction = d3.svg.line()
.x(function(d) { return d.x; })
.y(function(d) { return d.y; })
.interpolate("basis");
var lineGraph = svgContainer.append("path")
.attr("d", lineFunction(lineData))
.attr("stroke", "blue")
.attr("stroke-width", 1)
.attr("fill", "none");
var pathEl = lineGraph.node();
var curvedMidpoint = pathEl.getPointAtLength(pathEl.getTotalLength()/2);
svgContainer.append("circle")
.attr('r',5)
.attr('cx', curvedMidpoint.x)
.attr('cy', curvedMidpoint.y)
Danke. Das ist hilfreich, sobald die Linie (eigentlich Pfad) gezeichnet wird, aber mein Problem war, dass ich den Mittelpunkt bei N (-1 oder 1 in meiner Zeichnung) bekommen möchte, bevor der Pfad gezeichnet wird. Der Schlüssel ist, dass Sie den Grad der Linie herausfinden müssen, um nach den x, y Punkten zu suchen. Nimm einen Webstuhl beim Update. würde gerne hören, wenn Sie denken, es gibt einen besseren Weg, um auf die Antwort zu kommen. – jamescharlesworth
Was ist, wenn Sie einen Punkt in einem imaginären Pfad kennen möchten, der nicht im DOM enthalten ist, nur um ein Kreiselement auf dem SVG (DOM) an dieser Koordinate zu platzieren? Es scheint so, als müssten Sie einen Pfad injizieren, damit die Berechnung funktioniert. – vsync
Beachten Sie, dass die Funktion nicht mehr unterstützt wird https://developer.mozilla.org/en-US/docs/Web/API/SVGPathElement/getPointAtLength –