За последние 24 часа нас посетили 57833 программиста и 1683 робота. Сейчас ищут 1360 программистов ...

Построение графика на РНР

Тема в разделе "PHP для новичков", создана пользователем dm_rut, 10 дек 2016.

  1. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Код (Text):
    1. A1=Rc21: B1=w*L21
    2. A2=Rd2: B2=0
    3.   GOSUB "Сложение"
    4. V1=A3: Z1=B3
    5. A1=Rc21: B1=-1/w/C21
    6. A2=V: B2=Z1
    7.   GOSUB "Вычитание"                  
    8. Ud21=A3: E21=B3
    9. E21=E21*180/pi
    10.   "Мощность на Rd21"
    11. P21=Ud21*Ud21/Rd21
    12.  
    13. END
    14.  
    15. "Сложение"
    16. A3=A1+A2: B3=B1+B2
    17. RETURN
    18. "Вычитание"
    19. A3=A1-A2: B3=B1-B2
    20. RETURN
    Вот тот самый кусок кода.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. $сложение = '$A3=$A1+$A2; $B3=$B1+$B2;';
    2. $вычитание = '$A3=$A1-$A2; $B3=$B1-$B2;';
    3.  
    4. $A1=$Rc21;
    5. $B1=$w*$L21;
    6. $A2=$Rd2;
    7. $B2=0;
    8. eval($сложение);
    9. $V1=$A3;
    10. $Z1=$B3;
    11. $A1=$Rc21;
    12. $B1=-1/$w/$C21;
    13. $A2=$V;
    14. $B2=$Z1;
    15. eval($вычитание);              
    16. $Ud21=$A3;
    17. $E21=$B3;
    18. $E21=$E21*180/pi();
    19. echo "Мощность на Rd21: ";
    20. $P21=$Ud21*$Ud21/$Rd21;
    21. echo $P21;
     
    dm_rut нравится это.
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    @dm_rut, а теперь зацените, как бы я этот код переписал:
    Код (PHP):
    1. function sum($a1, $a2, $b1, $b2)
    2. {
    3.     return [$a1 + $a2, $b1 + $b2];
    4. }
    5.  
    6. function diff($a1, $a2, $b1, $b2)
    7. {
    8.      return [$a1 - $a2, $b1 - $b2];
    9. }
    10.  
    11. list($V1, $Z1) = sum($Rc21, $Rd2, $w * $L21, 0);
    12. list($Ud21, $E21) = diff($Rc21, $V,  -1 / $w / $C21, $V, $Z1);
    13. $E21=$E21*180 / M_PI;
    14. $P21= $Ud21* $Ud21/ $Rd21;
    Вот так вот передавать целые выражения в функцию вы в бейсике не имеете возможности. А тут, с аргументами, мне не нужно каждый раз перегонять переменные из пустого в порожнее.
     
  4. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    [vs] Будет работать Ваш вариант если алгоритм будет внутри цикла, а функции вне его?
    Что-то у меня так вообще ничего не выводится.


    В бейсике ничего никуда не передаётся. Отправляется сам алгоритм, со всеми переменными и данными имеющимися на тот момент, делает указанные в функции вычисления и возвращается обратно. Там вообще не надо думать ни о чём. Отправил - получил.
     
    #54 dm_rut, 15 дек 2016
    Последнее редактирование: 15 дек 2016
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  6. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Спасибо, всё работает.
    Можно ли функции разместить ниже алгоритма? Или надо обязательно наверху?
    Сейчас наберу весь алгоритм. Надеюсь график построится.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Но у меня строчек меньше в итоге. Ну сравнивать php с бейсиком некорректно, php всё-таки наследует синтаксис языка C с включениями из Perl и некоторых других языков. А С куда более мощный и разнообразный язык, чем бейсик.

    И [vs] специально для вас вставил eval, это по сути не функции у него, обычные строковые переменные, поэтому в этом случае обязательно наверху. стандартная функция eval выполняет содержимое строковой переменной как код. Поэтому, вообще говоря, лучше её не использовать. И на части хостингов eval может быть отключена администраторами как небезопасная.
     
  8. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Если в коде из поста 52 строчки 4 и 5, 6 и 7 и т.д. записывать в одну, то будет строчек тоже мало. А я так и записываю обычно.
    Конечно все языки разные. Но в основных моментах похожи. И даже аналог gosub-а нашёлся.

    В общем какая-то кривулина похожая на настоящую нарисовалась (ссылку выше давал), алгоритм работает и ссылки на функции соответственно тоже. Правда масштаб надо уточнить, но это мелочи. Попробую сегодня второй график пристроить.
    [vs] Спасибо!
     
    #58 dm_rut, 15 дек 2016
    Последнее редактирование: 15 дек 2016
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Нормальный аналог gosub дал вам я. [vs] посмотрел видимо на вашу реакцию на нормальные функции php, и решил: ну пусть костылём пользуется. Ещё раз, это у него не функции, это обычные строковые переменные.
    --- Добавлено ---
    В своей программе [vs] так, конечно, писать не будет, я на 100% уверен, он очень профессиональный человек.
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это был способ максимально воспроизвести алгоритм из бейсика. На php так не пишут конечно =) Преимущества функций более очевидны, когда код занимает несколько экранов. Кстати, php не интерпретируется, а компилируется при выполнении в оптимальный бинарный код, поэтому оверхеда при многократном вызове функций не возникает, а вот с eval() возникает, т.к. код, извлеченный из переменной, требует отдельной компиляции.
     
  11. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Жаль, что [vs] вообще никак не будет писать в своей программе. Во всяком случае не написал ещё до сих пор. А я написал, не без помощи, конечно. Поэтому все, когда возникнет потребность воспользоваться графическим отображением своих идей, обратятся к "неправильному" коду. А к "правильному" не обратятся, потому что не смогут найти. Соответственно применительно этой отдельно взятой задаче можно утверждать, что так, как предложено в посте 52 пишут, а так как в посте 53 - не пишут. Хотя конечно оба кода работают, я проверял.
    Дело в том, что алгоритм сложный, а случаях хитрых схем - пипец какой сложный, так ещё и единственно возможный. Поэтому там комментариев больше чем самого кода, приходится подписывать каждый блок из четырёх действий (записанный в две, либо четыре строчки), а так же каждую ссылку на формулу, указывая что конкретно с чем складывается, вычитается или ещё что-либо делает. Без комментариев элементарно запутаться, а через пару месяцев вообще будет проще всё заново построить, воспользовавшись в качестве шпаргалки кодом в бейсике. А как комментировать "правильный" код - я не представляю. Например строчка 12 что делает? Хотя с математической точки зрения всё правильно.
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    diff переводится "разница", можно было ещё назвать subtraction - вычитание, может даже было бы более правильно. И код самодокументированный. По поводу имён переменных - я так предположил, что эти же буквы используются в физике для работы с этими величинами, поэтому читающий и знакомый с предметом немного человек поймёт, что там за формулы использованы. К тому же, всегда можно посмотреть, а что делает какая функция. В современных средах разработки это два клика мыши.

    Что делает оператор list(..) поймёт любой знакомый с php человек, и догадается, что функция справа возвращает массив.
    --- Добавлено ---
    Хотя, если бы я реально решал эту задачу, я бы выносил не действия типа сложения/вычитания в отдельные функции (хотя может быть и их тоже), а именно куски, которые считают что-то конкретно физическое, т.е. функции у меня бы назывались типа "посчитать сопротивление контура", "посчитать разницу потенциалов" (от балды взял, что помнится из курса физики, что конкретно здесь происходит с точки зрения физики, я не знаю, но идея, надеюсь, ясна).

    Есть правило программирования: если код требует комментария, он должен быть вынесен в отдельную функцию.
     
  13. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Да, Вы правы. Именно эти обозначения и именно такой алгоритм используются в книгах, поэтому опасно что-либо менять. Всё равно хитросплетения кода забываются, а соответствие его учебнику позволяет легко всё распутать, взяв тот самый учебник.
    Например я всего за 5 минут составил рабочий алгоритм для схемы LC по аналогии со схемой CL, которую мы совместными усилиями тут собрали. Это потому что всё свежо в памяти. Если бы делал его через пол-года, то потратил бы 10-15 минут, добавляется время на поход к полке и поиск нужной книжки. А если бы код был бы "правильный", то не знаю справился ли.

    Теперь надо сделать выбор какая кривая будет выводиться на экран. Ссылка
    На странице такие строчки с чекбоксами:
    HTML:
    1. <input type="checkbox" name="p" value="p1">считать Р<Br>
    2. <input type="checkbox" name="e" value="e1">считать Е
    3. ......
    4. <input type="checkbox" name="p" value="p2">считать Р<Br>
    5. <input type="checkbox" name="e" value="e2">считать Е
    Среднюю схему пока пропускаем.
    Это сам код:
    PHP:
    1. Построение графика LC
    2. for (; $x <= 670; $x++)
    3. {
    4.     $f = $f * pow(2, 1 / 64);
    5.     $w = (2 * pi() * $f);
    6.  
    7. .... тут алгоритм
    8.  
    9.    $y = $Yp * $P1 * $SYp;
    10.    $ye = 182 - $E1 * $SYe;
    11.   imageSetPixel($img, 20 + $x, 600 - $y, $black);
    12.   imageSetPixel($img, 20 + $x, 600 - $ye, $black);
    13. }
    14.  
    15. Построение графика LC
    16. for (; $x <= 670; $x++)
    17. {
    18.     $f = $f * pow(2, 1 / 64);
    19.     $w = (2 * pi() * $f);
    20.  
    21. .... тут алгоритм
    22.  
    23.    $y = $Yp * $P2 * $SYp;
    24.    $ye = 182 - $E2 * $SYe;
    25.   imageSetPixel($img, 20 + $x, 600 - $y, $black);
    26.   imageSetPixel($img, 20 + $x, 600 - $ye, $black);
    27. }
    Как сделать правильно вывод imageSetPixel в зависимости от поставленной галочки?
    Надо наверно первый $y назвать $yp, чтобы было всё красиво, сделаю потом обязательно.
     
  14. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Вот этим отличается навороченный РНР от старого и примитивного бейсика. В бейсике не было возможности ставить галочки, но можно было присваивать действию либо единицу, либо ничего или любое другое значение. Перед строкой вызывающей печать прописать "IF например р1 ≠ 1 THEN GOTO мимо этой строки" или весь алгоритм пропускать. И ВСЁ! Жуткий примитив, пользуются только динозавры, но это работает. А в крутом РНР замучаться можно всё везде присваивать и назначать. И не работает потому что что-то где-то не сходится, то ли скобки не там, то ли кавычки не те, а чтобы узнать как правильно - надо идти изучать теорию.
     
    #64 dm_rut, 17 дек 2016
    Последнее редактирование: 17 дек 2016
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну вы просто для старого доброго бейсика изучили теорию :) PHP на самом деле очень простой язык для ограниченного круга задач, на нас (кто пишет только на php) другие программисты свысока, особенно какие-нибудь крутые сиплюсплюсеры :) (типа моего знакомого, который разрабатывает ПО для подводных лодок)

    Как работают чек-боксы - это надо знать особенности браузеров. Для неотмеченного чек-бокса браузер просто не передаёт параметра в запросе, так что тут PHP не причём, так работает браузер, и в любом языке нужно проверять именно, пришло ли соответствующее поле в запросе. В php это делается через операцию проверки существования:
    Код (Text):
    1.  
    2. if (isset($_REQUEST["p"])) {
    3.     // Делать то, что надо, если отмечена галочка p
    4. }
    Об этом написано в любой книге по веб-программированию
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Тру стори: у подъезда на новой хате по вечерам тусуется группа молодых людей в адидасе. По началу меня это напрягало, пока проходя мимо в очередной раз, не услышал "зашифровано в эм дэ пять".
     
  17. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Не изучал я теорию бесика - делать мне больше нечего. Достаточно было просто посмотреть как писать конкретную команду.
    В PHP так работать будет?
    PHP:
    1. //Построение графика LC
    2. for (; $x <= 670; $x++)
    3. {
    4.     $f = $f * pow(2, 1 / 64);
    5.     $w = (2 * pi() * $f);
    6.  
    7. ....  алгоритм расчёта $P2 и $E2
    8.  
    9. if (isset($_REQUEST["p2"])) {
    10.     imageSetPixel($img, 20 + $x, 600 - $Yp * $P2 * $SYp;, $black);
    11. }
    12. if (isset($_REQUEST["e2"])) {
    13.    imageSetPixel($img, 20 + $x, 300 - $E2 * $SYe;, $black);
    14. }
    15. }
    Сократил пару лишних переменных и строчек заодно.
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Должно, попробуйте. Только я бы лучше здесь сделал radio, поскольку чекбоксы можно выбрать одновременно. Ну тут я точно вашей задачи не знаю
     
  19. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Чекбоксы можно выбирать в произвольном порядке.
    Что нужно в чекбоксах добавить и что изменить в коде?
    На странице прописано так:
    HTML:
    1.   <form action="" onsubmit="return sub(this);">
    2. ... Ввод всех переменных
    3. ... чекбоксы соответствующие, например: <input type="checkbox" name="p" value="p2">считать Р
    4.   </form>
     
  20. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Совет выше не работает. Если бы была оперативная обратная связь, то возможно его можно было бы оживить, но ...
    В код ближе к началу вставил это:
    PHP:
    1. if (isset($_GET["p"]))
    2.     $p    = $_GET["p"];
    3. else
    4.     $p    = 'p1';
    В первый алгоритм это:
    PHP:
    1.  if ($p == 'p1')
    2.    {
    3.        imageSetPixel($img, 20 + $x, 600 - $Yp * $P1 * $SYp, $black);
    4.    }
    А во второй это:
    PHP:
    1.  if ($p == 'p2')
    2.    {
    3.        imageSetPixel($img, 20 + $x, 600 - $Yp * $P2 * $SYp, $black);
    4.    }
    На чекбоксы всё равно не реагирует, но хотя бы реагирует на изменение в верхнем блоке. Если там в конце стоит р1, то кривая Р1 отображается, если р2, то не отображается ни Р1 ни Р2.
    Про совет читать теорию я не забываю. Многие примеры с рекомендованного тут сайта вообще показывают ошибку при копировании их в дримвивер, остальные не дают желаемого результата. Как постигать теорию без примеров - не знаю. Мне что, читать только текст, на примеры не смотреть, а набирать самостоятельно? Пробовал: так тоже ничего не работает.
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    дримвивер - это не php, плевать что он говорит. Надо смотреть, какая версия php на сервере. Ну и плюс отладку никто не отменял. var_dump, var_export, die.
    http://phpfaq.ru/debug#debug. По двум кускам кода не могу сказать, что у вас не так. Теоретически я вам правильно рассказал, как работают чекбоксы
     
  22. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Это я читал. Что с того, что есть ошибки. Это я и так знаю. Про то, что их надо исправлять тоже знаю. И пытаюсь их исправить сегодня целый день. Ещё вчера начал. Вопрос в том: что надо прописать вокруг команды imageSetPixel чтобы её функционирование зависело от соответствующего чекбокса.
    Если кусков кода недостаточно - могу весь выложить, но это ничего не даст, там ничего относящегося к вопросу нет. Подозреваю что чего-то не хватает, узнать бы чего.
    Код с чекбоксами можно посмотреть в посте 69. Там обычная таблица, данные вводятся и работают, чекбоксы видимо нет.
    Далее есть ещё это:
    HTML:
    1. <img id="myimg" border="0" style="width:718px; height:620px;" src="script.php" alt="" />
    2.      <script type="text/javascript">
    3. function sub (f) {
    4.                 // получим значения полей ввода из формы
    5.                 var U = f.U.value;
    6.                 var L11 = f.L11.value;
    7.                 var Rl11 = f.Rl11.value;
    8.                 var C11 = f.C11.value;
    9.                 var Rd1 = f.Rd1.value;
    10. ..... и т.д.              
    11.                 // здесь нужно проверять x1-2 и y1-2 на правильность, т.е. что бы были цифрами и не были пустыми
    12.                 if ( U == "" || L11 == "" || Rl11 == "" || C11 == "" || Rd1 == "" || R21 == "" || C21 == "" || L21 == "" || Rl21 == ""|| Rd2 == "" ) {
    13.                     alert ("Заполните все поля ввода !");
    14.                     return false;
    15.                 }
    16.                
    17.                 //формируем GET запрос
    18.                 var get = "?U="+U+"&L11="+L11+"&Rl11="+Rl11+"&C11="+C11+"&Rd1="+Rd1+"&R21="+R21+"&C21="+C21+"&L21="+L21+"&Rl21="+Rl21+"&Rd2="+Rd2;
    19.                
    20.                 document.getElementById("myimg").src = "script.php"+get;
    21.                 return false;          
    22. }      
    23.      </script>
    24.  
    Это всё. Сам script выкладывал уже неоднократно (например пост 67). Таких блоков несколько, отличаются цифрами после букв в переменных, в результате получаются Р1 и Е1, Р2 и Е2 и т.д. которые и определяют где по высоте будет печататься точки кривых. Надо всего лишь дать пользователю возможность выбирать те, которые ему нужно.
    Что не так?
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну так, видите, вы же не сказали (а я на сайт не лез смотреть, ибо тоже, как вы понимаете, не бездельничаю целыми днями, отвечая здесь на вопросы), что вы строку get-запроса формируете через javascript, да ещё и вручную. jQuery вы не пользуетесь? Предлагаю включить, поскольку там есть удобная очень функция для формирования такой строки с учётом всех особенностей. С использованием jQuery строку 18 можно будет написать как
    Код (Javascript):
    1. var get = "?" + $(f).serialize()
    Просто ваша строка, сформированная вашим кодом, элементарно не содержит данных о чекбоксах никаких.

    Почитать про jQuery: http://jquery.com/
     
  24. dm_rut

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

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Подключил. Строку 18 заменил. Ничего не изменилось.
    jQuery видимо работает поскольку форма кривой графика сохранилась. Чекбоксы не функционируют как и раньше. Что ещё надо сделать?

    Это показательный пример. Если предположить, что я сам бы нашёл в какой-нибудь книжке про jQuery и подключил, то после отсутствия результата - снёс бы и вернулся к предыдущему состоянию.
    Именно так я последние два месяца изучаю теорию РНР. Перелопачено куча информации, практически ничего не работает.
     
    #74 dm_rut, 19 дек 2016
    Последнее редактирование: 19 дек 2016
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну так надо посмотреть. Дайте ссылку, где не работает, я за вас вживую посмотрю чего передаётся. Мои мозги - всё-таки не интерпретатор JavaScript.