2

Windowsでスクロールバーが行うように、オブジェクトをポイントAからBにドラッグする必要があります。ここでの問題は、AとBにはXもYも同じではないため、移動は同時に水平と垂直になります。 - 対角線。

フレーム内のカーソル位置に基づいて、ドラッグするオブジェクトの位置を更新する単純なアルゴリズムを思いつきました。しかし、そのためには、cursorX=objectX を作成して、objectY を計算するか、その逆にする必要があります。これにより、水平方向の移動または垂直方向の移動で、それぞれ「ストレスが少なく」なります。したがって、対角線が水平線に近い場合は、cursorY=objectY よりも、cursorX=objectX の部分の方が適しています。 1。ここでの問題は、両方のタイプの対角線に一般的なアルゴリズムを使用する必要があることです。これは、スター ポリゴンがあり、オブジェクトが任意のコーナーから任意のコーナーに移動できる必要があるためです。

これが私が書いたコードですが、見た目が正しく、ユーザーのイライラが少ないため、「正しく」動いているようには見えません。私が最後にしたことは、垂直移動と水平移動の両方の方法を使用し、2 で除算したため、誰もが満足していますが、うまくいきませんでした。

//calculating with x priority
D3DXVECTOR2 resultPosX;

resultPosX.x=nextMousePos.x;

//firstCornerPos and secondCornerPos are the edges of a segment 
//on wich the object has to move
resultPosX.y=prevObjPos.y+(nextMousePos.x-prevObjPos.x)*(secondCornerPos.y-firstCornerPos.y)/(secondCornerPos.x-firstCornerPos.x);

//calculating with y priority
D3DXVECTOR2 resultPosY;

resultPosY.y=nextMousePos.y;

resultPosY.x=prevObjPos.x+(nextMousePos.y-prevObjPos.y)*(secondCornerPos.x-firstCornerPos.x)/(secondCornerPos.y-firstCornerPos.y);

//calculating the average result
resultPos.x=(resultPosX.x+resultPosY.x)/2;
resultPos.y=(resultPosX.y+resultPosY.y)/2;
4

0 に答える 0