Author Topic: перемешивание координат  (Read 2860 times)

0 Members and 1 Guest are viewing this topic.

garr24

  • Зашел в гости
  • *
  • Posts: 15
  • Помогу с написанием скрипта за скромную оплату
    • View Profile
перемешивание координат
« on: February 09, 2015, 04:48:15 PM »
Привет всем. Подскажите решение... Есть 12 пар координат.
Code: (clickermann) [Select]
$x1=325 (TFRead("number.txt", 45))
$y1=125 (TFRead("number.txt", 46))

$x2=244
$y2=103
...
$x12=437
$y12=132
Координаты задаются из текстового документа(отдельная строка для каждой координаты).
Нужно перемешать координаты (присвоить случайное значение из имеющихся, сохраняя пару координат)
как-то так:
Code: (clickermann) [Select]
$x1=244
$y1=103

$x2=437
$y2=132
...
$x12=325
$y12=125
Перемешать нужно именно сохраняя парность координат. Значения  $x1,$y1 переходят $x3,$y3, а не $x3,$y5 . :'(

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: перемешивание координат
« Reply #1 on: February 09, 2015, 05:52:51 PM »
Зачем вообще нумеровать переменные если порядок не важен? Почему не загнать их в один массив и после доставать какие нужно перед самой обработкой?
Нужно правильно планировать решение задачи.

Code: (clickermann) [Select]
ARRPUSH($arr, (TFRead("number.txt", 45)))
ARRPUSH($arr, (TFRead("number.txt", 46)))
...
Надеюсь $x2, $y2 не читались со строк 47,48. Если шли подряд зачем прописывать номера руками, читать нужно в цикле.

И вот в итоге у тебя массив $arr = [325, 125, 244, 103, ... , 437, 132]
Берёшь любую пару и обрабытываешь:
Code: (clickermann) [Select]
$index = RND(0,12-1)*2
$x = [$index]
$y = [$index+1]

или если не знаешь длину массива (сколько пар у тебя)
Code: (clickermann) [Select]
$index = RND(0, (ARRSIZE($arr)-2)/2)*2
$x = [$index]
$y = [$index+1]


Можно , конечно, замутить и перемешивание, как ты хочешь. Но это не есть гуд.
« Last Edit: February 09, 2015, 05:56:33 PM by Vint »


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: перемешивание координат
« Reply #2 on: February 09, 2015, 06:21:42 PM »
В файле "number.txt" координаты должны быть в таком виде
Code: [Select]
258,389
330,477
405,557
375,654
360,712

Сам скрипт с перемешиванием
Code: (clickermann) [Select]
TFREADARR("number.txt", $arr1)

$siz = ARRSIZE($arr1)
FOR($a=0,$a<$siz)
   IF(ARRSIZE($ARR) = 0)
      $count1 = 0 // начальное число
      $count2 = $siz-1 // конечное число
      WHILE($count1 < $count2+1)
         ARRPUSH($ARR,$count1)
         INC($count1,1)
      END_CYC
   END_IF
   $ARR_SIZE = ARRSIZE($ARR)
   FOR ($i=0, $i<$ARR_SIZE*2)
      $n1 = RND(0,$ARR_SIZE-1)
      $n2 = RND(0,$ARR_SIZE-1)
      $R = $ARR[$n1]
      $ARR[$n1] = $ARR[$n2]
      $ARR[$n2] = $R
   END_CYC
   $r = ARRPOP($ARR)   
   STRSEPARATE($arr1[$r], ",", $arr3)
   ARRPUSH($arr4, $arr3[0])
   ARRPUSH($arr4, $arr3[1])
   UNDEFINE($arr3)
END_CYC

$x1 = $arr4[0]
$y1 = $arr4[1]

$x2 = $arr4[2]
$y2 = $arr4[3]

$x3 = $arr4[4]
$y3 = $arr4[5]

$x4 = $arr4[6]
$y4 = $arr4[7]

$x5 = $arr4[8]
$y5 = $arr4[9]

$x6 = $arr4[10]
$y6 = $arr4[11]

$x7 = $arr4[12]
$y7 = $arr4[13]

$x8 = $arr4[14]
$y8 = $arr4[15]

$x9 = $arr4[16]
$y9 = $arr4[17]

$x10 = $arr4[18]
$y10 = $arr4[19]

$x11 = $arr4[20]
$y11 = $arr4[21]

$x12 = $arr4[22]
$y12 = $arr4[23]

UNDEFINE($arr)
UNDEFINE($arr1)
UNDEFINE($arr3)
UNDEFINE($arr4)

Жалко что #define не принимает переменных, можно было бы сделать короче.
« Last Edit: February 10, 2015, 07:13:45 AM by Oraven »

garr24

  • Зашел в гости
  • *
  • Posts: 15
  • Помогу с написанием скрипта за скромную оплату
    • View Profile
Re: перемешивание координат
« Reply #3 on: February 10, 2015, 02:32:08 AM »
Oraven, спасибо огромное! я и хотел сделать на похожем(случайные числа исключая повторения(за него тоже пасиб)) скрипте, только не знал как не разорвать пару координат.(не хватает мозга и опыта работы с массивами...) Спасибо всем за помощь!
« Last Edit: February 10, 2015, 02:35:58 AM by garr24 »

cahmep

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Re: перемешивание координат
« Reply #4 on: February 18, 2016, 07:25:15 AM »
У меня тоже возникла подобная задача... нужно в случайном порядке перемешать пары координат в массиве...
Принцип такой: берем случайную пару координат (х,у) из нашего массива и исполузуем на свои нужды (например сохраняем в новый массив), потом на место использованных координат последовательно перемещаем все последующие координаты, а исходный массив в итоге уменьшается на 2 элемента. Все это зацикливаем, пока размер исходного массива не станет равным нулю. Выглядит очень просто:
Code: (clickermann) [Select]
WHILE(ARRSIZE($arr1) > 0)

 $_N = ARRSIZE($arr1)/2        // количество пар координат
 $numb = 2*RND(0, $_N-1)      // номер в массиве первой координата из случайной пары

ARRPUSH($arr2, $arr1[ $numb])
ARRPUSH($arr2, $arr1[ $numb+1])

WHILE($numb < ARRSIZE($arr1)-2)
 $arr1[$numb] = $arr1[$numb +2] // исключаю использованные координаты
 $numb = $numb +1             // на их место перезаписываю следующие по счету
END_CYC
 $numb = ARRPOP($arr1)         // пара последних координат теперь передвинулась
 $numb = ARRPOP($arr1)         // на 2 позиции ближе к началу массива, поэтому 2 последних элемента массива можно извлечь

END_CYC


« Last Edit: February 18, 2016, 07:35:57 AM by cahmep »