2016-07-22 18 views
-1

Hallo kann jemand mir bend Weg wie hier helfen enter image description heredynamisch flexiblen Weg zwischen zwei Punkten in SVG

here u can see it in action (es ist fast, was ich brauche, aber es auf Leinwand)

FRAGE
Wie kann ich es berechnen?
welcher Formel diese und wie korrekt beschreibt die Parameter 'd' der Weg

hier ist mein Code zu beschreiben (vielleicht braucht es einige Verbesserungen?)

var app = angular.module('app', []); 
 

 

 
app.controller("ctrl", function ($scope) { 
 
    var lineGraph = d3.select("#container").append("svg:svg").attr("width", '100%').attr("height", '100%'); 
 
    $scope.linesArr = []; 
 
    $scope.blocksArr = [{ 
 
    id: 0, 
 
    x: 0, 
 
    y: 0, 
 
    lineToID: [2] 
 
    },{ 
 
    id: 1, 
 
    x: 0, 
 
    y: 0, 
 
    lineToID: [0,2] 
 
    },{ 
 
    id: 2, 
 
    x: 0, 
 
    y: 0, 
 
    lineToID: [] 
 
    }]; 
 

 
    $scope.createLines = function(){ 
 
    for(var i = 0; i < $scope.blocksArr.length; i++){ 
 
     if($scope.blocksArr[i].lineToID.length){ 
 
     for(var j = 0; j < $scope.blocksArr[i].lineToID.length; j++){ 
 
      $scope.linesArr[$scope.blocksArr[i].id + ":"+j] = (lineGraph.append("svg:line")); 
 
     } 
 
     } 
 
    } 
 
    }; 
 
    $scope.createLines(); 
 

 
    $scope.checkPoints = function(){ 
 

 
    for(var i = 0; i < $scope.blocksArr.length; i++){ 
 
     $scope.blocksArr[i].x = parseInt(document.querySelector('#b' + i).style.left) + (document.querySelector('#b' + i).offsetWidth/2); 
 
     $scope.blocksArr[i].y = parseInt(document.querySelector('#b' + i).style.top) + (document.querySelector('#b' + i).offsetHeight/2); 
 

 
     if($scope.blocksArr[i].lineToID.length){ 
 
     for(var j = 0; j < $scope.blocksArr[i].lineToID.length; j++){ 
 
      $scope.linesArr[$scope.blocksArr[i].id+":"+j] 
 
      .attr("x1", $scope.blocksArr[$scope.blocksArr[i].id].x) 
 
      .attr("y1", $scope.blocksArr[$scope.blocksArr[i].id].y) 
 
      .attr("x2", $scope.blocksArr[$scope.blocksArr[i].lineToID[j]].x) 
 
      .attr("y2", $scope.blocksArr[$scope.blocksArr[i].lineToID[j]].y) 
 
      .style("stroke", "rgb(6,120,155)"); 
 
      //console.log(); 
 
     } 
 
     } 
 
    } 
 
    }; 
 

 

 
    $scope.dragOptions = { 
 
    start: function(e) { 
 
     //console.log("STARTING"); 
 
    }, 
 
    drag: function(e) { 
 
     $scope.checkPoints(); 
 

 
     //console.log("DRAGGING"); 
 
    }, 
 
    stop: function(e) { 
 
     //console.log("STOPPING"); 
 
    }, 
 
    container: 'container' 
 
    } 
 

 

 
}); 
 

 

 

 

 

 

 

 

 

 

 

 

 
app.directive('ngDraggable', function($document) { 
 
    return { 
 
    restrict: 'A', 
 
    scope: { 
 
     dragOptions: '=ngDraggable' 
 
    }, 
 
    link: function(scope, elem, attr) { 
 
     var startX, startY, x = 0, y = 0, 
 
      start, stop, drag, container; 
 

 
     var width = elem[0].offsetWidth, 
 
      height = elem[0].offsetHeight; 
 

 
     // Obtain drag options 
 
     if (scope.dragOptions) { 
 
     start = scope.dragOptions.start; 
 
     drag = scope.dragOptions.drag; 
 
     stop = scope.dragOptions.stop; 
 
     var id = scope.dragOptions.container; 
 
     if (id) { 
 
      container = document.getElementById(id).getBoundingClientRect(); 
 
     } 
 
     } 
 

 
     // Bind mousedown event 
 
     elem.on('mousedown', function(e) { 
 
     e.preventDefault(); 
 
     startX = e.clientX - elem[0].offsetLeft; 
 
     startY = e.clientY - elem[0].offsetTop; 
 
     $document.on('mousemove', mousemove); 
 
     $document.on('mouseup', mouseup); 
 
     if (start) start(e); 
 
     }); 
 

 
     // Handle drag event 
 
     function mousemove(e) { 
 
     y = e.clientY - startY; 
 
     x = e.clientX - startX; 
 
     setPosition(); 
 
     if (drag) drag(e); 
 
     } 
 

 
     // Unbind drag events 
 
     function mouseup(e) { 
 
     $document.unbind('mousemove', mousemove); 
 
     $document.unbind('mouseup', mouseup); 
 
     if (stop) stop(e); 
 
     } 
 

 
     // Move element, within container if provided 
 
     function setPosition() { 
 
     if (container) { 
 
      if (x < container.left) { 
 
      x = container.left; 
 
      } else if (x > container.right - width) { 
 
      x = container.right - width; 
 
      } 
 
      if (y < container.top) { 
 
      y = container.top; 
 
      } else if (y > container.bottom - height) { 
 
      y = container.bottom - height; 
 
      } 
 
     } 
 

 
     elem.css({ 
 
      top: y + 'px', 
 
      left: x + 'px' 
 
     }); 
 
     } 
 
    } 
 
    } 
 
})
html,body, #container{ 
 
    height: 100%; 
 
    margin: 0; 
 
} 
 
.box{ 
 
    position: absolute; 
 
    width: 100px; 
 
    height: 30px; 
 
    line-height: 30px; 
 
    border: 1px solid #c07f7f; 
 
    text-align: center; 
 
    background: #f3f4ff; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
<div ng-controller="ctrl" ng-app="app" id="container"> 
 
    <div class="box" id="b{{$index}}" ng-repeat="i in blocksArr" ng-draggable='dragOptions' ng-style="{top: blocksArr[$index].y, left: blocksArr[$index].x}">{{$index}}</div> 
 
</div>

+0

Willkommen beim Stapelüberlauf! Bitte bearbeiten Sie Ihre Frage, um Ihren Code in die Frage einzutragen (nicht nur auf einer anderen Seite). Dann, bitte klären Sie Ihre Frage. Mit welchem ​​Teil hast du Probleme? Kannst du statisches SVG machen, das wie du aussieht? Weißt du nicht, wie man SVG so aussehen lässt, wie du es willst? Was hast du zu tun und was läuft falsch? – Phrogz

+0

Hallo. Tnx. jetzt ist es besser? –

+0

Sie haben Ihren Code eingegeben (gute Arbeit), aber Sie haben Ihr Problem noch nicht beschrieben, was Sie (spezifisch) wollen und was Ihr Problem ist. – Phrogz

Antwort

0

Erraten, I Ich denke, dass das, was Sie wollen, ist:

  • Zeigen Sie zwei Punkte auf s Creen.
  • Berechnen Sie ein achsgleiches rechtwinkliges Dreieck, das diese Punkte berührt.
  • Zeichnen Sie ein Dreieck für die Füllung und farbige Linien für die Kanten der Dreiecke.
  • Erlauben Sie dem Benutzer, die Maus zu verwenden, um auf die Punkte zu klicken und sie an neue Positionen zu ziehen.
  • Dynamische Aktualisierung des rechtwinkligen Dreiecks basierend auf diesen Punkten.

Es ist unklar, in welchem ​​Teil des obigen Sie Probleme haben (außer vielleicht "alles"). Bei der Computerprogrammierung geht es im Allgemeinen darum, herauszufinden, was Sie tun möchten, indem Sie sie in einfache Schritte aufteilen (wie oben beschrieben) und dann nacheinander an diesen Schritten arbeiten.

  1. Können Sie zwei "zufällige" Punkte auf dem Bildschirm berechnen? (Tipp: Math.random() ist möglicherweise angemessen, oder Sie können einfach zwei feste Startpositionen auswählen.)
  2. Können Sie zwei Punkte auf dem Bildschirm zeichnen? (Tipp: Sie können ein SVG <circle> verwenden und die Attribute cx und cy anpassen.)
  3. Können Sie berechnen, wo der dritte Punkt sein sollte? (Tipp: Eine Möglichkeit besteht darin, den 'x' Wert eines Punktes und den 'y' Wert des anderen Punktes zu verwenden.)
  4. Können Sie ein gefülltes Dreieck zwischen diesen Punkten zeichnen? (Tipp: Ein einfacher Weg ist, ein SVG <polygon> zu verwenden und das Attribut points anzupassen.)
  5. Können Sie drei Linien für die Kanten zeichnen? (Tipp: Verwenden Sie <line> oder <polyline> Elemente, die später in dem Dokument als die <polygon> sind, so dass sie oben zeichnen ... aber die <circle> Elemente noch tiefer in das Dokument, so dass die Kreise über alles andere zeichnen.)
  6. Können Sie es so einrichten, dass wenn der Benutzer auf die Kreise klickt und zieht, bleiben sie unter der Maus? (Tipp: siehe this answer und Beispiel von mir, oder go going über SVG-Elemente ziehbar machen.)
  7. Während Ihres Drag-Handlers, können Sie Ihr Dreieck und Punkte und Linien neu berechnen und sie alle aktualisieren? (Hinweis: Sie können entweder setAttribute() verwenden, um Attribute von SVG-Elementen zu aktualisieren, z.setAttribute(myPoly,'points',arrayOfPoints.join()), oder Sie können SVG DOM bindings - z. myPoly.getItem(0).x = 43.)

Ihre Frage ist derzeit zu weit und vage. Bearbeiten Sie diese Frage entweder, um sie für Ihren genauen Wunsch und den genauen Code, der nicht für Sie arbeitet, spezifisch zu machen, oder erstellen Sie eine neue Frage, die ähnlich zielgerichtet ist. Ihr Code-Snippet macht im Grunde nichts Sinnvolles für den gesamten Code, den Sie dort haben.

Verwandte Themen