2012-11-28 3 views
0

세계 좌표의 점 목록을 화면의 점 (픽셀)으로 변환하고 싶습니다. 기본적으로 전 세계의 좌표 (worldX, worldY)를 화면 행렬에 곱하고 싶습니다.JS : 세계의 점을 화면의 점으로 변환하는 빠른 방법을 찾고 있습니다.

문제는이 절차가 매우 느립니다.

코드 :

for (int i = 0; i < cnt; i++) 
{ 
    worldX = getWorldX(i); 
    worldY = getWorldY(i); 

    screenX = wtsMat.vx1 * worldX + wtsMat.vy1 * worldY + wtsMat.tx; 
    screenY = wtsMat.vx1 * worldX + wtsMat.vy2 * worldY + wtsMat.ty; 

    ... 
    //Do something with screenX and screenY 
} 

이 작업을 수행 할 수있는 더 빠른 방법이 있는지 궁금.

+2

당신이 당신의 변수를 좀 더 설명하는 이름을하시기 바랍니다 줄 수 있을까요? –

+1

어디서'i'를 사용하고 있습니까? (당신은 세계 좌표에 어떻게 든 색인을 붙일 필요가 없습니까?) – nnnnnn

+1

은 screenX/Y처럼 보이지만 루프 중에는 변하지 않습니다. 그래서 앞으로 계산하지 않으시겠습니까? – philipp

답변

0

wtsMat 변수는 루프 중에 변경되지 않으므로 속성 대신 변수로 정의하지 않으시겠습니까?

var worldX, worldY, screenX, screenY; 
var wtsMatVx1 = wtsMat.vx1; 
var wtsMatVy1 = wtsMat.vy1; 
var wtsMatTx = wtsMat.tx; 
var wtsMatVx2 = wtsMat.vx2; 
var wtsMatVy2 = wtsMat.vy2; 
var wtsMatTy = wtsMat.ty; 
var i = cnt; 
for (i; i > 0; i--) 
{ 
    worldX = getWorldX(i); 
    worldY = getWorldY(i); 

    screenX = wtsMatVx1 * worldX + wtsMatVy1 * worldY + wtsMatTx; 
    screenY = wtsMatVx1 * worldX + wtsMatVy2 * worldY + wtsMatTy; 

    ... 
    //Do something with screenX and screenY 
} 

PS : 당신이 wtsMat.vx1 사용 screenY을 계산하기 위해,이 wtsMat.vx2이어야한다

코드는 다음과 같이해야 하는가?

+0

각 루프 반복 끝에 변수를 지우는 것은 계산에 영향을 미치지 않으므로 불필요하게 루프를 느리게 만듭니다. OP가 속도를 높이려고 노력 중입니다 ... – nnnnnn

+0

변수를 지워서 다른 계산에 사용할 메모리를 비우지 않습니까? 그렇지 않으면 지우기를 제거하십시오. –

+0

요점은 네 개의 변수를 지우 자마자 루프의 다음 반복이 시작되고 어쨌든 다른 값으로 설정된다는 것입니다. – nnnnnn

0

계산의 정확성과 속도 문제 만 생각해보십시오.

또한 코드의 일부를 생략 했으므로 sceenX 및 screenY를 사용하지 않으면 속도가 느려집니다. 따라서 루프의 모든 내용이 게시되었습니다. 이것은 매우 단순한 계산이므로 cnt가 느려야합니다.

몇 가지 당신은 일을 빠르게 수행 할 수 있습니다

//store object vars locally for quicker access 
var wtsMatVx1 = wtsMat.vx1; 
var wtsMatVy1 = wtsMat.vy1; 
var wtsMatVy2 = wtsMat.vy2; 
var wtsMatTx = wtsMat.tx; 
var wtsMatTy = wtsMat.ty; 

while (cnt--) 
{ 
    //while-- is faster according to tests 

    var worldX = getWorldX(i); //dont use a global scope, which is used if you dont use var 
    var worldY = getWorldY(i); //dont use a global scope 


    var screenX = wtsMatVx1 * worldX + wtsMatVy1 * worldY + wtsMatTx; 
    var screenY = wtsMatVx1 * worldX + wtsMatVy2 * worldY + wtsMatTy; 

    ... 
    //Do something with screenX and screenY 
} 
관련 문제