PHP Программа для постоения своеобразного графика из цифр.

Discussion in 'PHP' started by SpRyt, 18 Nov 2010.

  1. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Итак, пытаюсь сделать программу для построения графика. Есть таблица, написана на HTML (18 ячеек). в средине таблице стоит число "1". Принцип роботы программы таков: Я задаю число, через которое будет стоять "2" (то есть число ячеек от 1 (которая находится в центре экрана)) Двойка соответсвенно может распологатся и по вертикале и по горизонтали (можно её поставить сверху, снизу, справа, слева от "1". Потом ставлю число, через которое будет стоять "3" от "2" и от "1" (ну и т.д. до числа "9"). То есть должны выполнятся все условия. (например "1" от "2" распологается на растоянии "2" ячеек, "2" от "3" на растоянии 3 ячеек и на растоянии "1" ячейки от "1 " ну и т.д.). Дело в том что отсчет по ячейкам может итти и по вертикали и по горизонтали одновременно (Например: можно отсчитать 1 ячейку вправо и потом еще 3 вверх = 4 ячейки; 2 вправо 4 вниз =6 ячеек ну т.д.). Я думал просчитать все возможные варианты и просто вывести их на экран (присвоить каждой ячейке переменную ну и выводить нужный график, который уже мной просчитан, т.е. ввожу например растояние от "1" до "2" =3 от "2" до "3" =4 от "3" до "1" =2 ну и т.д. и если эти переременные (растояния) совпадают то выводится график.
    Программа пишется на РНР + НТМL.
    Я так прикинул что просчитать все возможные варианты просто нереально. (а если нужно постоить график из 50-ти чесел?)
    Так вот вопрос до вас: "Как можно облегчить задачу
    постоения такого графика?""
    ___________________________________________
    Помогите кто знает , очень нужно!
     
  2. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    135
    Reputations:
    4
    http://www.softtime.ru/info/graph.php
    правда у них на сайте в скриптах часто ошибки так что чуть что придется поковырятся
     
  3. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Спасибо, правда хоть что то ... Вопрос: Можно ли присвоить переменной растояние между двух точек на экране (тоесть ввожу растояние и мне ставит "1" и "2" на таком заданом растоянии в пикселях.) и чем можно его измерять? ну и соответственно его менять (по необходимости ну естественно через форму.)
    PS: Мне не нужно соединять эти точки (цифры) между собой, мне просто нужно их расставить в том порядке, что я задам.
     
    #3 SpRyt, 19 Nov 2010
    Last edited: 20 Nov 2010
  4. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    135
    Reputations:
    4
    я помню в javascript было что то такое. я видел один скрипт который за мышкой надпись по экрану гоняет. посмотри javascript фунцкии . и можно по onclick отправлять ajax запрос который будет загонять переменную скажем в базу. а потом по всем переменным че то там делать. если я правильно понял вопрос.
     
    #4 barnaki, 22 Nov 2010
    Last edited: 23 Nov 2010
  5. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    135
    Reputations:
    4
    посмотри функции на подобее offsetTop или offsetLeft . позиция относительно родительского элемента. если сделаешь какой нить div . а потом будешь по событию click вызывать offsetTop и offssetLeft и можно завести массив. номер точки. и ее координаты. насчет нарисовать посмотри библиотеку pChart . походу то что нужно
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SpRyt Насколько понимаю вашу задачу - у вас есть некий массив расстояний между соседними элементами и таблица, в которую надо поместить все элементы так, чтобы:

    1) расстояние между элементами было выдержано
    2) мы не вышли за пределы таблицы
    3) Не помещали новый элемент в ту ячейку, которая уже занята

    Если я угадал - то название топика должно звучать "Помогите с алгоритмом, который позволяет разместить K элементов, связанных определенным условием, в матрице M x N". И тогда вам могут помочь

    Если я не угадал - напишите подробнее, что же вам нужно
     
    _________________________
  7. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Итак, чтобы все было понятно, привожу несколько скриншотов, так сказать.....
    Таблица расстояний между элементами:

    _:1 2 3 4 5 6 7 8 9
    1 0 1 1 2 3 1 2 4 3
    2 1 0 2 3 4 2 3 5 4
    3 1 2 0 1 2 2 3 5 4
    4 2 3 1 0 1 3 4 6 5
    5 3 4 2 1 0 5 5 7 6
    6 1 2 2 3 4 0 1 3 2
    7 2 3 3 4 5 1 0 2 1
    8 4 5 5 6 7 3 2 0 1
    9 3 4 4 5 6 2 1 1 0

    "_:" добавил для того, потому что форум не обращает внимае на пробели и смещает рядки.

    И вот что получится, если это отобразить, так сказать, графиком:

    2
    1 6 7 9 8
    3
    4
    5

    (расстояние между цифрами равно 1)
    Ну а теперь обьясню: Между "1" и "2" расстояние равно 1 (ясно), между "9" и "3" равно 4 (считаем: цифра 7= раз, цифра 6 = два, цифра 1 = три, цифра 3 равно 4) ну и так дальше... Смотрите матрицу. (Этот график можно стоить по разному, крутить его на 180 градусов и т.п., можно, например ветку, что идет вправо "вывернуть" влево.)
    PS: Почти угадали, но 3 третьим пунктом я не соглашусь... То есть в одну ячейку можно присвоить (я так думаю) и 2 и 3 ...... значений (потом будет ясно,где какое число будет находятся), но нужно, чтобы расстояние было выдержано.
    PS: Надеюсь что вы поняли, если нет, скажите что.
    Помогите написать, очень прошу.
     
    #7 SpRyt, 23 Nov 2010
    Last edited: 23 Nov 2010
  8. roxblnfk

    roxblnfk Elder - Старейшина

    Joined:
    6 Feb 2010
    Messages:
    189
    Likes Received:
    42
    Reputations:
    19
    в принципе всё понятно
    но если матрица будет единичной ну или содержать хотябы больше 4-х единиц в строке? График-то двухмерный, а значит доступны только четыре связи в четырех направлениях, если это простая таблица.
    Тут надо продумать структуру графика при обработке и выводе. Советую прибегнуть к классам.
    Ещё надо решить, может ли "расстояние" в одну сторону быть не таким, как в другую, типа как:
    _:1 2 3
    1 0 1 2
    2 2 0 1
    3 1 2 0
    (тут при построени графика можно зациклиться)
    В принципе задача простая, но муторная.
     
  9. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Вполне согласен, что простая и муторная, вот и по этому прошу вашей помощи.
    Я думал рашить эту задачу так: сделал таблицу 18х18 на хтмл, каждой ячейке "присвоить" масив, ну и потом расставлять все возможные комбинации (все что может быть, а потом с помощью If else выбирать "нужные"
    PS: график строится в 2D
     
    #9 SpRyt, 24 Nov 2010
    Last edited: 3 Dec 2010
  10. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Ну помогите, кто то! Натолкните на мысль на реализацию идеи.
     
  11. roxblnfk

    roxblnfk Elder - Старейшина

    Joined:
    6 Feb 2010
    Messages:
    189
    Likes Received:
    42
    Reputations:
    19
    первое, что пришло в голову:
    - задаёшься расстоянием, по которому будешь строить график, например s=1
    - ищешь все элементы, где встречается такое расстояние (или исключаешь элементы, где его нет) и находишь "угловой" элемент, где s=1 встречается один раз
    - начинаешь от углового элемента через другие элементы двигаться к следующим элементам, расстояние до которых равно s, при этом попутно создаёшь два массива элементов
    первый: $A[$i]=$n; // $i - номер элемента, $n - сколько раз встречается элемент в графике
    второй - древовидный, для твоего примера
    ----
    2
    1 6 7 9 8
    3
    4
    5
    ----
    $B=array(
    2=>array(1=>array(6=>array(7=>array(9=>array(8=>0))),array(3=>array(4=>array(5=>0)))))
    ); // ну или заменить это классами, будет проще и удобнее

    - чтобы не зациклить выполнение скрипта, надо учесть следующее: если $n получается больше единицы, значит i-тый элемент встречается больше одного раза, значит график зациклен. Тут либо игнорируется связь, либо ставится ссылка.
    Тут же можно провести некоторые другие аналитические проверки..

    далее самое интересное - по массиву $B строится график. в нём будут свои нюансы (по расположению ветвей, стилизации..)
    тут могут помочь дополнительные функции, типа [определить максимальную длину/путь оставшейся ветви]
    тут проблем быть не должно, если имеется опыт работы с php и таблицами
     
    1 person likes this.
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SpRyt

    На питоне решение задачи выглядит так:

    http://pastebin.com/tEdPY6KZ

    Основные моменты постарался прокомментировать, поэтому можете портировать решение на пхп

    Алгоритм, к сожалению, страдает некоторыми ограничениями - все элементы результирующего "графика" должны соседствовать с другими по вертикали или горизонтали (т.е. соединения по диагонали или "оторванный" от остальной части элемент - не допускаются). Это можно проверить так - в каждой строке должен быть хотя бы один единичный элемент

    И алгоритм не распознает петли

    С первым я еще могу представить как бороться, а вот над вторым думать - лень

    З.Ы. если не большой секрет - а для чего вам это нужно?
     
    _________________________
  13. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Это и мне первое пришло в голову, я тоже так и думал сделать, но очень муторно как то.
    Посмотрим.... Будем разбиратся и пробовать...
    Раставляем числа везде, где возможно, а потом проверяем растояние (можно ли средствами ПХП?) между елементами.
    PS: дело в том, что я пообещал учительнице сделать эту программу и она соответсвенно поставит мне гуд оценку (а может и не одну), ну и за одно написать свою первую программу на пхп (именно программу).
     
    #13 SpRyt, 28 Nov 2010
    Last edited: 28 Nov 2010
  14. roxblnfk

    roxblnfk Elder - Старейшина

    Joined:
    6 Feb 2010
    Messages:
    189
    Likes Received:
    42
    Reputations:
    19
    средствами php можно всё.. или почти всё (вопос реализации) :)
    но этот метод не рационален, имхо.

    winbinder, devel studio..?
     
  15. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Думаю с девел студио будет полегче....

    Метод может не и рациональный, но на первое время сойдет. (как проверить расстояние между елементами?)
     
  16. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    а может эту матрицу загнать в двумерный массив? тогда расстояние находится путем: индекс второго - индекс первого, причем если считаешь по горизонтали, то вычитаешь индексы второго измерения, а если по вертикали - то первого.
     
  17. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Нужно будет попробовать.
     
    #17 SpRyt, 1 Dec 2010
    Last edited: 11 Dec 2010
  18. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Вот еще вопросик: можно как то узнать координаты точки(цифры) на экране, (не прибегая к ее перемещению и таким образом узнаем координаты)?
     
  19. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    В PHP есть ли функция проверки расстояния между цифрами? ( не xочу создать условие если расстояние столько то, то......, а если не, то.....) ПОМОГИТЕ МНЕ!!!
     
    #19 SpRyt, 11 Dec 2010
    Last edited: 11 Dec 2010
  20. SpRyt

    SpRyt Member

    Joined:
    18 Oct 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    5
    Ткните пальцем что скачать, от куда и в какой последовательности ставить...
    Как его запустить?
    ЗЫ: извените за тупость.
    ЗЫ: писал на пхп, получилось около 900 строк кода и это без функций. Вот мучаюсь и никак не могу разобратся как сказать пхп чтобы он упорядочил их так, чак мне нужно! ХЕЛП!!!
     
    #20 SpRyt, 11 Dec 2010
    Last edited: 11 Dec 2010