2012-04-27 1 views
4

다른 객체를 중심으로 원을 그리려고합니다. 너무 열심히, 나는 계산했다. 그러나 JS, 원을 따라가는 객체

var dx = this.x - this.parent.x, 
    dy = this.y - this.parent.y, 
    r = Math.atan2(dy, dx); 

this.x = Math.sin(r) * this.speed + this.x; 
this.y = (Math.cos(r) * this.speed * -1) + this.y; 

이 코드를 실행

, 그것은 나타납니다 ... 아마 잘못된 공식을 사용하고 있지만 내가 대신해야하는 하나 확실하지 않다 ... 원 나선형입니다 밝혀 일하다. 각 프레임은 객체가 부모 객체 주위를 원호로 움직입니다.

그러나 아크는 커지고 점점 커져 거리가 점점 커집니다.

나는 어떤 실수를하나요?

답변

5

플로트 값에 무한 정밀도가 없으며 무한히 작은 각도 단계가 없습니다. 따라서이 반복 계산은 정확하지 않을 수 있습니다.

정확한 반복 솔루션이 없습니다. 초기 접근 방식으로 정밀도를 높이려고하면 여전히 발산됩니다.

이 솔루션은 원 쉽게입니다 angulum에서 완전히 각 단계를 계산하는 것입니다 :

// init part, set your own values 
var a = 0; // in radian 
var r = 100; // radius, in pixels for example 
var da = 1; // in radian. Compute this (once!) using r if you like to use an absolute speed and not a radial one 


// each modification 
a += da 
x = r*Math.sin(a); 
y = r*Math.cos(a); 
+0

내가 변경 한 모든 변경 사항이 기본적으로 악화 된 이유를 설명합니다. 코드는 정확했지만 충분하지 않았습니다 ... 어떻게 변수가 내 것과 일치합니까? a는도 단위의 각도입니다. r 반경과 da 속도? – Johan

+0

이런 종류의 반복 계산을 사용하면 수학적으로 충분히 정확하지 않을 수 있습니다. –

+1

a는 라디안 단위의 각도, r은 반경, da는 각속도입니다. –

2

dystroy의 솔루션 @ 완전히 합법적이지만 있도록 반복적 인 접근을 제한하는 방법은 무엇입니까 그것은 통제 할 수없는 나선형이 아닙니다.

새 변수 R을 소개합니다.이 변수는 개체가 부모를 돌리는 고정 반경입니다.

//your original code 
var dx = this.x - this.parent.x, 
    dy = this.y - this.parent.y, 
    r = Math.atan2(dy, dx); 

//apply constraint: 
//calculate what dx and dy should be for the correct radius: 
dx = -R * Math.cos(r); 
dy = -R * Math.sin(r); 

//force this.x, this.y to match that radius. 
this.x = this.parent.x + dx; 
this.y = this.parent.y + dy; 

//the radius will still be off after your update, but 
//the amount by which it is off should remain bounded. 
this.x = Math.sin(r) * this.speed + this.x; 
this.y = (Math.cos(r) * this.speed * -1) + this.y; 

당신은 또한 위치를 업데이트 한 후 제약 조건을 적용 할 수 :

var hypot = function(x, y) { return Math.sqrt(x*x + y*y); }; 
//Run this code only once! 
var R = hypot(this.x - this.parent.x, this.y - this.parent.y); 

그런 다음 당신은 원의 반지름이 해결 된 제약 조건을 추가 할 수 있습니다.

+0

나는이 anwser 기억할 것이다 .. 감사합니다! – Johan

+0

당신은 여전히 ​​총 ​​각 위치에 차이가 있습니다. 기본 규칙은 당신이 다른 방법으로는 할 수없는 경우에만 근사값을 합계로 대체해야한다는 것입니다. –

+0

아직도이 반복적 인 접근법의 수학을 이해하지 못합니다. 링크가 있습니까? – Raffaele