[J2D , DisplayObject2D] HitTest 구현 알고리즘 (회전변환)

 

HitTest 의 실제 구현중 대상객체가 회전 되었을때 , 회전된 대상에 마우스를 올리면 회전되기전 객체의 영역안에 들어있는지 아닌지를 판별 하기 위한 연산

검은점 4개 : 회전중인 객체의 포인트

텍스쳐 : 회전 전의 이미지 영역

빨간색점 : 회전중인 객체 포인트 영역 의 마우스 포인터가 회전 변환된 점

=>> 빨간점이 텍스쳐 위에 있다면 True , 아니면 False

 

float rot = 0.01f;//업데이트시 로테이션 rad 추가량 float cx = 200;//회전중심점 x float cy = 200;//회전중심점 y void Test()//업데이트 함수

{ Matrix _transform = Matrix.Identity; _transform *= Matrix.CreateTranslation(-cx, -cy, 0); _transform *= Matrix.CreateRotationZ(rot); _transform *= Matrix.CreateTranslation(cx, cy, 0); rad += rot; //변환을 위한 rad 값 축적 , 실제 rad

var v0 = Vector2.Transform(new Vector2(p[0].x, p[0].y), _transform); p[0].x = v0.X; p[0].y = v0.Y; var v1 = Vector2.Transform(new Vector2(p[1].x, p[1].y), _transform); p[1].x = v1.X; p[1].y = v1.Y; var v2 = Vector2.Transform(new Vector2(p[2].x, p[2].y), _transform); p[2].x = v2.X; p[2].y = v2.Y; var v3 = Vector2.Transform(new Vector2(p[3].x, p[3].y), _transform); p[3].x = v3.X; p[3].y = v3.Y; } float rad = 0; void TestRed()//변환함수

{ float mx = Mouse.GetState().X; float my = Mouse.GetState().Y; double rx = (mx - s.x) * Math.Cos(-rad) - (my - s.y) * Math.Sin(-rad); double ry = (mx - s.x) * Math.Sin(-rad) + (my - s.y) * Math.Cos(-rad); trace(rx, ry); if (0 < rx && rx < 128 && 0 < ry && ry < 128) trace("TRUE"); mp.x = (float)rx + s.x ; mp.y = (float)ry + s.y ; }

 

Yamecoder 야매코더_
XNA 2012.04.19 16:07
Powerd by Tistory, designed by criuce
rss