2011-09-18 4 views
1

사용자가 사각형 점을 클릭하여 크기를 변경하고 직사각형을 2D 공간에서 회전 할 수 있도록합니다.사각형이 움직일 때 사각형 모양으로 유지되도록 4 점 업데이트

따라서 시계 방향으로 왼쪽에서 왼쪽으로 순서대로 A, B, C, D (또는 0, 1, 2, 3) 순으로 배열 된 4 개의 점 배열을 사용하고 있습니다.

회전이 잘 작동하고, 중심점을 계산하고 각 점을 각도로 회전시킵니다.

크기 조정은 어떤 지점을 눌렀는지 확인한 다음 각 MouseMove 이벤트에서 새 위치를 마우스의 위치로 설정하여 수행됩니다. 인접한 두 점은 사각형 모양을 유지하기 위해 업데이트해야합니다. 크기 조정이 간헐적으로 작동하지 않습니다. 여러 가지 방법으로 오류 검사를 시도했지만 동일한 문제가 발생합니다. 포인터를 이동하는 동안 반대 지점에서 마우스를 앞뒤로 움직이면 점이 왜곡되고 더 이상 직사각형이 아닙니다. 여기

소스 코드

https://www.assembla.com/code/moozhe-testing/subversion/nodes/rotateRectangle

EXERPT 문제 코드의

private void MovePoint(int id, PointF newPoint) 
{ 
    PointF oldPoint = points[id]; 
    PointF delta = newPoint.Substract(oldPoint); 

    PointF pointPrevious = points[(id + 3) % 4]; 
    PointF pointNext = points[(id + 1) % 4]; 

    PointF sidePrevious = pointPrevious.Substract(oldPoint); 
    PointF sideNext = pointNext.Substract(oldPoint); 

    PointF previousProjection = Projection(delta, sidePrevious); 
    PointF nextProjection = Projection(delta, sideNext); 

    pointNext = pointNext.AddPoints(previousProjection); 
    pointPrevious = pointPrevious.AddPoints(nextProjection); 

    points[(id + 3) % 4] = pointPrevious; 
    points[(id + 1) % 4] = pointNext; 
    points[id] = newPoint; 
} 

private PointF Projection(PointF vectorA, PointF vectorB) 
{ 
    PointF vectorBUnit = new PointF(vectorB.X, vectorB.Y); 
    vectorBUnit = vectorBUnit.Normalize(); 

    float dotProduct = vectorA.X * vectorBUnit.X + vectorA.Y * vectorBUnit.Y; 
    return vectorBUnit.MultiplyByDecimal(dotProduct); 
} 

답변

0

그것은 당신이 대신 X/Y를 업데이트하는 변환 행렬을 사용 할 수 있습니다 같은 소리 수동으로 좌표를 지정하십시오.

http://www.bobpowell.net/mappingmodes.htm

여기 MSDN 기준이다 :

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.transform.aspx

+0

I는 행렬 드로잉 변환 아니라 사용자 입력 변환 사용할 링크를 확인해주십시오. 특정 지점을 클릭했는지 감지 할 수 있어야합니다. 모든 것이 회전되지는 않을 것이고, 각각의 회전 각으로 많은 객체를 가질 수 있습니다. 그럴 수있는 방법이 있습니까? 내가 대신 같은 수학을하기 위해 끝나지 않고, 미리 비행 중일 뿐이니? –

관련 문제