Как повернуть (любой градус) объект ImageData и получить новый «повернутый» массив ImagaData.data - PullRequest
0 голосов
/ 08 октября 2019

У меня есть объект imageData, содержащий данные высот, закодированные в rgba. Мне нужно вычислить профиль высоты по указанному заголовку. Для линии шириной в один пиксель и заголовка на север это легко, так как это всего лишь столбец массива imagaData. Для заданной степени это также легко, так как это требует простой тригонометрии для вычисления x, y позиции в массиве, однако мое требование более сложное. Фактически мне нужно вычислить профиль высоты (максимальные значения) для полосы шириной более 1 пикселя, поэтому мне нужно повернуть все данные изображения.

Короче говоря, мне нужно:

1) обрезать изображение для работы с более мелкими данными (например, центрированная половина исходного изображения) - важна производительность

2) вращать по центру обрезанное изображение для указанной степени, поэтому мне потребуются данные о высотев верхнем положении в таблице.

3) Сканирование данных профиля высот, необработанных по лучам и вычисление максимального значения возвышения для каждой строки.

Поскольку эту операцию необходимо вычислять несколько раз в секунду,Мне нужно оптимизированное решение. Я попытался с преобразованием / вращением контекста холста, однако объект imageData не изменился, поэтому я думаю, мне нужно было бы сохранить изображение контекста (повернутое) в другой объект изображения, но я не уверен, как.

любой намек более чем приветствуется

1 Ответ

0 голосов
/ 09 октября 2019

Я решил сделать математику сам, так как мне нужно только повернуть часть изображения. Эта функция вращает по часовой стрелке одну точку (p) вокруг (r) на угол (в радианах)

function rotate(p, r, angle) // angle in radians, clockwise
{
var new_p = new Object();

// shortened calculation
new_p.x = Math.round(r.x + ((p.x - r.x)*Math.cos(angle) - (p.y - r.y)*Math.sin(angle)));
new_p.y = Math.round(r.y + ((p.x - r.x)*Math.sin(angle) + (p.y - r.y)*Math.cos(angle)));

return new_p;
}

тест, вращение (0,0) на 90 градусов

var test_p = rotate({ x:0, y:0 },{x:400,y:400},Math.PI/2)

результат

{x: 800, y: 0}
...