2011-09-18 16 views
1

四角形のオブジェクトを描画しようとしています。四角形のオブジェクトを描画して、四角形をクリックしてサイズを変更し、四角形を二次元空間で回転させます。したがって、私は4点の配列を使用してい四角形を移動したときに四角形にとどまるように四角形を更新する

は、時計回り順に左上から左下に(3、または0、1、2)A、B、C、Dを命じました。

回転がうまくいき、中心点を計算し、その周りの各点をある角度だけ回転させます。

リサイズが押下された時点を決定することによって行われ、その後、各MouseMoveイベントにマウスの位置にその新しい位置を設定しています。隣接する2つの点は、矩形に維持されるように更新する必要があります。断続的にリサイズが機能しません。私はエラーチェックに多くの方法を試しましたが、同じ問題を私に残しています。ポイントを移動しながらマウスを前後に動かすと、ポイントが歪んでもはや長方形になりません。 HERE

ソースコード

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

抜粋問題のコードの

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

私は行列が描画のためではなく、ユーザーの入力を変換する変換を使用します。特定のポイントがクリックされたかどうかを検出できる必要があります。すべてが回転するわけではありませんが、回転角度ごとに多くのオブジェクトを持つことができます。実現する方法はありますか?私は同じ計算をやってしまうのではなく、あらかじめではなく、即座にしか飛ばされませんか? –

関連する問題