Используйте матрицу вращения.Этот код переместится из точки (x, y) с помощью тета-радианов в новую точку (px, px)
Point Rotate(x, y, theta)
int px = (x * Math.Cos(theta)) - (y * Math.Sin(theta));
int py = (y * Math.Cos(theta)) + (x * Math.Sin(theta));
return new Point(px, py);
end
Матрица, использованная выше,
[cosθ - sinθ][x]
[cosθ + sinθ][y]
Переместитпри использовании графических координат указывайте вокруг круга по часовой стрелке.
На прошлой неделе я делал то же самое.Вы можете анимировать это, найдя общую тета, которую вы хотите переместить, а затем разделите ее на количество кадров (или шагов).Теперь начинайте каждое движение в некоторой произвольной точке (например, (0, радиус)), увеличивайте счетчик totalSteps и двигайтесь всегда начиная с этой начальной точки .Если вы просто перемещаете саму точку в каждом кадре, вы накапливаете некоторую ошибку, но если вы всегда двигаетесь от начальной точки с текущим шагом, останавливаясь при увеличении == totalTheta, это будет идеально.Дайте мне знать, если это имеет смысл.
Может быть, я должен проиллюстрировать немного больше.Допустим, у вас есть метод "BeginMove":
double totalTheta = 0;
double increment = 0;
double currentTheta = 0;
bool moving = false;
void BeginMove()
{
totalTheta = (2 * Math.PI) / numObjects;
increment = totalTheta / steps;
currentTheta = 0;
moving = true;
}
Теперь у вас есть метод, который обновляет ход в каждом кадре:
void Update
{
if (!moving) return;
// do a min/max to ensure that you never pass totalTheta when incrementing.
// there will be more error handling, but this is the basic idea.
currentTheta += increment;
SomeObject.Location = Rotate(0, radius, currentTheta);
moving = (currentTheta < totalTheta);
}
Очевидно, здесь будет больше логики в зависимости от вашегоТочная ситуация, но идея такова:
- Найдите общее количество тета для перемещения.
- Найдите приращение (totalTheta / шаги)
- Поддержите промежуточный итог того, какНа сколько вы уже продвинулись.
- Увеличивайте промежуточную сумму на угол приращения перед каждым движением.
- Начинайте каждое движение с одной и той же (произвольной) точки на круге и поворачивайте на общую сумму.
- Повторять до тех пор, пока итоговая сумма не будет == итого тета.