Ответ 1
Вы можете использовать любую пару координат на одной стороне для вычисления угла поворота. Обратите внимание, что математические углы обычно принимают значение 0 по длине + ve X и увеличиваются вращением против часовой стрелки (так что вдоль оси + ve Y составляет 90 °, ось X - 180 ° и т.д.).
Кроме того, функции тригонометрии javascript возвращают значения в радианах, которые должны быть преобразованы в градусы перед использованием в преобразовании CSS.
Если фигура не поворачивается более чем на 90 °, тогда жизнь довольно проста, и вы можете использовать соотношение татмет треугольника с прямым углом:
tan(angle) = length of opposite side / length of adjacent side
Для OP лучшие углы для использования - 1 и 4, так что вращение сохраняется в первом квадранте и по часовой стрелке (на черновик CSS3 spec). В условиях javascript:
var rotationRadians = Math.atan((x1 - x4) / (y1 - y4));
Чтобы преобразовать в градусы:
var RAD2DEG = 180 / Math.PI;
var rotationDegrees = rotationRadians * RAD2DEG;
Если вращение более 90 °, вам необходимо отрегулировать угол. например где угол больше 90 °, но меньше 180 °, вы получите результат из вышеизложенного и должны добавить 180 °:
rotationDegrees += 180;
Кроме того, если вы используете параметры страницы, координаты y увеличиваются по страницам, что противоположно нормальному математическому смыслу, поэтому вам нужно изменить значение y1 - y4
в приведенном выше.
Изменить
Основываясь на ориентации точек в OP, следующая функция является общей функцией для возвращения центра и вращения по часовой стрелке прямоугольника в градусах. Это все, что вам нужно, хотя вы можете поворачивать углы, чтобы "выровнять" себя, если хотите. Вы можете применить тригонометрические функции для вычисления новых углов или просто сделать некоторые средние значения (аналогичные ответам Ian).
/* General case solution for a rectangle
*
* Given coordinages of [x1, y1, x2, y2, x3, y3, x4, y4]
* where the corners are:
* top left : x1, y1
* top right : x2, y2
* bottom right: x3, y3
* bottom left : x4, y4
*
* The centre is the average top left and bottom right coords:
* center: (x1 + x3) / 2 and (y1 + y3) / 2
*
* Clockwise rotation: Math.atan((x1 - x4)/(y1 - y4)) with
* adjustment for the quadrant the angle is in.
*
* Note that if using page coordinates, y is +ve down the page which
* is the reverse of the mathematic sense so y page coordinages
* should be multiplied by -1 before being given to the function.
* (e.g. a page y of 400 should be -400).
*/
function getRotation(coords) {
// Get center as average of top left and bottom right
var center = [(coords[0] + coords[4]) / 2,
(coords[1] + coords[5]) / 2];
// Get differences top left minus bottom left
var diffs = [coords[0] - coords[6], coords[1] - coords[7]];
// Get rotation in degrees
var rotation = Math.atan(diffs[0]/diffs[1]) * 180 / Math.PI;
// Adjust for 2nd & 3rd quadrants, i.e. diff y is -ve.
if (diffs[1] < 0) {
rotation += 180;
// Adjust for 4th quadrant
// i.e. diff x is -ve, diff y is +ve
} else if (diffs[0] < 0) {
rotation += 360;
}
// return array of [[centerX, centerY], rotation];
return [center, rotation];
}