Как найти новые координаты точки при повороте изображения PHP-функцией imagerotate()

К примеру есть исходное изображение map.jpg с наложенной через HTML подсказкой в точке с координатами 414;239:

<div class="map">
	<img src="https://snipp.ru/demo/784/map.jpg" alt="">
	<div class="tooltip" style="position: absolute; left: 414px; top: 239px;">
		x=414<br>y=239
	</div>
</div>
HTML

Далее изображение поворачивается с помощью PHP-функции imagerotate() на 15 градусов против часовой стрелки и нужно определить новые координаты точки чтобы переместить подсказку.

Итак, у функции imagerotate() осью вращения является центр изображения. После поворота размеры холста изображения могут увеличится в зависимости от угла поворота и формы изображения (квадратное или прямоугольное) и это нужно учесть.

Для нахождения новых координат можно применить формулу:

x1 = (x - xo) * cos(α) - (y - yo) * sin(α) + xo
y1 = (x - xo) * sin(α) + (y - yo) * cos(α) + yo

Где:
x, y – начальная точка,
xo, yo – точка оси вращения,
α – угол поворота по часовой стрелки в радианах.

Повернём изображение и рассчитаем новые координаты:

$deg = 15;			
$img = imageCreateFromJpeg(__DIR__ . '/map.jpg');
$bg = imagecolorallocate($img, 255, 255, 255);
$new = imagerotate($img, $deg, $bg);
imageJpeg($new, __DIR__ . '/rotate.jpg');

// Вычисление новых координат точки
$x = 414;
$y = 239;

$width = imagesx($img);
$height = imagesy($img);

$xo = $width / 2;
$yo = $height / 2;

$deg_rad = deg2rad(-$deg);

$x_new = ($x - $xo) * cos($deg_rad) - ($y - $yo) * sin($deg_rad) + $xo;
$y_new = ($x - $xo) * sin($deg_rad) + ($y - $yo) * cos($deg_rad) + $yo;			

// Поправка координат на новые размеры изображения
$width_new = imagesx($new);
$height_new = imagesy($new);

$x_new += ($width_new - $width) / 2;
$y_new += ($height_new - $height) / 2;

// Округление
$x_new = round($x_new);
$y_new = round($y_new);
PHP

Теперь можно вывести изображение и подсказку в новых координатах:

<div class="map">
	<img src="https://snipp.ru/demo/784/rotate.jpg" alt="">
	<div class="tooltip" style="left: <?php echo $x_new; ?>px; top: <?php echo $y_new; ?>px;">
		x=<?php echo $x_new; ?><br>y=<?php echo $y_new; ?>
	</div>
</div>
HTML

Результат:

15.04.2022
2295
Предыдущая запись POST-запрос через file_get_content()

Комментарии

, чтобы добавить комментарий.

Другие публикации

Преобразование цветов в PHP
Несколько примеров как перевести цвета из HEX в RGB и обратно с помощью PHP.
16697
-1
Изображения WebP в GD PHP
WebP – формат сжатия изображений, разработанный Google. Имеет более меньший размер файла по сравнению с JPG, но не поддерживается продуктами Apple.
20154
+7
PHP-класс для создания миниатюр изображений
PHP Thumb – это библиотека, основанная на PHP GD и предназначена для создания превью изображений для каталогов, товаров...
52098
+14
Поворот изображения по двум точкам на PHP GD + jQuery UI Droppable
​Задача - необходимо повернуть изображение на угол, найденный путем выставления двух точек на линию горизонта...
2238
0
Как нарисовать точку в PHP GD
Примеры, как нарисовать точку в библиотеке PHP GD.
2278
+1
Рисование линий в PHP GD
Примеры использования функций библиотеки GD для рисования линий.
3353
0