Опубликован: 01.06.2007 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет путей сообщения
Лекция 15:

Основы "живого" моделирования

Однако изменение адреса пересылки клеток по разным координатам различно, что определяется положением мышцы в пространстве. Для пояснения этого положения и для формирования алгоритма сжатия мышцы рассмотрим пример.

Пусть 045 451 714трехмерный адрес точки А в восьмеричной системе счисления. Это означает, что А = (x1, y1, z1) = (045, 451, 714) . Аналогично, пусть В = (x2, y2, z2) = (055, 471, 720) , а неподвижная точка находится в середине отрезка АВ, M = (xM, yM, zM) = (051, 461, 716) . Зададим l = 0,610 (в десятичной системе счисления).

Адресное расстояние между точками А и М составляет \Delta A_{x}        = 4, \Delta A_{y} = 10 = 8_{10}, \Delta A_{z} = 2. Максимальное адресное расстояние по всем координатам \Delta А = 8_{10}.

Тогда очевидно, что если по y, определяя точку переноса, следует шагать с переадресацией, определяемой коэффициентом сжатия, то при том же числе переносов по x следует производить переадресацию в два раза реже, а по z — в четыре раза. Тогда по некоторым координатным адресам переноса возможна неоднократная запись. Однако, поскольку происходит сокращение и диапазона изменения координаты у, по некоторым адресам переноса возможна неоднократная запись. Здесь и приходит на помощь стек, позволяющий сохранить информацию для последующего восстановления (расслабления) мышцы.

Пусть iпараметр цикла переноса точек отрезка АМ для его преобразования в отрезок А*М, i = 1, ..., 11. Здесь граничное значение цикла определяется максимальным значением точек переноса по всем координатам, равным \Delta А + 1. Программно перенос производится с конца отрезка к его началу — чтобы не уничтожать еще не перенесенную информацию. Тогда адреса переноса отдельно по координатам находятся как

\begin{array}{l}
      x_{пер} = x_{M} - il\cfrac {\Delta A_x}{\Delta A}\\
      y_{пер }= y_{M }- il\cfrac {\Delta A_y}{\Delta A}\\
      z_{пер }= z_{M} - il\cfrac {\Delta A_z}{\Delta A}.
      \end{array} ( 15.2)

В указанном порядке рассчитаем адреса переноса отдельно по координате x, не допуская при округлении выхода адресов из адресного пространства мышцы:

051 -  1 x 0,610 x 0,510 = 051
        051 -  2 x 0,610 x 0,510 = 050
        051 -  3 x 0,610 x 0,510 = 050
        051 -  4 x 0,610 x 0,510 = 050
        051 -  5 x 0,610 x 0,510 = 047
        051 -  6 x 0,610 x 0,510 = 047
        051 -  7 x 0,610 x 0,510 = 046
        051 - 10 x 0,610 x 0,510 = 046
        051 - 11 x 0,610 x 0,510 = 046

Рассчитаем координату у:

461 -  1 x 0,610 x 1 = 460
        461 -  2 x 0,610 x 1 = 460
        461 -  3 x 0,610 x 1 = 457
        461 -  4 x 0,610 x 1 = 456
        461 -  5 x 0,610 x 1 = 456
        461 -  6 x 0,610 x 1 = 455
        461 -  7 x 0,610 x 1 = 454
        461 - 10 x 0,610 x 1 = 453
        461 - 11 x 0,610 x 1 = 452

Адреса переноса по координате z:

716 -  1 x 0,610 x 0,2510 = 716
        716 -  2 x 0,610 x 0,2510 = 716
        716 -  3 x 0,610 x 0,2510 = 716
        716 -  4 x 0,610 x 0,2510 = 716
        716 -  5 x 0,610 x 0,2510 = 715
        716 -  6 x 0,610 x 0,2510 = 715
        716 -  7 x 0,610 x 0,2510 = 715
        716 - 10 x 0,610 x 0,2510 = 715
        716 - 11 x 0,610 x 0,2510 = 715

Найдены адреса, по которым необходимо осуществить пересылку при сокращении левой части мышцы.

Аналогично, для правой части мышцы, для отрезка МВ, найдем адресные расстояния \Delta A_{x}        = -4, \Delta A_{y} = -10 = -8_{10}, \Delta A_{z}        = -2, \Delta А = -8_{10}. По (15.2) для адресов переноса по x, y, z находим

051 +  1 x 0,610 x 0,510 = 051      461 +  1 x 0,610 x 1 = 462    716 +  1 x 0,610 x 0,2510 = 716
051 +  2 x 0,610 x 0,510 = 052      461 +  2 x 0,610 x 1 = 463    716 +  2 x 0,610 x 0,2510 = 716
051 +  3 x 0,610 x 0,510 = 052      461 +  3 x 0,610 x 1 = 463    716 +  3 x 0,610 x 0,2510 = 716
051 +  4 x 0,610 x 0,510 = 052      461 +  4 x 0,610 x 1 = 464    716 +  4 x 0,610 x 0,2510 = 716
051 +  5 x 0,610 x 0,510 = 053      461 +  5 x 0,610 x 1 = 464    716 +  5 x 0,610 x 0,2510 = 717
051 +  6 x 0,610 x 0,510 = 053      461 +  6 x 0,610 x 1 = 465    716 +  6 x 0,610 x 0,2510 = 717
051 +  7 x 0,610 x 0,510 = 053      461 +  7 x 0,610 x 1 = 465    716 +  7 x 0,610 x 0,2510 = 717
051 + 10 x 0,610 x 0,510 = 054      461 + 10 x 0,610 x 1 = 466    716 + 10 x 0,610 x 0,2510 = 717
051 + 11 x 0,610 x 0,510 = 054      461 + 11 x 0,610 x 1 = 466    716 + 11 x 0,610 x 0,2510 = 717

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

Свяжем перебор искомых точек с тем же параметром цикла организации пересылки

x = x_{M} - i\cfrac {\Delta A_x}{\Delta A}
      y = y_{M }- i\cfrac {\Delta A_y}{\Delta A}
      z = z_{M} - i\cfrac {\Delta A_z}{\Delta A}. ( 15.3)

Найдем отдельно для x, y, z отрезка АМ адреса пересылаемых точек:

051 -  1 x 0,510 = 050           461 -  1 x 1 = 460           716 -  1 x 0,2510 = 716
051 -  2 x 0,510 = 050           461 -  2 x 1 = 457           716 -  2 x 0,2510 = 715
051 -  3 x 0,510 = 047           461 -  3 x 1 = 456           716 -  3 x 0,2510 = 715
051 -  4 x 0,510 = 047           461 -  4 x 1 = 455           716 -  4 x 0,2510 = 715
051 -  5 x 0,510 = 046           461 -  5 x 1 = 454           716 -  5 x 0,2510 = 715
051 -  6 x 0,510 = 046           461 -  6 x 1 = 453           716 -  6 x 0,2510 = 714
051 -  7 x 0,510 = 045           461 -  7 x 1 = 452           716 -  7 x 0,2510 = 714
051 - 10 x 0,510 = 045           461 - 10 x 1 = 451           716 - 10 x 0,2510 = 714
051 - 11 x 0,510 = 045           461 - 11 x 1 = 450           716 - 11 x 0,2510 = 714

Для отрезка МВ находим

051 +  1 x 0,510 = 052           461 +  1 = 462               716 +  1 x 0,2510 = 716
051 +  2 x 0,510 = 052           461 +  2 = 463               716 +  2 x 0,2510 = 716
051 +  3 x 0,510 = 053           461 +  3 = 464               716 +  3 x 0,2510 = 716
051 +  4 x 0,510 = 053           461 +  4 = 465               716 +  4 x 0,2510 = 716
051 +  5 x 0,510 = 054           461 +  5 = 466               716 +  5 x 0,2510 = 716
051 +  6 x 0,510 = 054           461 +  6 = 467               716 +  6 x 0,2510 = 716
051 +  7 x 0,510 = 055           461 +  7 = 470               716 +  7 x 0,2510 = 716
051 + 10 x 0,510 = 055           461 + 10 = 471               716 + 10 x 0,2510 = 716
051 + 11 x 0,510 = 055           461 + 11 = 471               716 + 11 x 0,2510 = 716

"Склеим" координатные части адресов и обозначим ее окончательно в двух столбцах: в левом — пересылку для левой части мышцы, в правом — для правой.

(050 460 716) => 051 460 716            (052 462 716) => 051 462 716
      (050 457 715) => 050 460 716            (052 463 717) => 052 463 716
      (047 456 715) => 050 457 716            (053 464 717) => 052 463 716
      (047 455 715) => 050 456 716            (053 465 717) => 052 464 716
      (046 454 715) => 047 456 715            (054 466 717) => 053 464 717
      (046 453 714) => 047 455 715            (054 467 720) => 053 465 717
      (045 452 714) => 046 454 715            (055 470 720) => 053 465 717
      (045 451 714) => 046 453 715            (055 471 720) => 054 466 717
      (045 450 714) => 046 452 715            (055 471 720) => 054 466 717

В строках 2 и 3, в 6 и 7, а также в 8 и 9 видно формирование стеков при неоднократной записи в одну клетку.

Однако вся проделанная выше работа по сжатию мышцы в действительности касается только клеток со значащим содержимым. Это означает, что если объект задан своей оболочкой, то переносу подвергаются только клетки оболочки. Мышца чаще всего является "пустым" объектом, и смещаются только точки А и В. Переносить ее клетки следует в таком случае лишь тогда, когда она принадлежит оболочке или пересекается с ней.

Сокращение мышцы можно использовать для деформации объекта на стадии его создания. После этого мышца может быть исключена из списка объекта или переопределена вновь в измененных границах.

Таким образом, каждый перенос клетки мышцы или объекта в целом сопровождается анализом на значимость этой клетки.

Эльвира Герейханова
Эльвира Герейханова

Раньше это можно было зделать просто нажав на тест и посмотреть результаты а сейчас никак

Елена Лобынцева
Елена Лобынцева
Помогите разобраться как можно подобрать НС для распознавания внутренней области выпуклого многоугольника?
Дмитрий Степанов
Дмитрий Степанов
Россия, Москва, МГТУ им. Баумана, 2006
Дмитрий Степаненко
Дмитрий Степаненко
Россия