forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Алгоритм поворота (http://forum.boolean.name/showthread.php?t=51)

alcosholik 06.09.2005 21:36

Возможно ли написать универсальный алгоритм поворота для фигуры, состоящей из квадратных блоков?
Например, фигура из тетриса. Имеет примерно такой вид:


Каждый квадрат (блок) - отдельная картинка. Фигура поворачивается на угол 90 градусов по часовой стрелке, т.е. всего есть 4 этапа поворота:


Сейчас я просто задаю координаты каждого блока для каждого этапа поворота. Это не универсально, долго и неразумно. Есть какой-нибудь более рациональный путь для решения данной проблемы?

Jet 06.09.2005 22:43

возьмем к примеру матрицу 3х3 и поместим в неё заданную фигуру.

затем в каждом блоке напиши его координаты (центральную клетку возьми за 0).

возьми другой листок, поверни фигуру на 90 градусов, опять напиши координаты. и еще два раза.

когда получишь четыре картинки, легко можно вывести зависимость.

это называется методом индукции - т.е. формула выводится без доказательств. работает - и ладно. данный метод сильно экономит нервы и время :)

о результатах сообщи плиз :rolleyes:

alcosholik 06.09.2005 22:55

Я так и делал, но у меня не получалось вывести зависимость даже для одного блока. Если, например, есть цикл, в котором перебираются все блоки нарисованной выше фигуры, то он выглядит примерно так:
Код:

For i=0 to 3
 If i<1
 ...;тут я записываю в переменные координаты для данного блока
 ElseIf i<3
 ...;то же самое для двух следующих блоков
 Else
 ...;для последнего блока
 End if
Next

Это выглядит некрасиво и нерационально. И при этом в каждом из условий могут быть еще условия, в которых проверяются координаты рассматриваемого блока.

В общем, бред сивой кобылы у меня пока получается. :(

Jet 06.09.2005 23:33

задело меня за живое :) наверное, потому что в примерах к Turbo Pascal'ю сделали при помощи заранее заданных матриц :lol:

итак, табличка:

Код:

|---|
|-1-|
|234|

- вот она, матрица фигуры в начальном положении.
далее идут координаты точек, с шагом поворота в 90 градусов.

  X1; Y1| X2; Y2| X3; Y3| X4; Y4|
1: 0; 0| 0; 0| 0; 0| 0; 0|
2: -1; -1| +1; -1| +1; +1| -1; +1|
3: 0; -1| +1; 0| 0; +1| -1; 0|
4: +1; -1| +1; +1| -1; +1| -1; -1|

наблюдается очень интересная картина...
Xi+1=Yi; Yi+1=(-1)*Xi

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

alcosholik 07.09.2005 01:03

Спасибо.
Рад, что понравилась задачка :)
Ну и как всегда я был ленив и невнимателен :wallbash:

impersonalis 08.09.2005 19:56

Во! Это вроде как линейный оператор, действующий на множестве квадратных матриц 3*3 :)

jimon 08.09.2005 21:01

мне impersonalis пытался навязать матрицу шмитда :o

так вот - простой разворот матрици 3*3 с центром 2*2
центр менять нельзя
поворачивать можно только на -90 и на 90 градусов
матрицу представил в виде масима :) потомучто с типами возится в западло было

я гений минимализма :))

impersonalis 08.09.2005 21:03

Причём здесь Шмидт?! Я тебе перечислил некоторые операции, производимые с матрицами. Касаемо юзания данной матрицы для поворта фигуры - сказано не было!

impersonalis 08.09.2005 21:05

Аттач посмотрел. Вариант решения.


Часовой пояс GMT +4, время: 13:58.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot