2017-09-29 1 views
2

중력처럼 바닥에 끌린 볼을 안에 넣고 용기를 만들려고합니다. 나는 그것을 잘하는 것에 가깝지만 볼은 결국 서로 녹아서 가시성을 유지하지 못합니다.경계 영역에서 중력을 정확하게 시뮬레이션하려면 어떻게해야합니까?

See the demo here

나는 각 노드의 반경을 고려하지 않기 때문에 문제가 중력 함수 자체에서 오는 생각 :

var gravity = function() { 
    return function(d) { 
     d.y += (d.cy - d.y); 
     d.x += (d.cx - d.x); 
    }; 
} 

또는 시뮬레이션 애니메이션의 경계 함수에서 (체크)

, 위의 동일한 문제에 대해

d3.selectAll("circle.node") 
    .attr("cx", function(d,i){ return Math.max(radius, Math.min(width - radius, d.x)); }) 
    .attr("cy", function(d,i){ return Math.max(radius, Math.min(height - radius, d.y)); }); 

이 경우 각 볼을 어떻게 구분할 수 있습니까?

편집 : 나는 그것을 공유 할 것이다 해결책을 발견 곧

+1

당신은 [충돌의 힘을 사용할 수 있습니다 ] (https://github.com/d3/d3-force#collision)'d3.forceCollide'를 사용하면 중복을 막을 수 있습니다. 커스텀 중력 함수를 구현 한 놀라운 블록 [* Mixing drinks on Tralfamadore *] (https://bl.ocks.org/monfera/2d2809d8458ffb81cc9acab2e65ed4ef)을 살펴보고 점들을 구별하기 위해'd3.forceCollide'를 사용하십시오. – altocumulus

+0

나는이 예제를 본 적이 있지만, 나는 그것을 원한다면 성공시킬 수있는 방법을 찾지 못했다.이 데모는 웨이브와 함께 커스텀 스크립트를 사용하는데, 한번 더 해보겠습니다. – pirs

답변

0

좋아, 나는 마침내 문서를 읽고 문제를 이해했습니다! See the demo here

모든

은 forceSimulation에 올바르게 통합, 각 노드 사이에서 충돌에 대해, 그리고 틱 함수의 바운드 계산 :

... 


    // Change values below to modify the physic 
    var simulation = d3.forceSimulation() 
    .velocityDecay(0.3) 
    .force("y", d3.forceY(height).strength(.035)) // gravity at bottom 
    .force("collide", d3.forceCollide().radius(radius).strength(1.5).iterations(10)) 
    .nodes(nodes) 
    .on('tick', tick); 

    function tick() { 
    // bound 
    node.attr('cx', function(d) { return d.x = Math.max(radius, Math.min(width - radius, d.x)); }) 
     .attr('cy', function(d) { return d.y = Math.max(radius, Math.min(height - radius, d.y)); }); 
    } 
+0

해석이 잘못되었습니다. 차이점을별로 내지 않고 * 키 *로 표시된 행을 안전하게 삭제할 수 있습니다. 귀하의 질문에 내 [코멘트] (https://stackoverflow.com/questions/46491128/how-can-i-simulate-gravity-correctly-in-a-bounded-area#comment79949728_46491128)에서 말했듯이'd3 .forceCollide'를 사용하면 원을 분리 할 수 ​​있습니다. 이 수정 된 [JSFiddle] (https://jsfiddle.net/eL7ayj2z/)에서 데모를보십시오. 링크 힘은 노드를 서로 잡아 당겨 '강제 충돌'의 반발력을 막아줍니다. – altocumulus

+0

좋은 직장, 나는 d3.js에 대해 새로운데, 나는 더 많은 것을 아직 배울 필요가있다. 나는 대답을 업데이트한다. 감사합니다. – pirs

+0

그러나 "튀는 공 효과"는 링크가 없으면 현실감이 떨어집니다. – pirs

0

planck.js라는 라이브러리가있다. 나는 그것이 D3와는 아무런 관련이 없다는 것을 알고 있지만, 영감을 얻기 위해 항상 코드를 점검 할 수 있습니다.

행운을 빈다.

+1

이것은 "link"입니다. -only "대답. – clabe45

+1

링크가 작동하지 않습니다. https://github.com/shakiba/planck.js이어야합니다. –

+0

감사합니다.하지만 d3.js로 정말하고 싶습니다. – pirs

관련 문제