Я должен перетащить объект из точки A в B, как это делает полоса прокрутки в Windows, проблема здесь в том, что A и B не имеют ни X, ни Y одинаково, поэтому движение горизонтальное и вертикальное в то же время - диагональ.
Я придумал простой алгоритм, который на основе позиции курсора в кадре обновляет позицию перетаскиваемого объекта. Но для этого мне нужно сделать курсор X = objectX, а затем вычислить объект Y, или наоборот. Это делает движение "менее раздражающим" для горизонтального или вертикального движения соответственно. Таким образом, если диагональ близка к горизонтальной линии, то часть с курсором X = objectX делает ее лучшим выбором, чем с курсором Y = объект Y, а для диагонали, близкой к вертикальной линии, «курсор Y = объект Y» делает ее лучшим выбором, чем другие один. Проблема здесь в том, что я должен использовать общий алгоритм для обоих типов диагоналей, потому что у меня есть звездный многоугольник , и объект должен иметь возможность перемещаться из любого угла в любой угол.
Вот код, который я написал, но он, кажется, не двигается "правильно", чтобы быть визуально правильным и менее расстраивающим для пользователя, я надеюсь, что он будет иметь больше смысла для вопроса. То, что я сделал в конце, использовал оба метода как для вертикального перемещения, так и для горизонтального и разделенного на 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;