2013-05-20 2 views
0

나는 stackoverflow를 검색하여 this question을 찾고 2D 모양 회전에 대해 알게되었습니다. 2D 다각형 모양 알고리즘 회전

I는 포맷

int x1=-30, x2=-15, x3=20, x4=30; 
    int my1=-30,y2=-15,y3=0,y4=15,y5=20,y6=30; 

의 좌표가 나는 모양

void draw_chair() 
     {  
     int loc_xc = xc+xp; 
     int loc_yc = yc+yp; 

     line(x2+loc_xc,my1+loc_yc,x2+loc_xc,y5+loc_yc); 
     line(x3+loc_xc,my1+loc_yc,x3+loc_xc,y5+loc_yc); 
     line(x2+loc_xc,my1+loc_yc,x3+loc_xc,my1+loc_yc); 
     line(x2+loc_xc,y2+loc_yc,x3+loc_xc,y2+loc_yc); 
     line(x2+loc_xc,y3+loc_yc,x3+loc_xc,y3+loc_yc); 
     line(x1+loc_xc,y4+loc_yc,x4+loc_xc,y4+loc_yc); 
     line(x2+loc_xc,y3+loc_yc,x1+loc_xc,y4+loc_yc); 
     line(x3+loc_xc,y3+loc_yc,x4+loc_xc,y4+loc_yc); 
     line(x1+loc_xc,y4+loc_yc,x1+loc_xc,y6+loc_yc); 
     line(x4+loc_xc,y4+loc_yc,x4+loc_xc,y6+loc_yc); 
     } 

그릴이 기능을 사용이

int xc=320, yc=240;//Center of the figure 
    int xp=0, yp=0;//Pivot point for this figure 

같은 일부 센터 피벗 점을 문제는, 이제 나는 회전 된 x와 y 값을 계산하는 방법에 혼란 스럽다. 나는 구글을 시도하고이 코드 조각

int tempx=x1; 
    x1=tempx*cos(angle)-my1*sin(angle); 
    my1=tempx*sin(angle)+my1*cos(angle); 

    tempx=x2; 
    x2=tempx*cos(angle)-y2*sin(angle); 
    y2=tempx*sin(angle)+y2*cos(angle); 

    tempx=x3; 
    x3=tempx*cos(angle)-y3*sin(angle); 
    y3=tempx*sin(angle)+y3*cos(angle); 

    tempx=x4; 
    x4=tempx*cos(angle)-y4*sin(angle); 
    y4=tempx*sin(angle)+y4*cos(angle); 

나는이 시도 회전 발견하지만하지 않았다 회전 모양을 제대로 대신이 코드가 다른 이상한 모양으로 형태를 변환합니다. 또한 각 포인트에 대해 새로운 값을 계산하는 방법은 4 x 포인트와 6 y 포인트가 있습니까?

아이디어가 있으십니까? 또는 암시? 감사합니다.

+0

Google에서 코드를 복사/붙여 넣기하는 대신 회전 행렬이 작동하는 방식에 대해 알아보십시오. – Blender

답변

4

기술적 방향으로 좌표를 회전시킬 수는 없습니다. 방향의 개념이없는 지점 일뿐입니다.

찾은 코드는 실제로 벡터를 회전하는 데 사용되지만 실제로는 좌표를 벡터로 변환해야합니다. 벡터는 그림의 중심을 점에 연결하는 보이지 않는 선이라고 생각할 수 있습니다. 따라서 점은 두 점으로 구성됩니다. 두 점으로 나뉘며, 나중에 점을 (0,0)으로 가정 할 수 있습니다. (x2, my1), (x2, y5) ...와 같은 쌍에 해당합니다.

PS :

코드는 실제로 이런 일이되어야 만 완벽한 각도를 전달하지 않는 한, 당신은 정수 좌표 항상에 그림 작업을 기대할 수 없다. 당신은) 등

int point1x, point1y; 
point1x = (int) round(x2*cos(angle)-m1y*sin(angle)); 
point1y = (int) round(x2*sin(angle)+m1y*cos(angle)); 

int point2x, point2y; 
point2x = (int) round(x2*cos(angle)-y5*sin(angle)); 
point2y = (int) round(x2*sin(angle)+y5*cos(angle)); 

... 

line(point1x+loc_xc, point1y+loc_yc, point2x+loc_xc, point2y+loc_yc); 

과 복식으로 필요할 것이다.

또한 angle 값이 sin()cos() 기능으로 간주되므로 값이 라디안인지 확인하십시오. 당신이도를 통과하는 경우, 다음과 같은 식에 처음 라디안로 변환 :

double pi = acos(-1); 
double rotation_angle = (double) angle/180.0 * pi; 

위의 코드에서 rotation_angle 대신 angle를 사용합니다.

+0

정말 내 문제를 해결했습니다. 감사합니다 –

+0

안녕하세요, HTML5 캔버스에서이 작업을 수행하여 점을 회전하지만 단일 솔리드 모양을 만들어 '90'각도로 회전하면 이상하게 보이고 잘 회전하지 않습니다. 너 나 좀 도와 줄 수있어? 내 코드의 일부를 pastebin에 게시 할 것이다 : http://pastebin.com/MAD6JPuq 이슈 인쇄 : http://i.imgur.com/RHnzSGL.png – Hydro