2013-01-14 2 views
1

히트 테스트를 수행하려고하는 비트 맵 이미지가 있습니다. 히트 테스트는 정상적인 비트 맵 일 경우에만 작동합니다. 하지만 비트 맵을 회전하고 크기를 조정해야하며 히트 테스트를 제대로 파악하지 못하는 것 같습니다.행렬 조작 사각형에 대한 히트 테스트

여기서 x와 y는 커서 x와 y입니다. 조작 된 비트 맵에서 커서 (손가락 누름)가 클릭되었는지 확인해야합니다. 척도가 잘 작동하는 것처럼 보이지만 회전이 영향을 미치지 않는 것 같습니다.

float[] pts = new float[4]; 
float left = m.getX(); 
float top = m.getY(); 
float right = left + mBitmaps.get(i).getWidth(); 
float bottom = top + mBitmaps.get(i).getHeight(); 
pts[0] = left; 
pts[1] = top; 
pts[2] = right; 
pts[3] = bottom; 

float midx = left + mBitmaps.get(i).getWidth()/2; 
float midy = top + mBitmaps.get(i).getHeight()/2; 

Matrix matrix = new Matrix(); 
matrix.setRotate(m.getRotation(), midx, midy); 
matrix.setScale(m.getSize(), m.getSize(), midx, midy); 

matrix.mapPoints(pts); 

if(x >= pts[0] && x <= pts[2] && y >= pts[1] && y <= pts[3]) 
{ 
    return i; 
} 

답변

3

회전 후에 사각형이 더 이상 좌표 축에 정렬되지 않기 때문에 테스트가 실패합니다.

당신이 할 수있는 속임수는 역변환 행렬로 커서 위치를 다시 변환 한 다음 변환 된 위치를 원래 사각형과 비교하는 것입니다.

Matrix matrix = new Matrix(); 
matrix.setRotate(m.getRotation(), midx, midy); 
matrix.postScale(m.getSize(), m.getSize(), midx, midy); 

Matrix inverse = new Matrix(); 
matrix.invert(inverse); 
pts[0] = x; 
pts[1] = y; 
inverse.mapPoints(pts); 
if(pts[1] >= top && pts[1] <= bottom && pts[0] >= left && pts[0] <= right) 
{ 
    return i; 
} 
+0

난 테스트해야한다고 생각 (PTS [0]> = 0 && PTS [0] = 0 && PTS [1] yoah

+0

@yoah 나는 그렇게 생각하지 않는다. 매트릭스에 번역이 없다. – Henry

+0

@Henry 제안을 사용하면 커서가 비트 맵이 변형되지 않은 것처럼 동작합니다. 90도 회전하면 의미있는 부분은 반영되지 않습니다. 비트 맵이 회전되지 않은 것처럼 여전히 그. – lostdev