Вот три функции из моих библиотек с открытым исходным кодом. Функции полностью протестированы в Java, но формулы могут быть легко переведены на любой язык.
Подписи:
публичный статический метод с плавающей точкой getAngleFromPoint (конечная точка centerPoint, конечная точка touchPoint)
общедоступное статическое значение с плавающей точкой getTwoFingerDistance (сначала с плавающей точкой TouchX, с плавающей точкой firstTouchY, с плавающей точкой secondTouchX, с плавающей точкой secondTouchY)
Точка getPointFromAngle (конечный двойной угол, конечный двойной радиус)
В этом решении предполагается, что плотность пикселей равномерно распределена.
Перед вращением объекта сделайте следующее:
Используйте getAngleFromPoint для вычисления угла от центра к верхнему правому углу (допустим, это возвращает 20 градусов), означая, что левый верхний угол составляет -20 градусов или 340 градусов.
Используйте getTwoFingerDistance для возврата диагонального расстояния между центральной точкой и верхним правым углом (это расстояние должно быть одинаково одинаковым для всех углов. Это расстояние будет использовано в следующем расчете).
Теперь допустим, что мы поворачиваем объект по часовой стрелке на 30 градусов. Теперь мы знаем, что верхний правый угол должен находиться под углом 50 градусов, а верхний левый угол - под углом 10 градусов.
Теперь вы сможете использовать функцию getPointFromAngle в верхнем левом и правом верхнем углу. используя радиус, возвращенный из шага 2.
Позиция X, умноженная на 2 в верхнем правом углу, должна дать вам новую ширину, а позиция Y, умноженная на 2 в верхнем левом углу, должна дать новую высоту.
Указанные выше 4 шага должны быть приведены в условия, основанные на том, как далеко вы повернули ваш объект, в противном случае вы можете возвратить высоту как ширину, а ширину как высоту.
Примите во внимание, что функции угла выражаются в коэффициентах 0-1 вместо 0-360 (просто умножьте или разделите на 360, где это необходимо):
// Получает угол из двух точек, выраженный с коэффициентом 0 -1 (0 - 0/360, 0,25 - 90 градусов и т. Д.)
public float getAngleFromPoint(final Point centerPoint, final Point touchPoint) {
float returnVal = 0;
//+0 - 0.5
if(touchPoint.x > centerPoint.x) {
returnVal = (float) (Math.atan2((touchPoint.x - centerPoint.x), (centerPoint.y - touchPoint.y)) * 0.5 / Math.PI);
}
//+0.5
else if(touchPoint.x < centerPoint.x) {
returnVal = (float) (1 - (Math.atan2((centerPoint.x - touchPoint.x), (centerPoint.y - touchPoint.y)) * 0.5 / Math.PI));
}//End if(touchPoint.x > centerPoint.x)
return returnVal;
}
// Измеряет диагональное расстояние между двумя точками
public float getTwoFingerDistance(final float firstTouchX, final float firstTouchY, final float secondTouchX, final float secondTouchY) {
float pinchDistanceX = 0;
float pinchDistanceY = 0;
if(firstTouchX > secondTouchX) {
pinchDistanceX = Math.abs(secondTouchX - firstTouchX);
}
else if(firstTouchX < secondTouchX) {
pinchDistanceX = Math.abs(firstTouchX - secondTouchX);
}//End if(firstTouchX > secondTouchX)
if(firstTouchY > secondTouchY) {
pinchDistanceY = Math.abs(secondTouchY - firstTouchY);
}
else if(firstTouchY < secondTouchY) {
pinchDistanceY = Math.abs(firstTouchY - secondTouchY);
}//End if(firstTouchY > secondTouchY)
if(pinchDistanceX == 0 && pinchDistanceY == 0) {
return 0;
}
else {
pinchDistanceX = (pinchDistanceX * pinchDistanceX);
pinchDistanceY = (pinchDistanceY * pinchDistanceY);
return (float) Math.abs(Math.sqrt(pinchDistanceX + pinchDistanceY));
}//End if(pinchDistanceX == 0 && pinchDistanceY == 0)
}
// Получить координаты XY из угла, заданного радиусом (угол выражается с коэффициентом 0-1 0, равным 0/360 градусов, и 0,75, равным 270 и т. Д.)
public Point getPointFromAngle(final double angle, final double radius) {
final Point coords = new Point();
coords.x = (int) (radius * Math.sin((angle) * 2 * Math.PI));
coords.y = (int) -(radius * Math.cos((angle) * 2 * Math.PI));
return coords;
}
Эти фрагменты кода взяты из моих библиотек с открытым исходным кодом: https://bitbucket.org/warwick/hgdialrepo и https://bitbucket.org/warwick/hacergestov2.
Одна - это библиотека жестов для Android, а другая - управление циферблатом для Android. Существует также реализация OpenGLES 2.0 для управления набором по адресу: https://bitbucket.org/warwick/hggldial