Если это не реально подскажите как сделать это на cos'усах и sin'усах например если добавить параметр градусов. PHP: <?php $Image = ImageCreateTrueColor(300, 300); $ColorBlack = ImageColorAllocate($Image, 0, 0, 0); $ColorGrey = ImageColorAllocate($Image, 240, 240, 240); ImageFilledRectangle($Image, 0, 0, 300, 300, $ColorGrey); //Можно ли повернуть эту линию ImageLine($Image, 10, 10, 100, 10, $ColorBlack); header('Content-type: image/png'); ImagePNG($Image); ImageDestroy($Image); ?>
Косусы? Может косинусы? А зачем, косинус-то тут причем? Мы же не рисуем косинусойду (или рисуем), тогда где период? Что надо вообще?
Например есть линия x1 - 0 y1 - 0 x2 - 100 y2 - 0 Эта линия смотрит направо а как ее повернуть на 5 градусов чтобы примерно было x1 - 0 y1 - 0 x2 - 100 y2 - 10 без математики я думаю тут не обойтись. Я просто думал что можно сделать что то похожее на это PHP: <?php $mySprite = ImageLine($Image, 0, 0, 100, 50, $ColorBlack); $rotate = imagerotate($mySprite, 180, 0); ?>
В принципе всё просто. Если знаете математику, проблем не будет, если не знаете - уж извините, мало чем смогу помочь. Объясняю, как это делается: Представим себе прямоугольный треугольник, угол гамма которого всегда равен 90 градусам. Начальный угол альфа нам известен, для примера, обозначим его как 20 градусов. Далее, длина этой прямой линии - это гипотенуза треугольника. Всё, на этом известная нам информация заканчивается. Мы хотим повернуть линию (тобиш гипотенузу) подняв её на 5 градусов, для этого нам надо вычислить высоту стороны B, при этом надо учитывать, что после того, как угол бэта будет равен 90 градусам, произойдет смещение нашей прямой как катет А, а гипотенуза образует сторону C, которая является противолежащей. Теперь, допустим, как я сказал выше, угол альфа = 20 градусам. Как нам вычислить высоту стороны В? Попробуем воспользоваться теоремой синусов: b/sin(betta) = c/sin(gamma) Теперь: мы знаем, что сумма всех стором прямоугольного треугольника равна 180 градусам, значит: 180 - (90 + 20) = 70 градусов. Подставим в формулу выше и получим синус стороны бета, переведем и округлим его в градусы. Далее с точностью до наоборот мы прибавим градусы к стороне B и увеличим высоту сторону B на х предварительно убедившись, что угол бета < 90 градусов. Всё понятно?
Если мне ВДРУУУГ не будет лень, то я сделаю чертеж того, что написал выше. Там, в принципе, всё очень просто. Нужно уметь решать треугольники и знать некоторые тождества и соотношения, а так просто всё.
Вот, тут уже вопросов возникать не должно. Я даже соотношение внизу приписал, думаю наглядней быть не может. Разбирайтесь.
а можешь книги посоветовать по этой теме а то я ни чего не понял :idea: Кстати проблему решил более простым путем спасибо за намек про photoshop хоть и косвенный :roll:
У нас - в Эстонии - этот материал проходят в 10 классе, там же основные тригонометрические тождества. В 12 классе идут матричные преобразования, коллинеарность — тоже очень полезная тема при программировании. Я не знаю как у вас, у нас рыть в учебниках 9 - 10 класса, и обязательно знать свойства пропорций (6 класс) - ОБЯЗАТЕЛЬНО. Пропорции - это фундаментальное понятие для множества вычислений. Даже дробное уравнение можно свести к пропорции, где левая часть равна х/1 = уравнение
x:=cos(a)*x1+sin(a)*y1; y:=sin(a)*x1-cos(a)*y1; получишь проекцию точки с координатами (x1,y1) после поворота на угол "a" (я хз как ориентированны полуплоскости в php, потому внизу минус, а сверху плюс, немного экспериментов помогут). Либо воспользовавшись советом apple (так и тянет сказать "яблока" %) ) перенести систему координат на начало линии, повернуть ее одной точкой и перенести обратно. если попиксельно - можно воспользоваться алгоритмом Брезенхема, но чет мне кажется на GD это несколько тормознуто будет выглядеть
Жуть :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]
формула что я дал - общая. Она позволяет повернуть линию вокруг центра координат, но не повернуть линию вокруг одного конца (т.е. как бы позволяет - частный случай: когда система координат находится на конце линии, что я и говорил про перенос системы координат). И как я говорил, я хз как располагаются полупроскости в пхп и что принимает косинус - радианы или градусы (в дельфи радианы, отсчет от 0 градусов по часовой стрелке, т.е. перевернута вниз)