[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Эллипс под углом
alien2006
Привет всем. Кто знает, как нарисовать эллипс под нужным углом ?
Функция imageellipse рисует ровно. Мне же нужно наклонять этот эллипс на определённый угол.



Спустя 31 минута, 37 секунд (13.11.2009 - 15:12) sergeiss написал(а):
Нарисуй поточечно, используя формулу эллипса.

Спустя 10 дней, 6 часов, 56 минут, 22 секунды (23.11.2009 - 22:09) Ulanych написал(а):
А может рисовать эллипс прямо, но в другом рисунке, вращать его с помощью функции imagerotate() а потом вставлять куда нужно?

Спустя 20 минут, 59 секунд (23.11.2009 - 22:30) sergeiss написал(а):
Ulanych - а зачем??? Нарисовать его сразу как надо будет куда проще, чем извращаться с рисованием в отдельном рисунке и с объединением рисунков.

Спустя 12 минут, 10 секунд (23.11.2009 - 22:42) Ulanych написал(а):
sergeiss - ну, возможно (я не уверен), будет меньше ресурсов жрать? Тут ведь важно с какой частотой нужно генерировать это самый эллипс и с какой точностью. Если, к примеру, допустима широкая дискретность координат точек, то да, согласен, построение по точкам будет в самый раз, а вот если нужно строить с максимально узкой дискретностью, и строить часто, то тут уже стОит подумать выборе метода рисования... Нет?

Спустя 30 минут, 23 секунды (23.11.2009 - 23:12) sergeiss написал(а):
Ulanych - насчет "дискретности координат точек" не совсем понял... Имеешь ввиду толщину линии, которая получится? Так при повороте картинки ты не сможешь ничего контролировать. А при рисовании - сможешь.
Насчет ресурсов совершенно не представляю, что будет более простым smile.gif

Но с программерской точки зрения нарисовать будет существенно проще.

Спустя 20 часов, 43 минуты, 56 секунд (24.11.2009 - 19:56) Ulanych написал(а):
Сегодня наверное попробую. О результате отчитаюсь smile.gif

Спустя 1 час, 32 минуты, 27 секунд (24.11.2009 - 21:29) Ulanych написал(а):
Вот такая байда получилась smile.gif
С коррекцией размера при повороте заморачиваться не стал, но это не проблема дописать. Таким способом, как мне кажется, эллипс (и не только) крутить очень легко. Во всяком случае такое решение имеет свою область применения.

<?php
session_start(); // стартуем сессию для отдачи соотв. рисунка соотв. пользователю
$img_for_rot_name = session_id(); // ID сессии
$img_width = 400; // Ширина рисунка
$img_height = $img_width; // Высота рисунка
$arc_width = $img_width * 0.9; // Ширина окружности
$arc_height = $arc_width * 0.6; // Высота окружности
$xc = $img_width / 2; // Координата х центра окружности
$yc = $img_height / 2; // Координата у центра окружности

$img = imagecreatetruecolor($img_width, $img_height); // Инициируем рисунок
$bgr_color = imagecolorallocate($img, 0, 0, 0); // цвет фона
imagefill($img, 0, 0, $bgr_color);

$r = rand(0, 255); // создаем случайные величины для генерации цветов
$g = rand(0, 255); // создаем случайные величины для генерации цветов
$b = rand(0, 255); // создаем случайные величины для генерации цветов

$col = imagecolorallocate($img, $r, $g, $b); // создаем цвета
imagefilledarc($img, $xc, $yc, $arc_width, $arc_height, 0, 360, $col, IMG_ARC_EDGED); // выводим сектора

$output_img_name = $img_for_rot_name.".png"; // имя файла рисунка

// Выводим рисунок в браузер

header("Content-type: image/png");
imagepng($img, $output_img_name);

// очищаем память
imagedestroy($img);

$rot_img = imagecreatefrompng($output_img_name);

session_start();
// пробуем крутить
$degress = 32; // угол поворота
$bgd_color = imagecolorallocate($rot_img, 0, 0, 0); // цвет заливки "оголенных" участков
$rotated_img = imagerotate($rot_img, $degress, $bgd_color); // крутим

$img_rotated_name = session_id().'rotated'.'.png'; // имя повернутого файла

// Выводим рисунок в браузер

header("Content-type: image/png");
imagepng($rotated_img);
// очищаем память
imagedestroy($rotated_img);

unlink ($output_img_name); // удаляем созданные файлы, если нужно, конечно
unlink ($img_rotated_name); // удаляем созданные файлы, если нужно, конечно
?>


Спустя 8 минут, 2 секунды (24.11.2009 - 21:37) vasa_c написал(а):

Спустя 4 минуты, 32 секунды (24.11.2009 - 21:41) sergeiss написал(а):
Ulanych - я чегой-то недопонял, нафига ты многократно создаешь-пересоздаешь-записываешь картинку, многократно открываешь сессию...
И ты вообще проверял свой скрипт? У меня что-то "есть подозрение" smile.gif, что он не будет работать. Либо выдаст что-то непредсказуемое.

А самое главное - ты опять говоришь про отдельно взятый эллипс! А попробуй так его "покрутить", если тебе надо наложить повернутый эллипс на другую картинку?

Спустя 1 час, 17 минут, 11 секунд (24.11.2009 - 22:58) Ulanych написал(а):
sergeiss - С чего такое недоверие к работоспособности? wink.gif
Работать будет, никуда не денется. Пересоздаю и перезаписываю не многократно, а один раз создаю, второй раз пересоздаю. Дело в том, что изначально созданную картинку функция imagerotate() крутить почему-то не хочет. Выводится не повернутый эллипс. Почему я так и не понял.
Да, я показал отдельно взятый, ни к чему не привязанный эллипс. Вопрос звучал про "эллипс под нужным углом" - их есть у меня! smile.gif
По второму замечанию - это на счет "если тебе надо наложить повернутый эллипс на другую картинку", то можно воспользоваться параметрами прозрачности, например. Т.е. также сгенерировать несколько эллипсов с прозрачными фонами и наложить из один на другой или на другую картинку, что-то типа ватермарков.
И естественно я не против идеи построения эллипса по формуле эллипса, но вот только я не совсем понимаю вот что:
Говоря строго математически, отвлеченно от программирования на PHP, Эллипс является геометрическим местом точек, для которых сумма расстояний от двух заданных точек (фокусов) есть величина постоянная. Также можно вспомнить и каноническое уравнение эллипса, которое записывается так: (x^2)/(a^2)+(y^2)/(b^2)=1, где a и b половины большой и малой осей соответственно.
Возвращаясь к программированию, само собой напрашивается, что мы должны писать цикл, который будет строить точки (отрезки прямых, окрашивать пиксели), из которых сформируется эллипс, с определенным шагом, иными словами с некоторой дискретностью. Если мы зададим шаг прохода по циклу равным 1 (единице), т.е. одному пикселю, то для построения эллипса 100*200 пикселей c заливкой и площадью соответственно S=(ПИ)*a*b = 3.1415*50*100 = 15708 (примерно) пикселей, нам придется выполнить 15708 итераций.
Иля я че-то перемудрил у себя в голове? sergeiss, объясни, будь человеком! wink.gif

Спустя 9 часов, 51 минута, 31 секунда (25.11.2009 - 08:50) sergeiss написал(а):
А какая разница, сколько итераций тебе придется выполнить? Если ты пользуешься командами ПХП, то те же итерации выполняются.
Поэтому, если ты сначала строишь "обычный" эллипс, а потом его поворачиваешь, то ты сначала выполняешь все те же итерации, а затем еще выполняешь дополнительные (лишние!!!) действия по развороту фигуры.
Если нужно нарисовать эллипс на другом рисунке (графике), то при твоей методе ты сначала сделашь кучу действий (в т.ч. и ненужных), а затем еще будешь объединять картинки.
А если же рисовать напрямую, то рисовать будем сразу же на конечной картинке, не выполняя лишних (синоним - ненужных) операций.

Спустя 2 часа, 13 минут, 48 секунд (25.11.2009 - 11:04) Ulanych написал(а):
Ок. Согласен. smile.gif Уговорил. Осталось только написать стартовавшему тему КАК построить эллипс, да еще и под нужным углом, используя математику, а не встроенные функции smile.gif

Спустя 39 минут, 48 секунд (25.11.2009 - 11:44) sergeiss написал(а):
Цитата (Ulanych @ 25.11.2009 - 12:04)
Осталось только написать стартовавшему тему КАК...

Если он не спрашивает об этом, то либо сам знает, либо ему это уже не нужно biggrin.gif

Спустя 1 год, 3 месяца, 16 дней, 12 часов, 14 минут, 21 секунда (11.03.2011 - 23:58) Гость_Define написал(а):
а вы не подскажите как вращать эллипс в прологе?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.