Практика программирования (Бейсик, Си, Паскаль)


Задачи,советы и ответы - часть 52


Обратим внимание на то, что диагональ у=х делит узлы нашей решетки на два множества. Для всех узлов, расположенных слева от диагонали, выполняется условие х > у. Пусть точка с координатами (х,у) расположена либо на горизонтальном витке спирали, находящемся в левой полуплоскости, либо на вертикальном витке, спускающемся до диагонали. Разобьем каждый из этих витков на две части и пронумеруем их следующим образом:

  • 1 — горизонтальный участок от диагонали до оси у;

  • 2 — горизонтальный участок от оси у до угла поворота;

  • 3 — вертикальный участок от угла поворота до оси х;

  • 4 — вертикальный участок от оси х до очередного поворота.

На каждом из этих участков справедливы следующие соотношения:

1 : х > 0, у > 0

2 : х < 0, у > 0, у > |х|

3 : х < 0, у > 0, у < |х|

4 : х < 0, у < 0

Определив принадлежность точки тому или иному участку, мы можем вычислить координаты левого верхнего угла поворота (х0,у0) и найти порядковый номер этого узла N =(2*х0)2. Далее, в зависимости от номера участка, уже не сложно найти номер точки с координатами (х, у).

Аналогичные рассуждения можно повторить и для участков горизонтальной и вертикальной ветвей, принадлежащих правой полуплоскости. В программе для обозначения соответствующих четырех частей использованы буквенные обозначения — а, b, с, d. Для вычисления номера нашей точки здесь используется правый нижний угол поворота.

Ниже приводятся тексты программ, демонстрирующие работу процедуры

coord_to_n.

Программа 2_29.bas

DECiARF, FUNCTION CoordToN! (Х&, Y&)

REM Вычисление номера узла по его координатам

INPUT "Введите координаты узла : ", Х&, Y&

М& = CoordToN(X&, Y&)

PRINT "Его номер = "; М&

END

FUNCTION CoordToN (XS, Y&)

IF X& <= Y& THEN 'если узел в левой полуплоскости

IF Х& >= 0 AND Y& > 0 THEN GOTO m12 'случай 1

IF Х& < 0 AND Y& >= 0 AND Y& >= ABS(X&) THEN 'случай 2




- Начало -  - Назад -  - Вперед -