Primer paso para obtener el ángulo del nodo, obtener el centro de la circunferencia
Entonces obtengo 3 puntos de los 3 primeros nodos para obtenerlo:
AX= cy.nodes()[0]._private.position.x AY= cy.nodes()[0]._private.position.y BX= cy.nodes()[1]._private.position.x BY= cy.nodes()[1]._private.position.y CX= cy.nodes()[2]._private.position.x CY= cy.nodes()[2]._private.position.y var yDelta_a = BY - AY var xDelta_a = BX - AX; var yDelta_b = CY - BY; var xDelta_b = CX - BX; var aSlope = yDelta_a / xDelta_a; var bSlope = yDelta_b / xDelta_b; //Get center circumference coordCentroCircunferenciaX = (aSlope*bSlope*(AY - CY) + bSlope*(AX + BX) - aSlope*(BX+CX) )/(2* (bSlope-aSlope) ); coordCentroCircunferenciaY = -1*(coordCentroCircunferenciaX- (AX+BX)/2)/aSlope + (AY+BY)/2;Luego iterar a través de los nodos obteniendo los ángulos:
for (i = 1;i< cy.nodes().length; i=i+1) { //starts nodes loop let nodo=cy.nodes()[i]; array.push(nodo._private.data.name); //get the node position(x,y) nodox=nodo._private.position.x nodoy=nodo._private.position.yAhora con 3 puntos: circunferencia central, posición del nodo y otro punto en el eje x
C = { x: coordCentroCircunferenciaX, y: coordCentroCircunferenciaY }; A = { x: nodox, y: 0 }; B = { x: nodox,y:nodoy };Entonces obtengo el ángulo con esta función:
function find_angle(A,B,C) { var AB = Math.sqrt(Math.pow(Bx-Ax,2)+ Math.pow(By-Ay,2)); var BC = Math.sqrt(Math.pow(Bx-Cx,2)+ Math.pow(By-Cy,2)); var AC = Math.sqrt(Math.pow(Cx-Ax,2)+ Math.pow(Cy-Ay,2)); return Math.acos((BC*BC+AB*AB-AC*AC)/(2*BC*AB))*(180/Math.PI); }Finalmente este es el ángulo con el centro de la circunferencia:
let angulo=Math.round(find_angle(A,B,C))Entonces, con este ángulo, puedo obtener este efecto para rotar las etiquetas de los nodos: