За последние 24 часа нас посетили 54376 программистов и 1777 роботов. Сейчас ищут 1044 программиста ...

Поворот линии в GD

Тема в разделе "PHP для новичков", создана пользователем ctekjlo, 27 июн 2009.

  1. ctekjlo

    ctekjlo Активный пользователь

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    Если это не реально подскажите как сделать это на cos'усах и sin'усах :oops: например если добавить параметр градусов.
    PHP:
    1. <?php
    2.     $Image = ImageCreateTrueColor(300, 300);
    3.  
    4.     $ColorBlack = ImageColorAllocate($Image, 0, 0, 0);
    5.     $ColorGrey  = ImageColorAllocate($Image, 240, 240, 240);
    6.  
    7.     ImageFilledRectangle($Image, 0, 0, 300, 300, $ColorGrey);
    8.  
    9.     //Можно ли повернуть эту линию
    10.     ImageLine($Image, 10, 10, 100, 10, $ColorBlack);
    11.  
    12.     header('Content-type: image/png');
    13.     ImagePNG($Image);
    14.     ImageDestroy($Image);
    15. ?>
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Косусы? Может косинусы?
    А зачем, косинус-то тут причем?
    Мы же не рисуем косинусойду (или рисуем), тогда где период?
    Что надо вообще?
     
  3. ctekjlo

    ctekjlo Активный пользователь

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    Например есть линия
    x1 - 0
    y1 - 0
    x2 - 100
    y2 - 0
    Эта линия смотрит направо а как ее повернуть на 5 градусов чтобы примерно было
    x1 - 0
    y1 - 0
    x2 - 100
    y2 - 10
    без математики я думаю тут не обойтись.

    Я просто думал что можно сделать что то похожее на это
    PHP:
    1. <?php
    2.     $mySprite = ImageLine($Image, 0, 0, 100, 50, $ColorBlack);
    3.     $rotate = imagerotate($mySprite, 180, 0);
    4. ?>
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    В принципе всё просто.
    Если знаете математику, проблем не будет, если не знаете - уж извините, мало чем смогу помочь.
    Объясняю, как это делается:

    Представим себе прямоугольный треугольник, угол гамма которого всегда равен 90 градусам.
    Начальный угол альфа нам известен, для примера, обозначим его как 20 градусов.
    Далее, длина этой прямой линии - это гипотенуза треугольника.
    Всё, на этом известная нам информация заканчивается.

    Мы хотим повернуть линию (тобиш гипотенузу) подняв её на 5 градусов, для этого нам надо вычислить высоту стороны B, при этом надо учитывать, что после того, как угол бэта будет равен 90 градусам, произойдет смещение нашей прямой как катет А, а гипотенуза образует сторону C, которая является противолежащей.

    Теперь, допустим, как я сказал выше, угол альфа = 20 градусам.
    Как нам вычислить высоту стороны В?
    Попробуем воспользоваться теоремой синусов:

    b/sin(betta) = c/sin(gamma)
    Теперь: мы знаем, что сумма всех стором прямоугольного треугольника равна 180 градусам, значит:

    180 - (90 + 20) = 70 градусов.
    Подставим в формулу выше и получим синус стороны бета, переведем и округлим его в градусы.
    Далее с точностью до наоборот мы прибавим градусы к стороне B и увеличим высоту сторону B на х предварительно убедившись, что угол бета < 90 градусов.

    Всё понятно?
     
  5. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Если мне ВДРУУУГ не будет лень, то я сделаю чертеж того, что написал выше.
    Там, в принципе, всё очень просто.
    Нужно уметь решать треугольники и знать некоторые тождества и соотношения, а так просто всё.
     
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    [​IMG]


    Вот, тут уже вопросов возникать не должно.
    Я даже соотношение внизу приписал, думаю наглядней быть не может.
    Разбирайтесь. :)
     
  7. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Apple, ух ты! В чём рисовал? :)
     
  8. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Photoshop (есть такой там инструмент — Pen) :)
     
  9. ctekjlo

    ctekjlo Активный пользователь

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    а можешь книги посоветовать по этой теме а то я ни чего не понял :oops:

    :idea: Кстати проблему решил более простым путем спасибо за намек про photoshop хоть и косвенный :roll:
     
  10. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Учебники по геометрии за 7-11 класс.
     
  11. ctekjlo

    ctekjlo Активный пользователь

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    ок порою
     
  12. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    У нас - в Эстонии - этот материал проходят в 10 классе, там же основные тригонометрические тождества.
    В 12 классе идут матричные преобразования, коллинеарность — тоже очень полезная тема при программировании.
    Я не знаю как у вас, у нас рыть в учебниках 9 - 10 класса, и обязательно знать свойства пропорций (6 класс) - ОБЯЗАТЕЛЬНО.
    Пропорции - это фундаментальное понятие для множества вычислений.
    Даже дробное уравнение можно свести к пропорции, где левая часть равна х/1 = уравнение
     
  13. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    x:=cos(a)*x1+sin(a)*y1;
    y:=sin(a)*x1-cos(a)*y1;
    получишь проекцию точки с координатами (x1,y1) после поворота на угол "a" (я хз как ориентированны полуплоскости в php, потому внизу минус, а сверху плюс, немного экспериментов помогут).

    Либо воспользовавшись советом apple (так и тянет сказать "яблока" %) ) перенести систему координат на начало линии, повернуть ее одной точкой и перенести обратно.

    если попиксельно - можно воспользоваться алгоритмом Брезенхема, но чет мне кажется на GD это несколько тормознуто будет выглядеть :)
     
  14. ctekjlo

    ctekjlo Активный пользователь

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    Жуть :roll: Но красиво.
    Для запуска нужно создать клип в первом кадре с именем mc_line и кинуть этот код в первый кадр главной сцены.

    [js]var a:Number = 0;
    var x1:Number = 0;
    var y1:Number = 100;
    var x2:Number = 0;
    var y2:Number = 0;
    //настройки линии
    //ширина линии, цвет, прозрачность
    mc_line.graphics.lineStyle(1, 0x000000, 0.1);
    //типо вечного цикла во flash
    function enterFrame(event:Event):void {
    a += 0.1;
    x2 = Math.cos(a) * x1 + Math.sin(a) * y1;
    y2 = Math.sin(a) * x1 - Math.cos(a) * y1;
    //рисует странную воронку
    mc_line.graphics.moveTo(x1,y2);
    mc_line.graphics.lineTo(x2,y1);
    //рисует странный треугольник с закругленными сторонами
    mc_line.graphics.moveTo(x1,y1);
    mc_line.graphics.lineTo(x2,y2);
    }
    //добавить событие к кадру
    addEventListener(Event.ENTER_FRAME, enterFrame);[/js]
     
  15. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    формула что я дал - общая. Она позволяет повернуть линию вокруг центра координат, но не повернуть линию вокруг одного конца (т.е. как бы позволяет - частный случай: когда система координат находится на конце линии, что я и говорил про перенос системы координат). И как я говорил, я хз как располагаются полупроскости в пхп и что принимает косинус - радианы или градусы (в дельфи радианы, отсчет от 0 градусов по часовой стрелке, т.е. перевернута вниз)