Text
                    Е. В. Шикин, А. И. Плис
СРИВЫЕ
Л ПОВЕРХНОСТИ
на экране компьютера
МОСКВА ш "ДИАЛОГ-МИФИ" ■ 1996


УДК 681.3 Ш57 Шикин Е. В., Плис Л. И. ч Ш57 Кривые и поверхности на экране компьютера. Руководство по сплайнам для пользователей. - М.: ДИАЛОГ-МИФИ, 1996. - 240 с. ISBN 5-86404-080-0 Книга знакомит читателя со сплайнами - эффективным инструментом геомет- геометрическою моделирования при проектировании гладких кривых и поверхностей. В ней описаны наиболее часто встречающиеся в задачах компьютерной графики одномерные кубические и двухмерные бикубические интерполяционные и сгла- сглаживающие сплайны. Приведенные в книш профлммы Moiyr быть использованы при решении широкого класса задач визуализации. Книгу можно рассматривать как справочное и практическое руководство, рассчитанное на студентов технических вузов и инженеров. Ш 2404000000-023 Без объявл. Г70@3)-9Ь Учебно-справочное издание Шикин Евгений Викторович Плис Александр Иванович Кривые и поверхности на экране компьютера. Руководство по сплайнам для пользователей Редактор О. А. Голубев Корректор В. С. Кустов Макет О. А. Кузьминовой Обложка Н. В. Дмитриевой Лицензия ЛР N 070109 от 29.08.91. Подписано в печать 15.08.96. Формат 60x84/16. Ьум. офс. Печать офс. Гарнитура Тайме. Усл. иеч. л. 14.1. Уч.-изд. л. 7. Тираж 5 000 экз. Заказ935 Акционерное общество "ДИАЛОГ-МИФИ" 115409, Москва, ул. Москворечье, 31, кори. 2 Подольская типография 142НО, г. Подольск, Московская обл., ул. Кирова, 25 ISBN 5-86404-080-0 © Шикин Е. В., Плис А. И., 1996 © Оригинал-макет, оформление обложки. АО "ДИАЛОГ-МИФИ", 1996
Предисловие Пути, связывающие изначальные авторские замыслы и вышедшую книгу, часто оказываются столь своеобразными, что их описание за- заслуживает отдельного рассказа, который, впрочем, вряд ли будет ин- интересен читателям. К тому же удовольствие, которое обыкновенью ис- испытывает при этом рассказчик, никак не сможет заслонить главного события - самого выхода книги. Выпуск книги дает хороший повод для радости ее авторам. Стоит, однако, заметить, что эта радость оказывается полной лишь в тот мо- момент, когда каждый из выпущенных экземпляров книги найдет своего читателя, то есть того, кому книга окажется и полезной и нужной. Завершая работу над рукописью, авторы рассчитывают со временем испытать и эту радость. Мы искренне надеемся, что вместе с нами ее разделят все те, кто имеет пусть даже и малое отношение к выходу книги. Кроме изда- издательства и авторов, явно обозначенных на ее обложке, существуют еще и другие лица, причастные к происходящим событиям. Их сово- совокупную роль в появлении пособия не способен переоценить ни один из авторов. Мы считаем своим приятным долгом назвать их имена и выра- выразить испытываемое нами чувство глубокой признательности Ольге Владимировне Виноградовой, Кириллу Евгеньевичу Виноградову и Сергею Ежкову. Москва Март 1996 года А. И. Плис Е. В. Шыкын
О структуре пособия Несколько общих советов пользователю При подготовке справочного руководства авторы исходили из того, что помещенный в него материал окажется полезным как тем, кто бу- будет знакомиться со сплайнами впервые, так и тем, кто в своей работе сплайны уже применял. Вместе с тем это совсем не учебник, и за под- подробными разъяснениями и доказательствами, по-видимому, целесооб- целесообразнее обратиться к соответствующим книгам и научным публика- публикациям (часть из них указана авторами в конце пособия). Целью авторов было создание простого по существу и доступного широкому кругу пользователей пособия, посредством которого каж- каждый пользователь смог бы научиться достаточно успешно и эффектив- эффективно решать основные задачи "на сплайны", а также получил бы опре- определенное представление о методах, которые при этом используются. На всех этапах работы над руководством значительное внимание уделялось выработке структуры и формы подачи материала, наиболее удобной для пользователя. Предлагаемое пособие имеет целый ряд особенностей, на описа- описании которых стоит остановиться подробнее. Одна из основных идей, которую авторы постарались заложить в книгу, состоит в том, чтобы помочь пользователю в выборе именно того метода, который в наибольшей степени подходит для решения его конкретной задачи. Для ее реализации авторы используют сравне- сравнение различных подходов и методов и описание их особенностей как постоянную составляющую часть ихтожения. Этой же цели служит следование исторической и/или логической хронологии появления помещенных в книгу методов, последовательный показ того, как умножаются идеи и достоинства ранее найденных подходов при их модификации и развитии, как разрабатываемые методы постепенно освобождаются от недостатков. Открыв пособие на произвольной странице, пользователь вправе ожидать, что в изложенном там ему удастся сравнительно легко разо- разобраться, не изучая книгу целиком. Именно к реализации такой воз- возможности стремились авторы, разрабатывая структуру пособия и от- отбирая материал для его наполнения. Однако в целом ряде случаев по- последовательность рассмотрения материала в книге достаточно жестко предопределена. Если, к примеру, читатель хочет познакомиться с ин- интерполяционными сплайн-функциями двух переменных, то ему целе- целесообразно сначала хотя бы просмотреть раздел, где описываются
интерполяционные сплайн-функции одной переменной. Совершенно аналогично погружение в раздел В-сплайновых поверхностей разумно предварить знакомством с соответствующим одномерным разделом, где речь идет о В-сплайновых кривых. Хочется специально подчеркнуть, что главы, посвященные сплайн-функциям двух переменных (гл. 2) и сплайновым поверхнос- поверхностям (гл. 4), заметно сложнее тех, в которых рассматриваются сплайн- функции одной переменной (гл. 1) и сплайновые кривые (гл. 3). Это вполне естественно - более сложными являются сами объекты. Поэтому для того, чтобы как-то упростить пользование пособием, авторы постарались отобрать классы сплайнов так, чтобы практически каждый помещенный в пособие класс одномерных сплайнов имел в нем двумерный аналог и, в свою очередь, чтобы каждый двумерный класс опирался на одномерного предтечу. В целом же наложение построено так, чтобы каждую главу, а во многих случаях и каждый подраздел можно было читать независимо от других. Схожесть описания методов построения различных сплайнов, равно как и минимум перекрестных ссылок, помогут пользователю лучше ориентироваться на страницах книги. Фактически предлагаемое пособие разбито на 4 относительно независимых и тематически явно выделенных подпособия (именно так можно рассматривать главы книги). По мнению авторов, это поможет пользователю сравнительно просто получать ответы на инте- интересующие его вопросы без того, чтобы собирать соответствующий материал по всей книге. В тех же местах, где использование материа- материалов другой главы целесообразно (и даже необходимо), даны точные ссылки. Отбор материала производился с тем расчетом, чтобы дать чита- читателю возможность, познакомившись с основными фактами, понятия- понятиями и приемами, сравнительно просто войти в мир сплайнов. Многие результаты, полученные при помощи расчетов, обладают определенной особенностью: иногда достаточно трудно бывает объяс- объяснить, почему на этом этапе вычислений нужно поступать именно так, а не иначе или какими соображениями следует пользоваться, если возникает нестандартная ситуация, и т. п. Здесь большую роль играет интуиция и опыт. С интуицией дело не всегда обстоит просто. Опыт же приобретается, причем многими способами. Настоящее пособие как раз и представляет собой один из таких путей. Сдерживаемые не столько объемом, сколько осознанием ответ- ответственности перед читателем, мы посчитали целесообразным не заост- заострять внимание читателя на многообразных тонкостях обращения со сплайнами, отчетливо понимая, насколько легко можно в них увяз-
нуть. Поэтому мы сознательно отобрали и жестко структурировали отобранный материал так, чтобы у пользователя сложилось в целом правильное рабочее представление о сплайновом инструментарии и его возможностях, чтобы пользователь мог достаточно свободно ре- решать основные задачи приближения. Кроме того, мы попытались построить изложение таким образом, чтобы, опираясь ца материал, помешенный в книгу, читатель имел возможность проверить, на- насколько хорошо он этот материал усвоил. Книга разбита на две большие части, одна из которых посвящена сплайн-функциям, а вторая - геометрическим сплайнам. В первой части как бы главенствуют расчеты, в то время как во второй ведущая роль отводится изображению. Однако эти части довольно естественно связаны общностью основных идей. Одной из таких связующих идей является программная реализация сплаиновых алгоритмов.
Почему сплайны? В основе почти всякого созидания лежит идея составления целого из тщательно подобранных частей. Старая, почти так же как и вся наша цивилизация, она, однако, и по сей день все еще далека от окон- окончательного воплощения в жизнь. Оно и понятно: разрушить значи- значительно легче, чем скрупулезно собрать воедино и склеить. Да еще так, чтобы созданное радовало глаз. На протяжении всей своей истории человечество пыталось (и временами довольно успешно) решать эту задачу. Приведем только два примера, выбрав наиболее близкие к тем задачам, разрешению ко- которых посвящено настоящее справочное пособие. Существует красивая легенда о том, как появился так называе- называемый бухарский фарфор. В те давние времена фарфоровые изделия из- изготовлялись исключительно в Китае, бьши страшно дороги и потому особенно высоко ценились властителями больших и малых земель. Изготовленный по заявке бухарского эмира и караванными путями со всеми возможными предосторожностями доставленный к его двору роскошный фарфоровый сервиз не выдержал многодневного путе- путешествия - и значительная часть действительно хрупких изделий оказа- оказалась в осколках. Нам в нынешнем, Х^веке трудно в полной мере оце- оценить страх, который испытывали подданные перед своим эмиром. А им было хорошо известно, чем грозит невыполнение желаний пове- повелителя и к чему может привести доставка ценного груза в столь не- некондиционном состоянии. Нужно было срочно искать достойный выход. И как гласит легенда, он был найден. Знаменитые на всем Востоке золотых дел мастера тончайшими пластинами скрепили осколки ваз, блюд, тарелок, блюдец и чашек. Искусные ювелиры смогли не только воссоздать изящную красоту фарфоровых изделий, но и вернули им функциональность - изделия можно было использо- использовать по прямому назначению. Проделанные операции придали много- многострадальному сервизу уникальность столь привлекательную, что позже выписанный из Китая фарфор употребляли только после своеобраз- своеобразного расчленения и последующей "золотой" сборки. И сейчас еще, путешествуя по Средней Азии, можно встретить фарфоровые или фаянсовые чайники, починенные по этому "бухарскому" образцу, но, правда, уже без золотых пластин. А вот еще один, более известный, корабельный пример. Привле- Привлекаемое окружающими его водными просторами любопытное челове- человечество не слишком долго довольствовалось плотами и долблеными лодками - их мореходные качества бьши малоудовлетворительны.
Стремление людей узнать, что там интересного имеется за морем, в немалой степени способствовало поиску все более совершенных средств для перемещения по воде. И как это часто случается с вели- великими открытиями, идея создания плавсредств путем сборки возникла и начала развиваться совершенно независимо в разных частях Земли (правда, и с разным успехом). Ключевым в этой идее было осознание необходимости начинать изготовление судна с прочного каркаса. С течением времени универсальным методом проб и ошибок этот принципиальный вопрос был решен и для каркаса были найдены вполне удовлетворительные формы, позволившие придать судам плавучесть, устойчивость и нужную маневренность. И уже довольно скоро после этого на каравеллах, клиперах и шхунах человечество вплыло в эпоху великих географических открытий. Позже эти идеи стали весьма успешно использоваться не только в кораблестроении, но и при создании автомобилей и конструирова- конструировании самолетов, а также в архитектуре. Заметим, что, несмотря на различие используемых материалов, в обоих случаях изделие воссоздавалось по заданному шаблону путем подгонки имеющихся фрагментов. Правда, при решении фарфоровой проблемы творческий коллектив был разделен на две независимые части, одна из которых (китайская) создавала, а вторая (бухарская) воссоздавала по фактически готовым образцам (тех, кто разбивал, в расчет принимать не стоит). Корабелам же приходилось делать самим и деревянный каркас, и его обшивку (благо что леса в ту пору еще обильно покрывали Землю). Попробуем перевести рассматриваемую проблему на геометричес- геометрический язык. Геометрическая модель. Описав искомую гладкую поверхность массивом соответствующим образом выделенных опорных точек, по- построить по ним эту поверхность путем подбора нужных фрагментов. Тем самым решение задачи создания искривленной поверхности разбивается на несколько этапов: 1) задание подходящего набора опорных точек, 2) выработка универсального и сравнительно несложного спосо- способа построения элементарных фрагментов поверхности, 3) отыскание эффективного механизма плавной состыковки эле- элементарных фрагментов, 4) анализ полученных результатов. Ясно, что решение такой задачи далеко не однозначно, так как приблизить массив точек плавноизменяющейся кривой (или поверх- 8
ностью) можно очень многими способами. Тем самым множество приближающих геометрических объектов практически необозримо. Вместе с тем при решении конкретных задач, как правило, требуется найти только один приближающий объект, причем ведущий себя до- достаточно хорошо. Поэтому разумно сначала четко понять, что будет играть роль иголки в стоге возможностей, и только потом принимать- приниматься за поиски. Выбор элементарных фрагментов, представляющих собой вырез- вырезки гладких кривых или поверхностей, должен быть таким, чтобы их описание было простым, геометрически наглядным и универсальным. Преимущества простоты описания вполне очевидны. Универсальность позволяет добиться того, чтобы объем вычислений был сравнительно невелик. Хорошо прослеживаемые геометрические характеристики неоценимы при состыковке фрагментов и анализе полученной состав- составной кривой или поверхности. Обычно геометрической непрерывнос- непрерывности, то есть гладкого изменения касательной к кривой и ее кривизны или соответственно касательной плоскости к поверхности и ее кри- кривизны, во многих случаях оказывается вполне достаточно. Если ис- использовать для описания фрагментов полиномиальные скалярные функции, то такой непрерывности можно добиться, ограничившись многочленами 3-й степени (в двумерном случае по каждой из двух вспомогательных переменных). Немаловажную роль играет и проблема единственности решения задачи приближения. Конечно, удовлетворить сразу всем указанным выше ограничени- ограничениям не просто. Использование известных классов кривых или поверх- поверхностей (например, задаваемых многочленами или кусочно-линейными функциями) позволяет удовлетворить только части указанных требо- требований, правда всякий раз своей. Поэтому довольно естественным представляется желание объединить каким-нибудь удачным способом большую часть достоинств этих классов. Укажем некоторые вполне естественные требования, которые нужно наложить на выделяемые классы кривых и поверхностей и вы- выполнение которых необходимо для успешного разрешения задачи приближения (разумеется, есть и другие). 1. Выбираемый класс должен описываться достаточно просто. 2. Кривые или поверхности, входящие в выделенный класс, не должны иметь особенностей, то есть должны быть достаточно гладкими - нигде не рваться, иметь непрерывно изменяющу- изменяющуюся касательную или непрерывную кривизну.
3. Поиск нужной кривой или поверхности в выделенном классе должен быть сравнительно легким, что предполагает наличие эффективного алгоритма ее построения. 4. Для достаточно больших массивов точек найденные кривые или поверхности должны вести себя вполне предсказуемо. Небезынтересно заметить, что кривые и поверхности, удовлетво- удовлетворяющие перечисленным требованиям, существуют. Они составлены из ладно пригнанных гладких кусочков. Именно эти кривые и поверхности принято называть сплайнами. Таким образом, неизбежность появления сплайнов висела в воз- воздухе уже очень давно. По-видимому, в наиболее доходчивой и вместе с тем поэтичной форме это всеобщее ощущение сумел выразить вели- великий Гоголь в ''Женитьбе": "Если бы губы Никанора Ивановича да приставить к носу Ивана Кузьмича, да взять сколько-нибудь развязности, какая у Балтазара Балтазарыча, да, пожалуй, прибавить к этому еще дородности Ивана Павловича - я бы тогда тотчас же решилась" (курсив наш. - А. 77., Е. Ш.). 10
Часть I Сплайн-функции В практике многие кривые и поверхности имеют довольно сложную форму, не допускающую универсального аналитического задания в целом при помощи элементарных функций. Поэтому их собирают из сравнительно простых гладких фрагментов - отрезков (кривых) или вырезков (поверхностей), каждый из которых может быть вполне удовлетворительно представлен в виде элементарной функции одной или двух переменных. Для того чтобы получающаяся в результате составная кривая или поверхность была достаточно гладкой, необходимо быть особенно внимательным в местах стыковки. ^Естественно потребовать, чтобы гладкие функции, графики кото- которых используются при построении частичных кривых или поверхнос- поверхностей, имели схожую природу, например были многочленами одинако- одинаковой степени. Последняя выбирается из простых геометрических сооб- соображений и, как правило, невелика: для гладкого изменения касатель- касательной вдоль всей составной кривой достаточно описывать стыкуемые кривые при помощи многочленов 3-й степени. Коэффициенты этих многочленов всегда можно подобрать так, чтобы соответствующая составная функция имела непрерывную 2-ю производную. Результаты решения одномерных задач разумно использовать при построении фрагментов соответствующих составных поверхностей. Так возникают бикубические сплайны - функции, являющиеся много- многочленами 3-й степени по каждой переменной. Работа с такими сплай- сплайнами требует уже значительно большего объема вычислений. Но пра- правильно организованный процесс позволяет учесть нарастающие возможности вычислительной техники в максимально возможной степени. Таким образом, в этой части рассматриваются гладкие кривые и поверхности, представляющие собой графики кусочно-полино- миальных функций невысоких степеней. Именно с построения таких кривых, а потом и поверхностей сплайны сравнительно недавно и начали свое бурное развитие. 11
Сплайны Глава 1. Сплайн-функции одной переменной Пусть на отрезке [а, Ь\ задана сетка со: а = хо<х{ < ... <хт_, <хт=Ь. Точки Хо и хт называются граничными узлами сетки со, а точки jci, ..., хтА - ее внутренними узлами (рис. 1.1). Сетка называется равно- равномерной, если расстояния между любыми двумя соседними узлами оди- одинаковы. Функция S(x), заданная на отрезке [а, Ь\, называется стайном по- порядка р+1 (степени р), если эта функция: 1) на каждом из отрезков Л, = [xh Xi+\\y i — О, 1, ..., т-\, является многочленом заданной степени р>2, то есть может быть записана в виде S(x) =St(x) = X а[*(х - x)k, / = 0, 1, .... « - 1; b и 2) p - 1 раз непрерывно дифференцируема на отрезке [а, Ь], то есть S(x)eCp'l[a9b]. Замечание Индекс (/) у чисел а^ указывает на то, что набор коэффициентов? которым определяется функция S(x), на каждом частичном отрезке А; свой. На каждом из отрезков Л/, / = 0, 1, ..., т - 1, сплайн S(x) является многочленом степени р и определяется на этом отрезке р+1 коэффициентом. Всего частичных отрезков - т. Значит, для того чтобы полностью определить сплайн, необходимо найти (р +\)т чисел ctlk , к = 0, 1, ..., /?, / = 0, 1, ..., т - 1. Условие S[x) eCH[fli] означает непрерывность функции S(x) и ее производных S'(x), S"{x), •♦•, Sp~x(x} во всех внутренних узлах 12
Сплайн-функции одной переменной сетки со. Число таких узлов - т -1. Тем самым для отыскания коэффи- коэффициентов всех многочленов получается р(т -1) условий (уравнений). Для полного определения сплайна недостает (р +\)т - р(т - 1) = т + р условий (уравнений). Выбор дополнительных условий определяется характером рассматриваемой задачи, а иногда и просто желанием пользователя. Наиболее часто рассматриваются задачи интерполяции и сглажи- сглаживания, когда требуется построить тот или иной сплайн по заданному массиву точек на плоскости {xi% >*,), / = 0, 1, ..., т (рис. 1.2). В задачах интерполяции требуется, чтобы график сплайна прохо- проходил через точки (х,-, у,), /' = 0, 1, ..., /и, что накладывает на его коэффи- коэффициенты т+ 1 дополнительных условий (уравнений). Остальные р -1 условий (уравнений) для однозначного построения сплайна чаще всего задают в виде значений младших производных сплайна на кон- концах рассматриваемого отрезка [а, Ь] - граничных (краевых) условий. Возможность выбора различных граничных условий позволяет строить сплайны, обладающие самыми разными свойствами. В задачах ссаживания сплайн строят так, чтобы его график про- проходил вблизи точек (л/, у,-), / = 0, 1, ..., /и, а не через них. Меру этой близости можно определять по-разному, что приводит к значительно- значительному разнообразию сглаживающих сплайнов. Описанные возможности выбора при построении сплайн-функ- сплайн-функций далеко не исчерпывают всего их многообразия. И если первона- первоначально рассматривались только кусочно-полиномиальные сплайн- функции, то по мере расширения сферы их приложений стати воз- возникать сплайны, "склеенные" и из других элементарных функций. Один из таких классов - класс напряженных сплайнов, обладающих по- полезными интересными свойствами, приведен в этой главе в качестве примера. 1.1. Интерполяционные кубические сплайны 1.1.1. Постановка задачи интерполяции Пусть на отрезке [а, Ь\ задана сетка со: а = хо<х]<... <хт_{<хт=Ь. , о о о о , >.г Рассмотрим набор чисел хо=а Х1 Х2 хиГ^ До? Уь -"•> Ут-U Ут- р/ . . Задача. Построить гладкую на отрезке [а, Ь\ функцию о{х), которая принимает в узлах сетки со заданные значения, то есть <j(xi) = yh i = 0, 1, ..., т -1, т (рис. 1.1). 13
Сплайны Замечание Сформулированная задача интер- интерполяции состоит в восстановле- восстановлении гладкой функции, заданной таблично (рис. 1.2). Ясно, что такая задача имеет множество различных решений. Накладывая на конструируемую функцию до- дополнительные условия, можно до- добиться необходимой однозначнос- однозначности. Рис. 1.2 В приложениях часто возникает необходимость приблизить функ- функцию, заданную аналитически, у=Ах), xe[a,b], при помощи функции с предписанными достаточно хорошими свойс- свойствами. Например, в тех случаях, когда вычисление значений заданной функции /(л*) в точках отрезка [а, Ь\ связано со значительными труд- трудностями и/или заданная функция f{x) не обладает требуемой глад- гладкостью, удобно воспользоваться другой функцией, которая достаточно хорошо приближала бы заданную функцию и бьша лишена отмечен- отмеченных ее недостатков. Задача интерполяции функции Построить на отрезке [а, Ь] гладкую функцию о{х), совпадающую в узлах сетки со с заданной функцией Дх), сг (*,-) =Л*/), / = 0, 1, ..., т -1, т. 1.1.2. Определение интерполяционного кубического сплайна Интерполяционным кубическим стайном S{x) на сетке со называется функция, которая: 1) на каждом из отрезков [х„ x/+i], / = 0, 1, ..., т -1, представляет собой многочлен 3-й степени, S(x) = S,(x) = „<" + *i"(* - *,) + а['\х -x,f+ а\"{х - x,f; 2) дважды непрерывно дифференцируема на отрезке [а, Ь\, то есть принадлежит классу С2[я./>]; 3) удовлетворяет условиям = Уь i = 0, 1, ..., т. A.1) 14
Сплайн-фумкции одной переменной На каждом из отрезков [х/, x/+i], / = 0, 1, ..., /и-1, сплайн S(x) яв- является многочленом 3-й степени и определяемая на этом отрезке че- четырьмя коэффициентами. Всего отрезков - т. Значит, для того чтобы полностью определить сплайн, необходимо найти 4т чисел (О (') (А @ г\ 1 1 а\\ а\\ а\ , а\\ i = 0, 1, ..., т -1. Условие .S(x)eC2[ai] означает непрерывность функции S(x) и ее производных S"(x) и S"(x) во всех внутренних узлах сетки со. Чис- Число таких узлов - т -1. Тем самым для отыскания коэффициентов всех многочленов получается еще 3(т-1) условий (уравнений). Вместе с ус- условиями A.1) получается 3(/w-l)+(m +1) = 4w-2 условий (уравнений). 1.1.3. Граничные (краевые) условия Два недостающих условия задаются в виде ограничений на значения сплайна и/или его производных на концах промежутка \а, Ь\. При по- построении интерполяционного кубического сплайна наиболее часто используются краевые условия следующих четырех типов. Граничные (краевые) условия 1-го типа S'(a) = f'(a). S'(b) = f'(b) - на концах промежутка [а, Ь\ задаются значения 1-й производной ис- искомой функции. Граничные (краевые) условия 2-го типа S"(a) = f"{a). S"{b) = f"{b) - на концах промежутка [а, Ь\ задаются значения 2-й производной искомой функции. Граничные (краевые) условия 3-го типа S'(a) = S'(b)f S"(a) = S"(b) называются периодическими. Выполнения этих условий естественно требовать в тех случаях, когда интерполируемая функция является пе- периодической с периодом Т = Ь-а. Граничные (краевые) условия 4-го типа S'"(y,X[ -O) = S"'(.v,r, +0). S'"(v.xm_, -O) = S'"(y.xm_, +0) требуют особого комментария. Комментарий. Во внутренних узлах сетки 3-я производная функ- функции S(x), вообще говоря, разрывна. Однако число разрывов 3-й производной можно уменьшить при помощи условий 4-го типа. 15
Сплайны В этом случае построенный сплайн будет трижды непрерывно диф- дифференцируем на промежутках [jco, xi\ и [хда_2, хт]. 1.1.4. Построение интерполяционного кубического сплайна Опишем способ вычисления коэффициентов кубического сплайна, при котором число величин, подлежащих определению, равно /я + 1, а не 4т. На каждом из промежутков [х„ x/+i], / = 0, 1, ..., /я-1, интерполя- интерполяционная сплайн-функция ищется в следующем виде: A2) Здесь Й, а числа /?;, / = 0, 1, ..., т, являются решением системы линейных алгебраических уравнений, вид которой зависит от типа граничных (краевых) условий. Для граничных (краевых) условий 1-го и 2-го типов эта система имеет следующий вид: = с. где / = 1, 2, ..., /я-1; =3 \ й.. , Х. Коэффициенты да т (краевых) условий. Граничные (краевые) условия 1-го типа: , с0", Я*да, с*т зависят от выбора фаничных Граничные (краевые) условия 2-го типа: о-3—■ ~-у0 16
Сплайн-функции одной переменной /Г = 1 Г* = m * i " В случае граничных {краевых) условий 3-го типа система для опре- опрееления чисел л,-, / = 1, 2, ..., /л, записывается так: где / = 2, ..., /я-1. Число неизвестных в последней системе равно /л, так как из ус- условия периодичности вытекает, что ло = пт. Для граничных (краевых) условий 4-го типа система для определе- определения чисел л„ / = 1, 2, ..., /я-1, имеет вид: где / = 2, ..., /я-2; Ст-\ — ~ Ст-\ + W Ут-\ " Ут-2 По найденному^ решению системы числа л0 и пт можно определить при помощи формул =2 v'i- \ К 2 J 2 Vm_ ;2 " А, " >1 ) >m-2 m—1 ш~ i. Важное замечание Матрицы всех трех линейных алгебраических систем яв.гяются мат- матрицами с диагональным преобладанием. Такие матрицы невырожден- ныу и потому каждая из этих систем имеет единственное решение. Теорема. Интерполяционный кубический сплайн, удовлетворяю- удовлетворяющий условиям A.1) и граничному (краевому) условию одного из пере- перечисленных четырех типов, существует и единственен. 17
Сплайны Таким образом, построить интерполяционный кубический сплайн - это значит найти его коэффициенты я0, пх, ..., пт. Когда коэффициенты сплайна найдены, значение сплайна S(x) в произвольной точке отрезка [а, Ь\ можно найти по формуле A.2). Од- Однако ддя практических вычислений больше подходит следующий ал- алгоритм нахождения величины S(x). Пусть х e[xt,xi+l]. Сначала вычисляются величины Аи В по фор* мулам 4 = -2 Ум ~ -'• +п +п s\ — z, -г nj т ni+x , Л/+1 "" Л/ а затем находится величина 5(jc): где, как обычно, ^/+1 Xi Xi+\ Xi Применение этого алгоритма существенно сокращает вычислительные затраты на определение величины S(x). 1.1.5. Советы пользователю Выбор граничных (краевых) условий и узлов интерполяции позволяет в известной степени управлять свойствами интерполяционных сплай- сплайнов. А. Выбор граничных (краевых) условий Выбор граничных (краевых) условий является одной из централь- центральных проблем при интерполяции функций. Он приобретает особую важность в том случае, когда необходимо обеспечить высокую точ- точность аппроксимации функции /.г) сплайном S(x) вблизи концов от- отрезка [а, Ь\. Граничные значения оказывают заметное влияние на по- поведение сплайна S(x) вблизи точек а к Ь, к это влияние по мере удале- удаления от них быстро ослабевает. Выбор граничных (краевых) условий часто определяется наличи- наличием дополнительных сведений о поведении аппроксимируемой функ- функции J{x). 18
Сплайн-функции одной переменной Если на концах отрезка [а, Ь] известны значения 1-й производной /'(х), то естественно воспользоваться граничными (краевыми) условиями 1-го типа. Если на концах отрезка [а, Ь] известны значения 2-й производной /"(х) > то естественно воспользоваться граничными (краевыми) условиями 2-го типа. Если есть возможность выбора между граничными (краевыми) ус- условиями 1-го и 2-го типа, то предпочтение следует отдать условиям 1-- 1-го типа. Если J{x) - периодическая функция, то следует остановиться на граничных (краевых) условиях 3-го типа. В случае, если никакой дополнительной информации о поведе- поведении аппроксимируемой функции нет, часто используют так называе- называемые естественные граничные (краевые) условия S"{a) = 0, S"(fy = 0 . Однако следует иметь ввиду, что при таком выборе граничных (крае- (краевых) условий точность аппроксимации, функции Длг) сплайном S(x) вблизи концов отрезка [а, Ь\ резко снижается. Иногда используются граничные (краевые) условия 1-го или 2-го типа, но не с точными значениями соответствующих производных, а с их разностными ап- " проксимациями. Точность такого подхода невысока. Практический опыт расчетов показывает, что в рассматриваемой ситуации наиболее целесообразным является выбор граничных (крае- (краевых) условий 4-го типа. Б. Выбор узлов интерполяции , Если 3-я производная /'"(х) функции терпит разрыв в некото- некоторых точках отрезка \а, Z>], то для улучшения качества аппроксимации эти точки следует включить в число узлов интерполяции. Если разрывна 2-я производная /"(*) , то для того, чтобы избе- избежать осцилляции сплайна вблизи точек разрыва, необходимо принять специальные меры. Обычно узлы интерполяции выбирают так, чтобы точки разрыва 2-й производной попадали внутрь промежутка [х„ х,^], такого, что й, =атп{й|._1?Лм}, где а «1. Величину а можно выбрать путем численного экспери- эксперимента (часто достаточно положить а = 0.01). Существует набор рецептов по преодолению трудностей, возни- возникающих при разрывной 1-й производной /'(*)• В качестве одного из 19
Сплайны самых простых рецептов можно предложить такой: разбить отрезок аппроксимации на промежутки, где производная непрерывна, и на каждом из этих промежутков построить сплайн. 1.1.6. Выбор интерполяционной функции (плюсы и минусы) А. Интерполяционный многочлен Лагранжа По заданному массиву (*,-, уд, / = 0, 1, ..., /и-1, т (рис. 1.3) интерполяционный многоч- многочлен Лагранжа определяется форму- формулой f где то Рис. 1.3 i=0 Свойства интерполяционного многочлена Лагранжа целесообраз- целесообразно рассматривать с двух противоположных позиций, обсуждая основ- основные достоинства отдельно от недостатков. Основные достоинства 1-го подхода: 1) график интерполяционного многочлена Лагранжа проходит через каждую точку массива; 2) конструируемая функция легко описывается (число подлежащих определению коэффициентов интерполяционного многочлена Лагранжа на сетке о равно /я + 1); 3) построенная функция имеет непрерывные производные любого порядка; 4) заданным массивом интерполяционный многочлен определен од- однозначно. Основные недостатки 1-го подхода: 1) степень интерполяционного многочлена Лагранжа зависит от числа узлов сетки, и чем больше это число, тем выше степень интерполяционного многочлена и, значит, тем больше требуется вычислений; 2) изменение хотя бы одной точки в массиве требует полного пере- пересчета коэффициентов интерполяционного многочлена Лагранжа; 20
Сплайм-фумкции одной переменной 3) добавление новой точки в массив увеличивает степень интерпо- ' ляционного многочлена Лагранжа на единицу и также приводит к полному пересчету его коэффициентов; 4) при неограниченном измельчении сетки степень интерполяци- интерполяционного многочлена Лагранжа неограниченно возрастает. Поведение интерполяционного многочлена Лагранжа при неогра- неограниченном измельчении сетки вообще требует особого внимания. Комментарии: О приближении непрерывной функции многочленом Известно (Вейерштрасс, 1885), что всякая непрерывная (а тем бо- более гладкая) на отрезке функция может быть как угодно хорошо при- приближена на этом отрезке много- многочленом, у Опишем этот факт на языке формул. Пусть fix) - функция, не- непрерывная на отрезке [а, Ь\. Тогда для любого е > О найдется такой многочлен Р„(х), что для любого х из промежутка [а, Ь\ будет выполняться неравенство (рис. 1.4). Отметим, что О многочленов даже одной степени, рцСф и приближающих функцию fix) с указанной точностью, существует бесконечно много. Построим на отрезке [а, Ь\ сетку >' со. Ясно, что ее узлы, вообще говоря, не совпадают с точками пересечения графиков многочлена Рп(х) и функ- функции fix) (рис. 1.5). Поэтому для взя- взятой сетки многочлен Рп(х) не явля- является интерполяционным. Об интерполировании непрерывной функции. При аппроксимации непрерывной функции интерполяционным много- многочленом Лагранжа его график не Рис. 1.5 21
Сплайны только не обязан быть близким к графику функции j(x) в каждой точке отрезка [а, Ь]ч но может укло- уклоняться от этой функции как угодно сильно. Приведем два примера. Пример 1. (Рунге, 1901). При неограниченном увеличении числа узлов для функции' на отрезке [-1, 1] (рис. 1.6) выпол- выполняется предельное равенство lim max \f(x)-L(x)\ = oc. m->oc -1<.г<1 Г V ' mV /I Пример 2. (Бернштейн, 1912). Последовательность интерполяцион- интерполяционных многочленов Лагранжа Lm(x), построенных на равномерных сетках сот для непрерывной функции на отрезке [-1, 1], с воз- возрастанием числа узлов т не стре- стремится к функции Дх) (рис. 1.7). Б. Кусочно-линейная интерполяция При отказе от гладкости интер- интерполируемой функции соотношение между числом достоинств и числом недостатков можно заметно изме- изменить в сторону первых. Построим кусочно-линейную функцию путем последовательного соединения точек (х„ yi) прямоли- прямолинейными отрезками (рис. 1.8). У I \ о V >' А о Рис. 1.7 Рис. 1.8 Основные достоинства 2-го подхода: 1) график кусочно-линейной функции проходит через ка массива; 22
Сплайн-функции одной переменной 2) конструируемая функция легко описывается (число подлежащих определению коэффициентов соответствующих линейных функций для сетки со равно 2т); 3) заданным массивом построенная функция определена однозначно; 4) степень многочленов, используемых для описания интерполяцион- интерполяционной функции, не зависит от числа узлов сетки (равна единице); 5) изменение одной точки в массиве требует вычисления четырех чисел (коэффициентов двух прямолинейных звеньев, исходящих из новой точки); 6) добавление дополнительной точки в массив требует вычисления четырех коэффициентов. Кусочно-линейная функция достаточно хорошо ведет себя и при измельчении сетки. Основной недостаток 2-го подхода: аппроксимирующая кусочно-лине иная функция не является гладкой: первые производные терпят разрыв в узлах сетки (узлах интерполяции). В. Сплайн-интерполяция Предложенные подходы можно объединить так, чтобы число пе- перечисленных достоинств обоих подходов сохранилось при одновре- одновременном уменьшении числа недостатков. Это можно сделать путем по- построения гладкой интерполяционной сплайн-функции степени р. Основные достоинства 3-го подхода: 1) график построенной функции проходит через каждую точку мас- массива; 2) конструируемая функция сравнительно легко описывается (число подлежащих определению коэффициентов соответствующих мно- многочленов для сетки со равно т(р + I); 3) заданным массивом построенная функция определена однозначно; 4) степень многочленов не зависит от числа узлов сетки и, следова- следовательно, не изменяется при его увеличении; 5) построенная функция имеет непрерывные производные до порядка р - I включительно; 6) построенная функция обладает хорошими аппроксимационными свойствами. Краткая справка Предложенное название - сплайн - не является случайным: вве- введенные нами гладкие кусочно-полиномиальные функции и чертежные сплайны тесно связаны. 23
У А Рис. 1.9 Сплайны Рассмотрим гибкую идеально тонкую линейку, проходящую через расположенные на плоскости (х, у) опорные точки массива (х,-, yi)9 i = 0, 1, ..., /w-1, т (рис. 1.9). Соглас- Согласно закону Бернулли-Эйлера линеа- линеаризованное уравнение изогнутой ли- линейки имеет вид EIS"(x) = -М(х), где S(x) - изгиб; М(х) - изменяющий- О ся линейно от опоры к опоре изги- изгибающий момент; EI - жесткость ли- линейки. Функция S(x)9 описывающая форму линейки, является многочле- многочленом 3-й степени между каждыми двумя соседними точками массива (опорами) и дважды непрерывно дифференцируема на всем проме- промежутке [а, Ь\. Комментарий: об интерполировании непрерывной функции. В отличие от интерполяционных многочленов Лагранжа, после- последовательность интерполяционных кубических сплайнов на равномер- равномерной сетке всегда сходится к интерполируемой непрерывной функции, причем с улучшением дифференциальных свойств этой функции ско- скорость сходимости повышается. Пример. Для функции кубический сплайн на сетке с чис- числом узлов т = 6 дает погрешность аппроксимации того же порядка, что и интерполяционный многочлен L$(x), а на сетке с числом узлов т = 21 эта погрешность настолько мала, что в масштабе обычного книжного рисунка просто не может быть показана (рис. 1.10) (интерполяционный многочлен Ью(х) дает в этом случае погрешность около 10 000 %). 24
Сплайм-функции одной переменной 1.1.7. Свойства интерполяционного кубического сплайна А. Аппроксимационные свойства кубического сплайна Аппроксимационные свойства интерполяционного сплайна зави- зависят от гладкости функции Дх) - чем выше гладкость интерполируемой функции, тем выше порядок аппроксимации и при измельчении сетки тем выше скорость сходимости. Если интерполируемая функция J(x) непрерывна на отрезке [а, Ь\у то есть /(х) еС°[я,б] , то f(x)S(x) С max h = max /?, -> 0 . при Если интерполируемая функция fix) имеет на отрезке [а, Ь\ не- непрерывисто 1-ю производную, то есть /(х) eCJai], a S{x) - интерпо- интерполяционный сплайн, удовлетворяющий граничным условиям 1-го или 3-го типа, то при h -> О имеем \\f(x)-S(x)\\c=o(h), \\f'{x)-S'(x)\\c=o(l). В этом случае не только сплайн сходится к интерполируемой функции, но и производная сплайна сходится к производной этой функции. В случае если /(Y) еС4[я,/>], сплайн S(x) аппроксимирует на от- отрезке [а, Ь\ функцию f{x), а его 1-я и 2-я производные аппрок- аппроксимируют соответственно функции /'(■*") и /"(■*): \\f(x)-SD\c=o(h<), \\f(x)-S'(x)\\c = o(h>), \\r(x)-S»(x)\\c=o(h>). Б. Экстремальное свойство кубического сплайна Интерполяционный кубический сплайн обладает еще одним по- полезным свойством. Рассмотрим следующую задачу. Задача. Построить функцию Дх), минимизирующую функционал на классе функций из пространства С2[я?/?1, графики которых прохо- проходят через точки массива (хь >♦,-)> / = О, 1, ..., /я. 25
Сплайны Решение. Среди всех функций, проходящих через опорные точки (Xhfai)) и принадлежащих указанному пространству, именно кубичес- кубический сплайн S(x), удовлетворяющий краевым условиям S"(a) = S"(b) = 0 , доставляет экстремум (минимум) функционалу J(J). Замечания: 1. Часто именно это экстремальное свойство берут в качестве оп- определения интерполяционного кубического сплайна. 2. Интересно отметить, что интерполяционный кубический сплайн обладает описанным выше экстремальным свойством на очень широ- широком классе функций, а именно на классе И >* Л J2 В. Построение интерполяционных сплайновых кривых при помощи сплайн-функций Выше рассматривались массивы, точки которых были занумерованы так, что их абсциссы образовывали строго возрастающую последовательность. На- Например, случай, изображенный на рис. 1.11, когда у разных точек массива одинаковые абсциссы, не допускался. Это обстоятельство определяло и выбор класса аппроксимирующих кривых (графики функций) и способ их пост- построения. Однако предложенный выше метод позволяет достаточно успешно строить интерполяционную кривую и в более общем случае, когда нумерация точек массива Рис. 1.11 / = 0, L т) и их расположение на плоскости, как правило, не связаны (рис. 1.12). Более того, ставя задачу построения интерпо- 0 .3 7. 4. т2 Рис. 1.12 ляционной кривой, можно считать заданный массив неплоским, то есть Ясно, что для решения этой общей задачи необходимо существенно расширить класс допустимых кривых, включив в него и замкнутые 26
Сплайн-функции одной переменной кривые, и кривые, имеющие точки самопересечения, и пространст- пространственные кривые. Такие кривые удобно описывать при помощи пара- параметрических уравнений x = x(r), y = y(t)y z = *(/), A.3) a<t<p. Потребуем дополнительно, чтобы функции x(r), y(t) и z(t) обладали достаточной гладкостью, например принадлежали классу С1 [а,/?] или классу С2[а,/?]. Ддя отыскания параметрических уравнений кривой, последова- последовательно проходящей через все точки массива, поступают следующим образом. 1-й шаг. На произвольно взятом отрезке [а, /?] изменения пара- параметра г вводится вспомогательная сетка а= to<U< ...<tmA<tm = Д число узлов которой совпадает с числом точек в массиве Р. 2-й шаг. По заданному массиву Р строятся 3 новых вспомогательных массива (в плоском случае два (рис. 1.13)): X = {(Г/, хд, / = 0, 1, ..., /я}, Y = {(//, уд, i = 0, 1, ..., /я}, Z = {(/,-, z/), / = 0, 1, ..., т). 3-й шаг. Для каждого из массивов X, Y и Z находятся соответствующие интерполяционные сплайн-функции x(t), y(t) и z(t). В результате для кривой, проходящей че- через точки Р/, / = 0, 1, ..., т (рис. 1.14 - плоский случай), получаем параметрические уравнения вида A.3). Замечания: 1. Предложенный подход позволяет строить замкнутые интерполяционные кривые (при Ро = Pfti); для этого при построении коорди- координатных функций x(t), y(t) и z(t) нужно ис- использовать граничные условия 3-го типа. 0 а о Рис. L13 27
Сплайны 2. Полученная кривая будет гладкой, но не обязательно регулярной, так как возмож- возможность одновременного обращения в нуль про изводных = 0, = 0, = О Рис. 1.14 для некоторого С е(яг,/?) исключать нельзя. Кроме того, эта кривая может иметь точки самопересечения. 1.1.8. Программная реализация Описанный выше алгоритм построения интерполяционного куби- кубического сплайна и вычисления его значений в произвольной точке реализован в виде подпрограммы Spline, написанной на языке Фортран: subroutine Spline (n,x,y,a,.b,c,d,z,u,v#T-'.r# * t,s,ind,ib,ax,bx,xx,sp,dsp,d2sp) r^**** ******************************************************* С С С с с с с с с с с с с с с с с с с с с с с с с с с с с * * * Программа Spline предназначена для построения интер поляционного кубического сплайна п - х - а,Ь, c,d - s>t, ы , . — Z - ind - число узлов массив (длины п), содержащий узлы интерполяции массив ('длины п) , содержащий значения функции в узлах интерполяции рабочие массивы (длины п) * * * * рабочие массивы (длины п+1) * массив (длины п), содержащий параметры сплайна * указатель режима раосты: ind=0 - программа вычисляет параметры сплайна ind=l - параметры сплайна известны хх - точка, в которой вычисляются значения сплайна и двух его первых производных ib - тип граничных условий ind = i (i=l-4) - условия i-rc типа ax,bx - значения параметров, входящих в граничные условия 1-го и 2-го типа .Результат: sp - значение сплайна в точке хх dsp - значение 1-й производной сплайна в точке хх d2sp - значение 2-й производной сплайна в точке хх ******************************************************* dimension хA),уA),аA),bA),сA),dA), ip = 1 - if (ind.eq.O) then 28
Сплайн-функции одной переме t select case bi с < di a i' b-. С ' 3; case b- с •. hi d-:' a <■ b-, С !. hi d' case hi h2 am al b-. a i. l i ne ns nf case «li 1 ) = li = 1 ) = n) = П i = П i = П) = •; 2 i 1 :■ = 1 •' = = 1 j = n ■ = П i = П ! = n '■■ = = = li = = z. = n = 2 = n - 1 (ib) 0. 0. 2 . *ax 2. 0 . G . 2.*bx 1. G . x B :• -x 1 i 3.* -:y B • -y 1 • ■ /hi - 0.5*hl*ax 2 . G . .1. x ■: n '■• - x •; n -1 ; 3.* -у-П' -у n-1 ■ •• /hi + G.5*hl*bx x-:2) - X-..1-- x •:' n ■ - x ■: n -1 ■ h2/ihl + h2i 1. - am am с'I' = al d ■ 1 .- = 3 . * • am* ■ у •. 2 ■ - у •. 1 ■ .• /hi + al* у -1 : - у n-1 ■ .• /h2 • hi = x • n-1 :■ - x • n-2 • "h2 = x •. n'1 - x • n-1 '■ am = hi/'hi + h2■ a1 = 1. - am a ■: n -1 :■ = 2 . b ■ n 71 ..■ = ami с (n -1 ;• = a 1 di.n-1' ,= 3 . * ■ am*-y ..n • - y-n-l — /h2 + a 1 * ■". у ■ n -1 ■ - у ■ n - 2 .' :■ / h 1 • nf = n - 2 ne = n - 1 :ase 4' hi = x 2 -x 1 h2 = x 3 -x 2 gG = hl/h2 - a : 2 :■ = 1 . + gG b •. 2 "■ = g G с ■ 2 ■ = G . ami = hi/ hl + h2 • al = 1. - ami cc = am:* ■: у ■: 3 .• -у •. 2 ■ ' /h2 + al * -: у •. 2 ■ -у •. 1 ■ ■ /hi ^ , 2 ' = cc + 2.*gG* iy ■ 3 .■ -у ^ 2 - /h2 h2 = x i'n > -x n-1 .:■ hi = x ■. n-1 :• -x ; n-2 :■ - gn = hl/h2
Сплайны a!n-1) = 1. + gn b(n-l) = 0. с (' n -1) = gn am = hl/(hl+h2) al = 1. - am cc = am* iy •; n) -y i n-1) \ /h2 +al * i у i n-1) -у к n d(n-l) = cc + 2.*gn*(y(n-1)-y(n-2>)/hi ns = 3 nf = n - 2 ne = n - 2 ip = I end select do j = ns ,nf hi = x(j + 1) - xi j) h2 = x'ii - xi'j-D am = h2/ h2 + hii al = 1. - am c'.j- = al a ■j ) = 2 . b ■. j ■■ = am d • j ..■ = 3.. * •' am* iy о +1) - yiji } /hi + enddc call РгсдопЗ •: a (. ip.) ,b! ip) ,с ■, ip :■ ,d ■■ ip': , u, * v,w,s,t,z •: ip) ,ne) select case •. ib) case i 3 :• z ■ n'; = z •' 1 > case ■: 4 ■ z ■•' 1 ; = gO * * 2 * z ■: 3 ! + i gO * * 2 -1. > * z i 2 ) + * , 2.*( (y •:2">' -y A) » / fXi2"i -x'l - rr Г. * * ■g 2 * У у i 3 '» -у i 2 ) ) / •" x i 3 :• -x ' 2 z ■ n : = gn**2 *z (n-2 :■ + \gn* *2 -1. ; *z ■ n-1) + 2 . * i ( У (П i -y ■. П-1 'i ) / '.' X ! П ; -X ; П- 1 ■ ; -gn**2* -.у * n-1 ; -y ; n-2 > ) / ■: x '. n -1 ' - x ■: n - 2 '! .'' i end select endif do j = 2 , n nj= 1 i f ; x ; j :• . gt. xx '■ enddc go to 1 j = ni - 41 h .= X j +1 - X •. j ; 11 = XX -' X i j '■•'■/ h ГР = i.y i j+1 ■ - у (j ■ ; /h aa = - 2 .- *rp + z у j ) + z • j +1 '• bb - -aa +rp - z(j) sp = у • j J + xx - x i, j :- ) * i. z i. j j + tt* -,bb + tt dsp= z . j-1 + tt*ibb + aa*tt* + tt*--. bb + 2 . *a d2sp = B.*bb + 6.*aa*tt)/h return end 30
Сплайн-функции одной переменной i Обращение к программе имеет вид: calI Spline(n,x,у,a,b,с,d,z ,u,v,w,t,s,ind,ib,ax,bx,xx,sp,dsp,dsp2) . Входные n - число узлов интерполяции, х - массив размерности п, содержащий узлы интерполяции, у - массив размерности п, содержащий значения функции в узлах интерполяции, ах, Ьх - значения параметров, входящих в граничные условия 1-го и 2-го типа, хх - точка, в которой вычисляются значения сплайна и его производных ind - указатель режима работы: ind = 0 - программа вычисляет коэффициенты сплайна, ind = 1 - коэффициенты сплайна известны, программа вычисляет значения сплайна и двух его первых производных в точке хх , ib - указатель типа граничных условий ib = i (i=l-4) граничные условия i-ro типа Ре. зуд ьт а, т.: z - массив размерности п, содержащий коэффициенты сплайна, sp - значение сплайна в точке хх, dsp - значение 1-й производной сплайна в точке хх , dsp2 - значение 2-й производной сплайна в точке хх. Вспомогательные переменные: a,b,c,d рабочие массивы размерности п , s,t,u,v - рабочие массивы размерности п+1. Программа Spline обращается к подпрограмме решения системы линейных уравнений с трехдиагональной матрицей Progon3 (см. при- приложение А). . Перед обращением к программе Spline необходимо: 1) задать размерности массивов х, у, z, a, b, с, d, u, v, не забывая, что размерности массивов и и v на единицу больше размернос- размерностей массивов х, у и т. д.; 2) присвоить фактические значения элементам массивов х и у и переменным n, ib и ind (ind = 0 при первом обращении к программе, ind = 1 при повторных обращениях). Пример. Построим на отрезке [0,2;г] равномерную сетку из 21 уз- № и вычислим значения функции f(x) = sin(x) в этих узлах. По этим Данным построим интерполяционный кубический сплайн, удовлетво- удовлетворяющий граничным условиям 1-го типа, и сравним значения задан- заданной функции и ее двух первых производных со значениями построенного сплайна и двух его первых производных в точках Y 4- Y ^ л; — ————— j — u i ху. 1 «& ~ 7 7 7 31
Сплайны Программа для решения этой задачи может иметь следующий вид: dimension х ( 81 i ,7(81 i , a ( 82 .) , b (. 82 ;> ,с(82) , d (82 ) , * z (82 • ,u(82 ) ,v(82 ) , vj ( 8 2 ) ,s(82) ,t (82) data pi /3.1415926/ n = 21 h = 2.*pi/20 с do j = 1,21 x i j :■ = h * (j -1) 7 (j '.' = sin (x (j ) ) enddc ib = 1 ax = 1. bx = 1. call spline \п,ъ,у ,&,Ъ ,<z , d, z ,u, v,w, t , s , * 0,ib,ax,bx,xx,sp,dsp,d2sp) delO = С. dell = 0. del2 = G. do j = 1,41 h = 2,*pi/40. xx = h* •j-1) yy = sin-, xx) dl = cos-, xx) d2 =-sin-,xx) call spline (n, x, 7, a , b, с , d, z , u, v, w, t, s, * 1,ib,ax,bx,xx,sp,dsp,d2sp) if iabs'77-sp).gt.delO) delO= abs(y7~sp) if ■:.abs ;dl-dsp).gt .dell j dell= abs(dl-dsp) if (abs d2-d2sp) .gt.del2} del2= abs(d2-d2spj enddc ■ print *,' max I f ix'1'-S i'x ; I = ', delO print *,' maxlf lix)-S"!X!|= ', dell print *,' maxlf"'X:-STI (xi |= ', del2 step end Вычисления по этой программе привели к следующим результа- результатам: max|f(x)-S(x)| = 2.568960E-05, max|f(x)-Sf(x)| = 6.669760E-05, max|r(x)-Sff(x)| = 8.250833Е-03. Максимум вычислялся на множестве точек 5с\. Эти результаты показывают, что интерполяционный кубический сплайн действитель- действительно обладает хорошими аппроксимационными свойствами. Следующая программа строит интерполяционный сплайн, удов- удовлетворяющий граничным условиям 2-го типа, dimensien x \ 31 • , у ■: S1 :■ ,3182;' , Ь ■: 82 ':■ , с i 82 ) , d [ 82 ) , * z ■: 32 ) ,u( 82 :• ,v 32 » ,w(82 ) ^i 82 ) ,t < 82 ■ data pi /3.1415926/ n = 21 h = 2.*pi/20 32
Сплайн-функции одной переменной do j = 1,21 x(j) = h*ij-1j у (j .) = sin (x (j i ) enddo ■ ■ ib = 2 ax = 0. bx = 0 . call spline '. n, x,у, a, b, с , d, z , u, v, w, t, s , .* 0 , ib,ax,bx,xx, sp,dsp,d2sp} delO = G. dell = 0. del2 = 0. do j = 1,41 . h = 2.*pi/40. .: xx 4= h * ■:. j -1 ) yy = s i n ■: xx '•• . . dl = cos xx ■• d2 = -sin;'xx; call spline •: n,x,y ,a, b,c ,d, z ,u, v,w, t, з , * ' 1,ib,ax,Ъх,xx,sp,dsp,d2sp) if •. abs •.yy-sp'j .gt.delO ) deiG= abs (yy-spi if (abs • dl -dspi . gt. dell ■ dell= abs i.dl-dsp ■ if ■: abs ■.d2-d2sp"? .gt .del2 ■ del2= abs ;'d2.-d2sp .• enddo print *,' max | f x • -S •. x • | = ', del С print *,' max I f ' ' ■ x -S ' ' x :■ | = ', dell ' . print *,' max | f";-:x; -S" x |= .' , del2 stop end Вычисления по этой программе привели к следующим результатам: max|f(x)-S(x)| = 2.574921E-05, max|f(x)-S'(x)| = 5.531311Е-05, max|f(x)-Slf(x)| = 8,254051E-03. Максимум вычислялся на множестве точек 5EJ из предыд>ацего примера. Если требуется по тому же массиву данных построить интер- интерполяционный сплайн, удовлетворяющий граничным условиям 3-го типа, то можно воспользоваться программой, текст которой приведен ниже. . dimensien x •31 ■ , у ■. 31 ■ , а - 82 ■ , b ■■ 32 .■ , с ■ 32 • , d 52 ■ , * z ■: 3 2 : , и ■ 3 2 , v 3 2 , *.*: 3 2 ■■ , s ■ 5 2 , с. • 3 2 ■ dana pi /3 .1415926/ n = 21 h = 2.*pi/2 0 с dc j = 1#21 X-: j :• = h* -,j-l ..- у ■. j j = siri'-.x-j ■• . enddo ib = 3
Сплайны call spline * n, x, у, a, b, с, d, z , u, v / тл?, t, s , * 0,ib/ax/bx/xx/sp/dsp#d2sp) delO = 0. . dell = 0. del2 = 0. do j = 1,41 h = 2.*pi/40. xx = h * \ j -1 .:■ у у = s i n (xx.; dl = CCS'XX; d 2 = - s i n ■ xx ■ call spline n,x,y,a,b,c,d,z,u,v,w,t,3, * 1, ib/ax/bx,xx/sp/dsp/d2sp'i if ■ abs •:yy-sp ; .gt . delO'i delO = absiyy-sp) if • abs ■ dl -dsp'» . gt. dell') dell= abs(dl-dspi if ■ abs ■ d2-d2sp} .gt .del2 ;• del2= abs* d2-d2sp.' enddc print *,' max I f ix :•-S i x) | = ', delO print *,' rnaxl f ' ' ix) -S1 ' ix) I = ', dell print *,' maxlf" •:x»-S" fx- |= ', del2 step end Вычисления по этой программе привели к следующим результатам: max|f(x)-S(x)| = 2.574921E-05, max|f(x)-Sf(x)| = 5.501509E-05, max|r(x)-SM(x)| = 8.254051Е-03. Максимум вычислялся на множестве точек 5с; из предыд^тдего примера. Следующая программа строит и тестирует интерполяционный сплайн, удовлетворяющий граничным условиям 4-го типа. dimension х ■ 81 ■• ,у . 31 ■ ,а (82 ) ,Ы 32 ;■ ,с > 32 :• ,d [ 82 ■ , * z . 32 ) /u'C2i Л" 82 :■ /w-'32 :• ,S' 82 .• ,t( 82 ■ data pi /3.141592c/ n = 21 h = 2 . *pi/20 ao i = 1,^1 "x j = h* j-1■ у j •■ = s i n t x i j :• :• enddo ■ ib = '4 call зр1ine n,x,у,a,b,с,d,z,u,v,w,t,s, 0 , ib,a.x,bx,xx, sp,dsp/d2sp'- deiG = G. deli = G. del2 = 0. do j = 1,41 • ■ h = 2.*pi/40. xx = h *■j-1 yy = s i n:xx dl = cos'xx d2 =-sin;'xx; 34
'■г. Сплайн-функции одной переменной ■ call spline (n,x,y ,a ,b,c ,d, z ,u, v,v;, t, s , * . 1,ib/ax/bx/xx/sp/dsp/d2sp) if iabs(yy-sp).gt.delO) delO= abs(yy-sp) if i'abs ( dl-dsp'i . gt .dell ) dell= abst.dl-dsp; * if ■: abs ( d2-d2sp> . gt. del 2 ) del 2- abs ;d2-d2sp - enddo print *,' max I f i. x)-S i x : | - ', delO print *,' max I f ' ' '. x) -S ' ' (x) I = ', dell print *,' max|f"(x)-S"(x!|= ', del2 stop end Вычисления по этой программе привели к следующим резуль- результатам: max|f(x)-S(x)| = 8.162856E-05, max|f(x)-S'(x)| = 1.665711Е-ОЗ, max|r(x)-S"(x)| = 1.897535E-02. Максимум вычислялся на множестве точек л: из основного примера. Текст программы Spline находится в файле spline.for в поддирек- поддиректории INTERPOL на дискете, которую можно приобрести в изда- издательстве "Диалог-МИФИ". В эту же поддиректорию помещены файлы, содержащие примеры применения программы Spline при других граничных условиях. Подробную информацию об именах этих файлов и их содержании можно найти в файле readme.txt из дирек- директории SPLINES этой дискеты и в приложении В нашей книги. 35
Сплайны Рис. 1.15 1.2. Сглаживающие кубические сплайны 1.2.1. О постановке задачи сглаживания Пусть заданы сетка со и набор чисел }% Уи ..., Ут-U Ут- Комментарий к исходным дан- данным. На практике часто приходится иметь дело со случаем, когда значе- значения >7 в массиве xh Уд, ' - 0, 1, ..., /И, заданы с некоторой погрешностью. Фактически это означает, что для каждого / = 0, 1, ..., т указан интер- интервал * (с/, dj) или 0'/" 8ьУ1+$) и любое число из этого интервала может быть взято в качестве значе- значения >•/• Величины у\ удобно интер- интерпретировать, например, как резуль- результаты измерений некоторой функции у(х) при заданных значениях пере- переменной дс, содержащие случайную погрешность. При решении задачи восстановления функции по таким ее "экспериментальным" значениям вряд ли целесообразно использовать интерполяцию, поскольку интерполяционная функция будет послуш- послушно воспроизводить причудливые осцилляции, обусловленные случай- случайной компонентой в массиве д>/. Более естественным является подход, основанный на процедуре сглаживания, призванной как-то умень- уменьшить элемент случайности в результатах измерений. Обычно в таких задачах требуется найти функцию, значения которой при х = xh / = 0, 1, ..., /я, попадали бы в соответствующие интервалы и которая обладала бы, кроме того, достаточно хорошими свойствами (рис. 1.15). Например, имела бы непрерывные 1-е и 2-е производные или же ее график был бы не слишком сильно искривлен, то есть не имел сильных осцилляции. Задача подобного рода возникает и тогда, когда по заданному (точно) массиву (xh yf), i = О, I, ..., /я, требуется построить функцию, которая проходила бы не через заданные точки, а вблизи них и к тому Рис. 1.16 36
Сплайн-функции одной переменной же изменялась достаточно плавно (рис. 1.16). Другими словами, иско- искомая функция как бы сглаживала заданный массив, а не интерполиро- интерполировала его. Пусть заданы сетка со и два набора чисел уо,у\, ...ьУт-иУт и Ло > О, Ai > 0, ..., \тЛ > О, Ат > 0. Задача. Построить на отрезке [а, Ь] гладкую функцию а(х), значе- значения которой в узлах сетки со отличаются от чисел у\ на заданные вели- величины Л/ > 0 I о- (*,) - yt | < Л/, / = 0, 1, ..., /и-1, т. Замечание Сформулированная задача ссаживания состоит в восстановлении гладкой функции, заданной таблично. Ясно, что такая задача имеет много различных решений. Накладывая на конструируемую функцию дополнительные условия, можно добиться необходимой однознач- однозначности. 1.2.2. Определение сглаживающего кубического сплайна Сглаживающим кубическим сплайном S(x) на сетке со называется функ- функция, которая: 1) на каждом из отрезков [xh X/+i], / = 0, 1, ..., /и-1, представляет собой многочлен 3-й степени, S(x) = S,{x) = 4'» + flJ'V - х,) + 4V - x,J + 4"(* - xf ; 2) дважды непрерывно дифференцируема на отрезке [а, Ь], то ефъ принадлежит классу С 3) доставляет минимум функционалу ТП где >'/ и pi > 0 - заданные числа; 4) удовлетворяет граничным условиям одного из трех указанных ниже типов. 1.2.3. Граничные (краевые) условия Граничные (краевые) условия задаются в виде ограничений на значе- значения сплайна и его производных в граничных узлах сетки со. Граничные (краевые) условия 1-го типа Ъ7
Сплайны - на концах промежутка [а, Ь\ задаются значения 1-й производной искомой функции. Граничные (краевые) условия 2-го типа S (а) = О, S (Ь) = О - 2-е производные искомой функции на концах промежутка [а, Ь\ рав- равны нулю. Граничные (краевые) условия 3-го типа S(a) = S(b)9 S'(a) = S'(b\ S"(a) = S"(b) называются периодическими. Теорема. Кубический сплайн S(x), минимизирующий функционал A.1) и удовлетворяющий краевым условиям одного из указанных трех типов, определен однозначно. Определение. Кубический сплайн, минимизирующий функционал J(f) и удовлетворяющий граничным (краевым) условиям /-го типа, называется сглаживающим сплайном 1-го типа. Замечание На каждом из отрезков [xif *,•+//, / = ft I, ..., т-7, сплайн S(x) является многочленом 3-й степени и определяется на этом отрезке четырьмя коэффициентами. Всего отрезков - т. Значит, для того, чтобы полностью определить сплайн, необходимо найти 4т чисел ^\^\^\а^, 1 = 0,1, ...,т-\. Условие 5(x)eC2[fli] означает непрерывность функции S(x) и ее производных S'{x) и S"(x) во всех внутренних узлах сетки со. Число таких узлов - т-\. Тем самым для отыскания коэффициентов всех многочленов получается Ъ(т-\) условий (уравнений). 1.2.4. Построение сглаживающего кубического сплайна Опишем способ вычисления коэффициентов кубического сплайна, при котором число величин, подлежащих определению, равно 2т + 2. На каждом из промежутков [xh x/+i], / = 0, 1, ..., /w-1, сглаживаю- сглаживающая сплайн-функция ищется в следующем виде: S(x) = S,(x) = z,(l -1) +1 ^t - -£■ /A -1)[B - t)n, +A + /)я/+1]. Здесь U — Y — Y t — ~ *' ni Л/+1 Д/* l , » 38
Сплайн-функции одной переменной а числа z, и nh / = О, 1, ..., /я, являются решением системы линейных алгебраических уравнений, вид которой зависит от типа граничных (краевых) условий. Опишем сначала, как находятся величины Л/. Для краевых уаювий 1-го и 2-го типа система линейных уравнений для определения величин /?,. записывается в следующем виде: ci-irii-2 + K\nt-\ + aini + binM + Ci"i+i = ft' ' = 2, 3, ..., m-2, где / ' 6 ' /7, 1 J_ Л, , + ht \ 1 1 h: у I 1, Z, ...? tYl.^ ; >0 - известные числа). Коэффициенты / — 1, 2, ..., /и-3, / = 1, 2, ..., m-\ зависят от выбора граничных условий. Граничные (краевые) условия 1-го типа: 0 3 hi / 1 6 ho\ho hj Р\ ~~ 1 2 ■Pl> = У> ~Уо- у' A-4) 39
Сплайны K\ l / \ l ' r"l/Vl+/M> Cm-2="; : Pm-l / m-1 6 /Vl 1 1 + ■ A«-J 1 Pm-l ~~tf~~P m-1' "m-\ _ . j Ут У т-\ от Ут Граничные (краевые) условия 2-го типа: до = 1, bo = 1, Со = 0, go = 0, ат = 1, *m.r = 1, cw_2 = 0, gm = 0. В случае граничных (краевых) условий 3-го типа система для определения чисел л7-, / = 1, 2, ..., т, записывается так: йричем все коэффициенты вычисляются по формулам A.4) (величины с индексами к и т + к считаются равными: по = пт fa = hm ao = ат и т. д.). Важное замечание . Матрицы систем невырожденны, и потому каждая из этих систем имеет единственное решение. Если числа щ найдены, то величины z\ легко определяются по формулам 2.=уг-ррп \ = 1, 2, ..., /и, где А) = Т-0;1 " "о) , ^ А = —( ) В случае периодических фаничных (краевых) условий hm - ho, пт - по, и А) = Dm =Т~(П1 ~ "п,) "т "т-\ 40
Aft % Сплайн-функции одной переменной 1.2.5. Выбор весовых коэффициентов Выбор весовых коэффициентов ph входящих в функционал A.4), поз- позволяет в известной степени управлять свойствами сглаживающих сплайнов. Если все pi = 0, то z/ = yt и сглаживающий сплайн оказывается интерполяционным. Это, в частности, означает, что чем точнее заданы величины }>/, тем меньше должны быть соответствующие весовые коэффициенты. Если же необходимо, чтобы сплайн прошел через точку (х^9 у^)9 то отвечающий ему весовой множитель р^ следует положить равным нулю. В практических вычислениях наиболее важным является выбор величин pf. Пусть Л/ - погрешность измерения величины yt. Тогда естественно потребовать, чтобы сглаживающий сплайн о{х) удовлетворял условию A.5) или, что то же pi А <А... - В простейшем случае весовые коэффициенты pt можно задать, например, формулой где с - некоторая достаточно малая постоянная. Однако такой выбор весов pi не позволяет использовать "коридор", обуслоштенный по- погрешностями величин у{. Более рациональный, но и более трудоемкий -алгоритм определения величин pf может выглядеть следующим об- образом. lit \ Если на к-й итерации величины D) найдены, то полагают А- 0 ■ п п ри ри к: > < 8 где е - малое число, которое выбирается экспериментально с учетом разрядной сетки компьютера, значений Д/ и точности решения систе- системы линейных алгебраических уравнений. Если на k-ft итерации в точке xt нарушилось условие A.5), то по- последняя формула обеспечит уменьшение соответствующего весового коэффициента pf. Если же <Af, 41
Сплайны то на следующей итерации р[ > р\к . Увеличение р{ приводит к бо- более полному использованию "коридора" A.5) и в конечном счете к более плавно изменяющемуся сплайну. 1.2.6. Построение сглаживающих онлайновых кривых при помощи сплайн-функций Выше рассматривались массивы, точки которых были занумерованы так, что их абсциссы образовывали строго возрастающую последова- последовательность. Например, случай, когда у разных точек массива одинако- одинаковые абсциссы, не допускался. Это обстоятельство определяло и выбор класса сглаживающих кривых (графики функций) и способ их по- построения. Однако предложенный выше метод позволяет достаточно успеш- успешно строить сглаживающую кривую'и в более общем случае, когда ну- нумерация точек массива P = {p,(r,,.v,), / = 0, L ...,/;/} и их расположение на плоскости не связаны. Более того, ставя задачу построения сглаживающей кривой, можно считать заданный массив неплоским, то есть P = {P,(*,-V,^,)> i = 0, L ...,///}. Ясно, что для решения этой общей задачи необходимо сущест- существенно расширить класс допустимых кривых, включив в него и замкну- замкнутые кривые, и кривые, имеющие точки самопересечения, и прост- пространственные кривые. Такие кривые удобно описывать при помощи параметрических уравнений x = x(t), У = У@> * = *('), A.6) a<t<p. Потребуем дополнительно, чтобы функции x(r), y(t) и z(t) облада- обладали достаточной гладкостью, например принадлежали классу С1 \а, или классу С2[#. Для отыскания параметрических уравнений сглаживающей кри- кривой поступают так: 1-й шаг. На произвольно взятом отрезке [а, /?] изменения пара- параметра / вводится вспомогательная сетка а= h <t\ < ...</w.i <tm = Д число узлов которой совпадает с числом точек в массиве Р. 42
I Сплайм-фумкции одной переменной "к ? 2-й шаг. По заданному массиву Р строится 3 новых вспомогатель- вспомогательных массива (в плоском случае два): Y=('/> уду i = 0, 1, ..., т, Z=(//, г,-), / = 0, 1, ..., т. 3-й шаг. Для каждого из массивов X, Y и Z находятся соответст- соответствующие сглаживающие сплайн-функции x(t), y(t) и z(t). В результате для кривой, сглаживающей массив Р;, / = 0, 1, ..., /и, получаем параметрические уравнения вида A.6) (см. рис. 1.14, плос- плоский случай). Замечания: 1. Предложенный подход позволяет строить замкнутые сглаживаю- сглаживающие кривые (при Ро = Рт ); для этого при построении координатных функций x(t), y(t) и z(t) нужно использовать граничные условия 3-го типа. 2. Полученная кривая будет гладкой, но не обязательно регулярной, так как возможность одновременного обращения в нуль производных, *'(*") = 0, /(*') = 0, *'(*') = О для некоторого Г е(а,/?) исключать нельзя. Кроме того, эта кри- кривая может иметь точки самопересечения. 1.2.7. Программная реализация Описанный выше алгоритм построения сглаживающего кубического сплайна и вычисления его значений в произвольной точке реализован в виде подпрограммы Smspiine, написанной на языке Фортран: subroutine Smspiine .n , ib, ind ,x,y,a,Ь,с,d,e , g ,'rho , * ax , bx , u , v, v:, p , q, r , s , t, aa , dd, zm, xx, sp , dsp , d2 sp t-. ************************************************************ с Программа Smspiine строит сглаживающий сплайн -- * с по заданному* массиву точек * с п - число точек в массиве исходных данных • * is длины п, содержащий х-координаты точек * тб длины п, содержащий у-координаты точек * :з длины п, содержащий весовые коэффициенты * - * с ind - код режима работы: * с ind = С - программа вычисляет параметры сплайна * с ind = 1 - параметры сплайна известны * с ib - код типа граничных условий * с ib = i i = 1-3 ■ - условия i-ro типа * — * с а , Ь, с , d, е , g , zm , aa , dd - рабочие массивы > длины п '■ * * 43
Сплайны с q,r,s,t - рабочие массивы (длины п+2) с ах, Ьх - параметры, входящие в граничные условия 1 с типа с ... с Результат: с 'sp - значение сплайна в точке хх с dsp - значение 1-й производной сплайна в точке х с <32зр - значение 2-й производной сплайна в точке х Q С , геа 1 а A :- , b A ■ , с <; 1 ;• , d (. 1.; , е •. 1 ) , * g ■1 ■ , rho ■, I ) , аа A i , г ■:' 1 ■ real v •: 1'! , v: A • , p •: 1) , q '. 1) , t •' 1 :• , s ; 1 '• , zm ■ 1 • , dd ■. 1 '• real x ; 1 ''• , у ' 1 i с nn = n if ■. ind.eq.O; then select сазе ; ib :■ :ase hi. a. 1 h2 b'l c- 1 a-1 e>. 3 hi h2 а :' n bn : 1 i -1 e ■ 1 ■ e 2 d 1 d 2 • c-n-1 с n ■ x 2 -x 1 Ы/3. + -rho-. 1 i+rhc-2 :• :-/hl**2 x • 3 :• - x 2 hl/6.- l./hl +l./h2;.*rhC'2 •/hi - rhc 1 ■ /hl**2 rhc: 2 ■ / -. hl*h2 • >:y ■■ 2 ':■ - у ■: 1 ■ '• /hi - ax Cil"! x ■. n ':■ - X ■■ n -1 • X ■ П - 1 '; - X ■ П - 2 '• hl/3. + :rho:n-l .■+rhc-.n- > /hl**2 hl/6.- i l./hl +l./h2 *rhcTi-l'/hl ; /hl ** Т-, _ 1 ; / V-, 1 * Ц С и 0 i l ■ -л и . g • n ■ - bx - •■ у ■ n ■ - у ■. n-1 • • /hi e • n ■ = с . n - 2 :ase z а 1 а ■ п • b 1 bn-1 ■ с 1 п-2 д П е 2 е • 3 d ■■ 1 b ■ n с ■ n 1 1 - 0 - G- = С - и = 0 = и -у - U 44
Сплайн-функции одной переменно ... *4/. t 4 * * с (n -1 '.• = С . .case i 3') hi = x 2i - x s1) Ь2 = Х'П: - Xi.n-1.) h 3 = x . 3 :■ - x i 2 ") ail") = (hi + h2)/3. + rhc i n-1 ■ /h2 * *2 + rhc > 2 :■ /hi * *2 + ■l./hl + l./h2>**2*rhcl> b-1» = hi/6. -((l./h2 + l./hl > *rhc;b + U ./h2 с il) = rhc ■ 1 :• g ■ 1 .• = •. у • 2 ■ d : 2 ) = b ; 1 ■■ e-l- = с 1 • h4 = x■n-1■ - x!n-2) с n-2> = rhc n-1 )/ih2*h4! с n-1 • = rhcn.i /ih2*hl} ■ill1 — HZ / j . "d-.l.- = b-n-1 ■ e ■. 1 • = с ■. n - 2 ■ e •: 2 i = с '. n-1 g •. n -1 :■ = •: у ; n nn = n - 1 end select :• *rho.:2'i > /h2 - y(n-ln/h2 + 1 ./h2 :> *rhc • n-1 ' + 1./П.2 + l./hl ! *rhcn'i * /h2 - y(n-l!)/h2 - (y(n-li - y(n-2 /h4 h2 do i = 2, n-1 * hi = x•i: - x(i-1) = x ■. i ■>■ 1 • - x (i) a-, i-- = -hl + h2)/3. + rhc. i-l)/hl**2 + rhcii + l.)/h2**2 ■l./hl + l./h2 . **2*rhc.i) — .. j ■ i + l ■ ~y l' ) / n z — '. у ' i ' - у ' i — J. ' ; / n x if ■: i . le. : n-2 ) ') then * * h3 = xi i + 2 :■ -x ■ i + 1 :- :■ b d: l i + end - if h2 = b D j • • 1 ) 1. /h2 ■*rhc i':- + l./h3-*rhoii /h2 if 'i.le.n-3' then с i = rhoii + 11 / ih2*h3:- e ■ i + 2 ■ = с ■: i ':■ endif enddc U V" ^ ^f i"~* "*""< ^* * nn, a , b, с , d, e, g, u, v, w, p, q, r , s , t, aa , dd , zm aa -. 1 ■ = у 1 : - rho ; 1 •■ * ; zm i. 2 • - zm ; 1 '• :• / (x 2 :■ -x \ 1 a a . n ■ = *, + V T: Г-. 1 - zm ; n -1 ; :■ / x ■: n ■ - x •. n -1 if •ib.eq.3 then zm ■ n = zm i'l :• di = zm ■' 2 :■ - zm ■: 1 :• .• / • x ; 2 '; -x - 1 ■ ":■ d i = di - \ zm •. n ;• - zm ■. n -1 ■ .- / - x ; n :• - x ■. n -1) :■ aa ■ 1 ■ = У'1) - rho(l"!*di a a ■ n ■ = a a A i endif do i r 2, n-1 di = ■' zm ■ i +1'; - zm •: i ':■ '■ / ■:' x • i +1 ■• - x •. i -i l
Сплайны di = di - (zm ( i ) - zm (i -1) j / i' x •:. i } -x < i -1) aaii) = у (. i ) - rho(i)*di enddc else dc i = 2 , n ni= if x ■' i :• . gt. xx i exit enddc с i = ni - 1 h = x (i +1 :■ - x i i '■• tt = (xx - x ( i ■ ;■ /h sp = aa ■■ i :■ * •: 1.-tt ■ + aa■i +1'*tt * - h**2/6.*tt* .. l.-tt i * * •:' ■.' 2 . -11 :■ * zm • i .) + * 1. +11; * zm ■ i +1 ; :■ dsp= ■ aa ■: i + 1 '•■ - aa > i < ;■ /h - * h/c.*i-:2. - 6.*tt + 3 . *tt**2 :■ *zm: i • * + •. 1 . - 3 . *tt**2.) *zm \ i + 1 • • d2sp = '1. - tt'*zm'is + tt*zmi+l; end if return end Обращение к программе имеет вид: call Smsp 1 ine •. n, ib, ind, x, у , a , b, с , d , e, g, rhc, ax, bx, * u, v, v;, p, q, r , s , t, aa , dd, zm , xx, sp, dsp , d2sp • Входные данные: n - число точек в массиве исходных данных; х - массив размерности п, содержащий х-координаты заданных точек; у - массив размерности п, содержащий у-координаты заданных точек; rho - массив размерности п, содержащий значения весовых коэффициентов; ind - код режима,работы: ind = 0 - программа вычисляет параметры сплайна, ind = 1 - параметры сплайна известны, и программа вычисляет значения сплайна и первых двух его производных в точке хх; ах, Ьх - значения параметров, входящих в граничные условия 1-го типа; хх - точка, в которой вычисляются значения сплайна и его производных; ib - указатель типа граничных условий: ib = i (i=l-3) граничные условия i-ro типа. 46
Сплайн-функции одной переменной Результат: аа - массив размерности n, aa(i) содержит значения сглаживаю- [его сплайна в точке x(i); z - массив размерности n, z(i) содержит значения 2-й производ- [ой сглаживающего сплайна в точке x(i); sp - значение сплайна в точке хх ; dsp - значение 1-й производной сплайна в точке хх ; dsp2 - значение 2-й производной сплайна'в точке хх. 1 j Вспомогательные переменные: I a, b, с, d, e, g, zm, аа, dd - рабочие массивы размерности п , р, q, r, s, t, u, v, w - рабочие массивы размерности п + 2. 1 Программа Smspline обращается к подпрограмме решения систе- системы линейных уравнений с 5-диагональной матрицей Progon5 (см. приложение А). Чтобы показать, как пользоваться программой Smspline, рассмот- рассмотрим следующий пример, имитирующий сглаживание эксперименталь- экспериментальных данных. Пусть в файле input.dat содержатся результаты 21 "измерения" функции f{x) = sin(x) + £ в узлах сетки п 20 / = 1. ..., 21} I где погрешность измерения £ представляет собой случайную V | величину, равномерно распределенную на отрезке [0.2, 0.2]. По результатам "измерений"' построим сглаживающий сплайн, /удовлетворяющий граничным условиям 1-го типа S'@) = l, S\k) = -\ и протабулируем в 101-й точке с координатами П (у-1). у = 1,-2, ..., 101. j Гг В качестве весовых коэффициентов возьмем величины р. =0.2, / = 1. 2, ..., 21. Программа для решения этой задачи может иметь следующий вид: 1 а ■ ■■■, Ь • 1 •j u с ■ 1G 0 , d ■ 1 0 0 ■ , е •. 1G G , д 10 0 ; rea I v: IG 0 ■ , u •: 10 0 , v IG G , з 1 0 G , zm •: 1G G ■ rea 1 r ; 1G G :■ , t 1G G , , p 1G G ■ , q . 1G G ,• , rho ■ 1G G • real aa ■'1GG .' ,dd 1GG , х.100;,у 100- data pi /3.1415926/ open 'l,file = 'input_l.dat1' 47
Сплайны read A,*) n dc i = l,n readA,*) x (i ) , у(i), rho(i) enddc read A,* ) ax, bx с ib = 1 ■ ■ call Smspline(n,ib,0,x,y,a,b,c,d,e,g,rhc,ax,bx, * - u,v,w,p,q,r,s,t,aa,dd,zm,xx,sp,dsp,d2sp) h = pi/100. с dc i = 1,101 • ■ • xx = h * •: i -1) call Smsp1i ne■n,i b,1,x,у,a,b,с,d,e,g,rhc,ax,bx, * u , v, v:, p, q, r, s , t, aa , dd ,zm, xx, sp, dsp, d2 sp} write > 2 ,1 ■ xx, sp, sin xx > , dsp, ccs xx :■ ,d2sp, -sin i xx .• enddc stop 1 format ; 7 -f3.4, 2x; :■ end • . Результаты вычислений, проведенных по этой программе, приве- приведены на рис. 1.15. На этом рисунке точками отмечены исходные дан- данные и представлены: график сглаживающего сплайна, график интер- интерполяционного сплайна, удовлетворяющего тем же граничным условиям, и график синусоиды. На рисунке видно, что осцилляции, ярко выраженные на графике интерполяционного сплайна, практически полностью отсутствуют на фафике сглаживающего сплайна. Графики первых производных обоих сплайнов представлены на рис. 1.16. Разница в поведении вторых производных еще более значительна. Если требуется построить сглаживающий сплайн, удовлетворяю- удовлетворяющий граничным условиям 2-го типа, то следует воспользоваться прог- программой, текст которой приведен ниже. Ы real а 10 0 ■ , b •. 10 С •', с ■ 10 0 , d 10 0- , е ■ 10 0 ■ , g ■■ 10 0 • геа 1 >; • 10 0 ■ , и . 10 0 : , v 10 0 • , з ■. 10 0 ' , zm ■: 10 0 ■ геа 1 г ■. 10 0 ■ , t ■. 10 0 ■ , р 10 0 , q ■ 10 0 ■ ,. rhc • 10 О геа 1 аа ■10 0 ; , dd i 0 С ■ , х ■ 10 0 ■ , у ■ 10 0 '■ data pi /3 .1415?2о/ open ■. 1, f ile - ' input_2 . dat' • read • 1, * ■ n dc i = 1, n read i , * ■ x ■ i , у i '■ , rhc i ■ end ib = 2 call Smspli ne■n,i b,0,x,у,a,b,с,d,e,g,rhc,ax,bx, u, v , w, p , q , r, s , t, aa , dd, zm, xx, sp ,.dsp, d2 sp • i = Z . * p 1 / 1 'J J . dc i = 1,101 xx = h * •■ i -1 i 48
Сплайн-функции одной переменной call Smspline(n,ib,1, x,y,a,b,c,d,e,g,rhc,ax,bx, * u,v,w,p,q,r,s,t,aa,dd,zm,xx,sp,dsp,d2sp) write B,1) xx, sp, sin (xx) ,dsp;cos (xx) ,d2sp, -sin (xxi enddo с step 1 formatG(f8.4,2x)) end Здесь подразумевается, что исходные данные для этого примера находятся в файле input_2.dat. Следующая программа предназначена для построения сглаживаю- сглаживающего сплайна, удовлетворяющего граничным условиям 3-го типа. real а ■:' 10 О .• , Ь ■. 10 0 ■ , с •: 10 0 ) , d A0 0 ) , е A0 0 ) , g A0 О) г еа 1 v: ■, 1С 0 .■ , и A0 0 ) , v 1.10 0) , s A0 0) , zm A0 О) real г « 100 '• , t < 10 0 ) , р A00 ) , q A00 ) , rho A00) real aa - 100 :■ ,ddA00 ) ,хA00) ,7A00) data pi /3 .14159.26/ open 'l,file-= 'input__3.dat') read ■1, * • n do i = 1,n read ! 1, * '.■ x(i), у ( i ) , rho(i) enddc с - ib = 3 call Smspline(n,ib,0,x,y,a,b,c,d,e,g,rhc,ax,bx, * u, v,V7,p,q,r ,s , t ,aa,dd, zm,xx,sp,dsp,d2sp ' h = 2.*pi/100. CIO 1 - 1 , 1 U 1 xx = h* •. i-1 ;• -1. e-5 call Smspline (n, ib, 1 ,x ,y ,a ,b,c ,d,e,g, rho,ax,bx, * и , v, v:, p, q, r, s , t, aa , dd, zm, xx, sp, dsp, d2 sp . wrice .2,1 ■ xx, sp, sin ''xx') ,dsp,ccs ('xx) ,d2sp, -sin ■: xx enddo stop 1 format • 7 ■ f 3 .4 , 2x"» :• end Исходные данные для этого примера находятся в файле input_3.dat. Текст программы Smspline находится в файле smspline.for в поддиректории SMOOTH на дискете, которую можно приобрести в издательстве "Диалог-МИФИ". В эту же поддиректорию помещены файлы, содержащие примеры применения программы Smspline при других граничных условиях. Подробную информацию об именах этих файлов и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 49
Сплайны 1.3. Другие сплайны 1.3.1. Линейное пространство кубических сплайн-функций Множество кубических сплайнов, построенных на отрезке [а, Ь] по сетке со с т + 1 узлом, является линейным пространством размер- размерности т + 3: 1) сумма двух кубических сплайнов, построенных по сетке со, и про- произведение кубического сплайна, построенного по сетке со, на про- произвольное число также являются кубическими сплайнами, постро- построенными по этой сетке; 2) любой кубический сплайн, построенный по сетке со из т + 1 узла, полностью определяется т + 1 значением величин yt в этих узлах и двумя граничными условиями - всего т + 3 параметрами. Выбрав в этом пространстве базис, состоящий из т + 3 линейно независимых сплайнов ау(х), / = 1, ..., т +3, мы можем записать про- произвольный кубический сплайн о(х) в виде их линейной комбинации т+3 причем единственным образом. Замечание Подобное задание сплайна широко распространено в вычислительной практике. Особенно удобным яв.гяется базис, состоящий из так на- называемых кубических В-сплайнов (базовых, или фундаментальных, сп.шйнов). Применение В-сп.шйнов позволяет существенно снизить требования к объему памяти компьютера. 1.3.2. Кубические 8-сплайны Определение ^-сплайнов В-сплайном нулевой степени, построенным на числовой прямой по сетке со, называется функция вида 1, < о, X € xrxi~\ ' ' ■ xi>x^\ В-сплайн степени k>\s построенный на числовой прямой по сет- сетке со, определяется посредством рекуррентной формулы Xi+k+\ 50
Сплайн-функции одной переменной Графики 2?-сплайнов 1-й #j (x) - и 2-й - В] (х) - степеней представлены со- соответственно на рис. 1.17 и 1.18. ^-сплайн произвольной степени к Может быть отличен от нуля только на не- некотором отрезке (определяемом к + 2 уз- q Лами). Кубические 2?-сплайны удобнее ну- нумеровать так, чтобы сплайн В) Рис. 1.17 ьыл отличен от нуля на отрезке Приведем формулу для кубического сплайна 3-й степени для слу- случая равномерной сетки (с шагом И). Имеем: *- + 2)\ хе 6 I h xe [x,.ltx,], 1 6 ('- о Х для друг их х. Функция а) дважды непрерывно диффе- дифференцируема на отрезке [а, Ь\, то есть принадлежит классу б) отлична от нуля только на четырех последовательных отрезках [х,--2, X/.il, [.X/.i, X/], [Xh ,X/+il, [-X/+1, Xi+2]- Отрезок [я.?, ъ+2\ называется но- сителем функции В\ (х) . BJx) 1 (j Рис. 1.18 Типичный график к>^бического ^-сплайна представлен рис. 1.19. Дополним сетку со вспомогательными узлами .x_j < х_2 < x_i < a Ь < Хт+] < Хт+2 < Хт+3 , взятыми совершенно произвольно. на 51
Сплайны По расширенной сетке со* Х-з< х.2< х„1 < а < х\ < ... < xm_j < b < xm+j < хт+2< xm+j можно построить семейство из т + 3 кубических 2?-сплайнов: , / == -1, 0, ..., т, т+\ . Это семейство образует базис в ft /x) пространстве кубических сплайнов на отрезке [а, Ь\. Тем самым произ- 1 вольный кубический сплайн 5(х), построенный на отрезке \а, Ь\ по сетке со из т +1 yxia, может быть представлен на этом отрезке в виде линейной комбинации т+1 Рис. 1.19 /=-1 Условиями задачи коэффициенты Ь\ этого ^рахюжения опреде- определяются однозначно. В случае, когда заданы значения yt функции в узлах сетки и зна- значения v'o и у'т 1-й производной функции на концах сетки (задача интерполяции с граничными условиями 1-го рода), эти коэффици- коэффициенты вычисляются из системы следующего вида: + Ь,В[х) + ЬМВ'М(дг,) = у,, где / = 0, 1, ..., т. = у'я. После исключения величин b.j и bm+j получается линейная сис- система с неизвестными £0, ..., Ьт и 3-диагональной матрицей. Условие К 1+л/з р= max обеспечивает диагональное преобладание и, значит, возможность при- применения метода прогонки для ее разрешения. Замечания: 1. Линейные системы анаюгинного вида возникают при рассмотре- рассмотрении и других задач интерполяции. 2. В сравнении с алгоритмами, описанными в 1. U применение В-сплайнов в задачах интерполяции позволяет уменьшить объем хранимой информации, то есть существенно снизить требования к объему памяти компьютера, хотя и приводит к увеличению числа операций. 52
лава 2. Сплайн-функции двух переменных ' ."f Пусть в прямоугольнике R = [а,Ь]х задана сетка a<x<b, c<y<d} СО - где а - хг coY: с- п,-\ У\ (рис. 2.1). Точки (*,-,>;,.), / = 1,..., т-1, у = 1,..., л-1, называются внутренними узлами сетки со; точки d - граничными узлами заданной сетки, а точки О >о)- (Хт'Уп) - ее угловыми узлами. Сетка со делит прямоугольник Л на ячейки \ Ru = у ~ У ~ У i = 0, 1, ..., т - 1, У = 0, 1, ..., а? - I (рис. 2.2). Функция S(x, у), заданная на пря- прямоугольнике /?, ндзывается бикубичес- бикубическим (дваждыкубическим) сплайном или бикубической сплайн-функцией, если: У п а Рис. 2.1 Рис. 2.2 d' с 0 ( 1 '■'■'■ '■'■ | R • 4 / г ■ • ' ' 1 1 t i i i i b 1) в каждой прямоугольной ячейке RtJ S(x, у) функция являе многочленом 3-й степени как по х, так и по у, то есть
Сплайны 3 3 *=0 /=0 / = 0, 1, ..., m - 1, j = 0, 1, ..., n - 1; 2) сама функция S(x, у) и ее производные as as a2s a2s a2s a3s 2 aA aAs ' ' л 2 л ах а cy~ ax ay непрерывны в прямоугольнике А, то есть S(x,y} Замечания; 1. Индексы I и j у коэффициентов d^J] указывают на тоу что на- набор величин7 которым определяется сплайн-функция S(x, у), в каж- каждой ячейке Л.... свой. y 2. В каждой прямоугольной ячейке R^ бикубический сплайн S(x, у) можно записать в виде /=0 или в виде /=о Первая запись позволяет говорить, что бикубический сплайн S(x, у) в каждой ячейке Rtj предсташгяет собой кубический многочлен по переменной у - >}, коэффициенты которого суть кубические мно- многочлены по переменной x-xv Аналогичный смысл имеет и вторая запись. Это обстоятельство дает основания считать, что алгоритм по- построения двумерных кубических сплайнов в значительной степени опирается на алгоритм построения одномерных сплайнов. В каждой прямоугольной ячейке Ry сплайн-функция 5(х, >') определяется 16 коэффициентами: ^ 00 ^ 10 ^20 ^30 54
Сплайн-функции двух переменных i( Всего прямоугольных ячеек - тп. Значит, для того, чтобы полностью У описать бикубический сплайн на сетке со, необходимо найти 16/яя V: чисел ':' *£У), /7 = 0, 1, 2, 3, q = 0, I, 2, 3, / = 0, 1, ..., /я-1, у = 0, 1, ..., я-1 Наиболее часто рассматривают- г ся задачи интерполяции и сглажива- . ния, когда требуется построить тот ; или иной сплайн по заданному мас- массиву точек Рис. 2.3 у=0, 1,..., я (рис. 2.3). В задачах интерполяции требует- требуется, чтобы график сплайна проходил через точки [Ху^Уу^Л i =0, 1, ..., /я, у =0, 1, ..., я. Это требование накладывает на его коэффициенты ряд дополнительных условий (уравнений), которых, однако, недостаточно для однозначного по- построения сплайна. Необходимый для этого набор условий (уравнений) .чаше всего задают в виде значений младших производных сплайна ,.;-> В граничных узлах сетки со - граничных (краевых) условий. Возмож- Возможность выбора различных граничных условий позволяет строить \ сплайны, обладающие самыми разными свойствами. .■*' В задачах ссаживания сплайн строят так, чтобы его график про- (S v *угУу,2{\ i = 0, 1, ..., т , у = 0, 1, ..., я, а не че- v рез них. Меру этой близости можно определять по-разному, что при- v.bводит к значительному разнообразию сглаживающих сплайнов. р\ , В этой главе мы останавливаемся на сплайн-функциях двух пере- . ; менных, которые представляют собой прямое обобщение соответст- -* вующих одномерных сплайнов. Однако рассматриваемые двумерные .^сплайны далеко не исчерпывают всего их многообразия, которое оп- .; ределяется и выбором граничных (краевых) условий, и исходным мас- v сивом точек, и классом функций, используемых пля построения эле- J? Ментарных фрагментов, и т. д. 55
Сплайны 2.1. Интерполяционные бикубические сплайны « 2.1.1. Постановка задачи интерполяции Пусть заданы сетка со а = хо<х, <..<хт_1 <хт=Ь, с = у0 <У] <...<уп_{ <yn=d и набор чисел z&, i = 0, 1, ..., т , у =0, 1, -, п. Задача. Построить на прямоугольнике R =[я.£] х [c.d] гладкую функцию сг(х,у), которая принимает в узлах сетки <у заданные значения Замечание Сформулированная задача интерполяции состоит в восстановлении функции, заданной таблично. Ясно, что такая задача имеет мно- множество различных решений. Накладывая на конструируемую функ- функцию дополнительные условия, можно добиться необходимой одно- однозначности. 2.1.2. Определение интерполяционного бикубического сплайна Интерполяционным бикубическим сплайном S(x, у) на сетке со назы вается функция, которая: 1) в каждой ячейке Rv = {(*>>') i - х - *м > yj - у й / = 0, 1, ..., т , у = 0, 1, ..., п , представляет собой многочлен вида р=0 q= B'2) 2) принадлежит классу СB'2) (R); 3) удовлетворяет условиям = zff, i =0, 1, ..., /n, j =0, 1, ..., п. 56
*?*■■ " \ Сплайн-функции двух переменных Для построения сплайна необходимо определить \6тп коэффи- ,('\ Л циентов сг% л. Соотношения (*) дают (т + 1)(п + I) условий. Вместе с требованием S(x, у) eCBa)(R) получается \6тп-2(т + я)-8 условий (уравнений) на коэффициенты a{^qJ). 2.1.3. Граничные (краевые) условия Недостающие 2(т + л + 4) условия задаются в виде ограничений на значения производных сплайна в граничных и угловых узлах сетки со. При построении интерполяционного бикубического сплайна наиболее часто используются граничные условия следующих четырех типов. Граничные (краевые) условия 1-го типа ox / = 0, /n, j — 0, 1, ..., n, dv i = 0, 1, ..., m, j — 0, /i, / = 0, m, У = 0, /i, A A - в граничных узлах сетки со задаются значения первых частных про- производных по х и по у искомой функции, а в угловых узлах - значения 2;ой смешанной производной. Число граничных (краевых) условий 1-го типа равно 2т + 2п + 8. Наглядное представление о спо- собе задания сплайна, отвечающего граничным условиям этого типа, дает рис. 2.4. На нем жирными точками 'отмечены узлы сетки, в которых зада- задаются значения сплайна 5, горизон- горизонтальными и вертикальными стрелка- стрелками указаны узлы, в которых задаются значения первых частных производ- производных Sx и SY соответственно, а ром- ромбиком - значения смешанной произ- производной Sw. Граничные (краевые) условия 2-го типа 0 i а о Рис. 2.4 ox' j= 0, 1, ..., n 57
Сплайны d2S .2 (x*>yj) 4> / = 0, 1 ,..., m, j = 0, /i, ,* Vy/ — л.-y j * Uy "», У ^, '*» - в фаничных узлах сетки <у задаются значения вторых частных про- производных по х и по у искомой функции, а в угловых узлах - значения смешанной производной S . Число граничных (краевых) условий 2-го типа равно 2т + In + 8. Наглядное представление о способе задания сплайна, отвечающе- отвечающего граничным условиям этого, типа также дает рис. 2.4. На нем жир- жирными точками отмечены узлы сетки, в которых задаются значения сплайна 5, горизонтальными и вертикальными стрелками указаны узлы, в которых задаются значения вторых частных производных S^ и Sxr соответственно, а ромбиком - значения смешанной производ- ной Граничные (краевые) условия 3-го типа У=0, 1, ...,ai У=0, I, ..., л, £=1,2, ох д lS l () -TT(x">>«)' / = 0, 1, ..., /я, /=1,2, ^ V . . (xm,vy), y=o, 1, ..., а?, /:= 1, 2, ^5 ^5 п i ^ i (*,>>'о)= -, / п (/ (^/»Л)» / = 0, 1, ..., т, /= 1,2, называются периодическими. В этом сл^те сплайн 5(.х, у) и его част- частные производные должны быть двоякопериодическими функциями - с периодом Тх =Ь-а по переменной х и с периодом Ty-c-d по пе- переменной у. Условия на сплайн-функцию S(x, у) входят в группу условий (*), а общее число условий на ее производные равно 2B/w + 2п + 4). 58
Сплайн-функции двух переменных Граничные (краевые) условия 4-го типа требуют, чтобы на линиях х - хх и X — ХтХ были непрерывны сле- следующие производные искомого сплайна: dS dS c?S d2S d2S _ _ _ л ' л ' л. 2 ' л л ' л. 2 > ах су ах ахау су * dAS d'S d5S дх1ду дх ду а на линиях у = ^ и у - уп_х - производные dS 2 2 2 >з,. ' 2^Л ах ду дх cxcy dy дъ8 <? 2 ^ л2л2' л-K? л.2лЗ' дх ду дхду дх ду Комментарий. Сплайн, удовлетворяющий граничным (краевым) усло- условиям 4-го типа, обладает повышенной гладкостью: в прямоугольниках /=0, п- 2, прилегающих к вершинам прямоугольника Л, непрерывны все его производные °S , \<р<в\ 0<^<3, 0<г<3. xqcyr dxqcy Замечание. Кроме перечисленных; возможны и смешанные граничные условия, то есть условия, относящиеся по разным переменным к разным типам. При этом если, например, по переменной х заданы условия 1-го ти- типа, а по переменной у - 2-го типа, то в вершинах прямоугольника R следует задавать частные производные S^, и т. д. 2.1.4. Построение интерполяционного бикубического сплайна Для описания алгоритма исходную информацию удобно расположить в^виде табл. 2.1. . 59
Сплайны Таблица 2 z(xj) z(x) z(x) z(x) z(x) .1 z(v) zo,i Z0,0 2(.v) zl^ ZU-1 Zll ' z.,o zf;07 ... ^r • * • Z \ * * * ^v 1 /77 1 _/?— 1 * * * £ A Zm-l,0 -0') Zm-l,0 tnji— 1 Zm,0 ZO) z(v) z(-v) z(-v) ZS'} Во внутренненей части таблицы располагаются значения ztj сплайна в yxiax сетки со. Окаймляющие строки и столбцы заполняют- заполняются численными значениями соответствующих производных (только в случае граничных условий 1-го или 2-го типа). Алгоритм построения интерполяционного бикубического сплайна основан на том, что при фиксированном значении одной из перемен- переменных (например, у) сам сплайн и его частная производная по у являют- являются интерполяционными кубическими сплайнами по переменной х. 1-й шаг алгоритма По каждой строке таблицы, включая фаничные (если они имеются), строятся одномерные кубические интерполяционные сплайны по пе- переменной х с краевыми условиями, взятыми из граничных столбцов (если они имеются). Построение каждого одномерного сплайна сво- сводится к отысканию чисел /и^], \ =0, 1, ..., т , у=0, 1, ..., л, которые совпадают со значениями производной Sx сплайна S в узлах сетки со. Эти числа удобно расположить без окаймляющих столбцов в виде табл. 2.2. Таблица 2 • • • (х) И 0,0 (*>) И о.о м if • • • и{х) И 1,0 (-ГУ) И 1,0 • * * • • • • • • • • • • • • г1 т,п • • • и{х) И т,0 и (ху) 60
Сплайн-функции двух переменных При граничных условиях 1-го и 2-го типа в верхней и нижней строках таблицы размешаются значения в граничных узлах сетки со производных S^, и S^, соответственно. При граничных условиях 3-го или 4-го типа по переменной у этих окаймляющих строк не будет. 2-й шаг алгоритма По каждому столбцу табл. 2.2 строятся интерполяционные кубические сплайны S , являющиеся частными производными по переменной х искомого сплайна S на линиях х = дг.: () , / = О, 1, ..., т. дх Построение каждого из сплайнов S(xny) сводится к определе- определению чисел //^°, которые являются производными по переменной у вспомогательных сплайнов S и, значит, производными S^, искомого сплайна в узлах сетки со. 3-й шаг алгоритма аналогичен 1-му шагу: по данным табл. 2.1 строятся одномерные ин- интерполяционные сплайны S(xny), I — О, 1, ..., ту по переменной у, удовлетворяющие граничным условиям соответствующего типа. В ре- результате будут найдены значения ^ ^^у.), /' = 0,1, ...,/я , у = 0,1, ..., п. ду После выполнения 3-го шага алгоритма в каждом узле сетки со будут известны величины z.. ? и м?, которые полностью определяют интерполяционный бикубический сплайн, удошгетворяющий заданным граничным условиям. Алгоритм вычисления значений сплайна Для того чтобы вычислить значение интерполяционного бикубическо- бикубического сплайна в произвольной точке (х, у) прямоугольника R, определим следующие параметры: номер /такой, что х б[дг.,х|Ч1], номеру такой, что v е >'_,,.Vy+1 , шаги h. = xi+x - xt, lj = у^{ - yj сетки со по х и по у соответственно, 61
Сплайны числа / = L и и = A. h Введем 4 вспомогательные функции: - и два вектора - а, и Ъи: Тогда искомый сплайн S(x, у) можно вычислить посредством формулы S(x,y) = a,ZbMr , где матрица Z имеет следующий вид: \ /•*> (V) (.XV) (.xv) 2.1.5. Свойства интерполяционного бикубического сплайна А. Аппроксимационное свойство В приложениях часто требуется приблизить сплайном функцию, заданную аналитически, Например, такая задача возникает в с-чучае, когда вычисление значе- значений заданной функции в точках прямоугольника R связано со значи- значительными трудностями. Задача интерполяции функции. Построить в прямоугольнике R би- бикубический сплайн S(x, у), совпадающий в узлах сетки со с заданной функцией f[x, у), s{xi*yj) = f{xi^vj) ' 7 = °' Ь -' w' J = °» ^ •••' п- Алпроксимационные свойства построенного интерполяционного бикубического сплайна S(x, у) зависят от гладкости интерполируемой функции fix, у). 62
Сплайн-функции двух переменных г? It % v< Например, если функция j{x, у) принадлежит классу С4{$) , то где h = max A., / = max /, f —Л «И f —П П ■' (здесь h{ - xi+l -xt и I. = yj+l -yy - шаги сетки со по х и по у соот- соответственно). Если же функция fix, у) принадлежит классу CS(R), to порядок аппроксимации гораздо выше: Замечание Приведенные формулы оценивают порядок погрешности аппроксима- аппроксимации заданной функции бикубическим сплайном при И —> 0 и I —► О и справедливы при любых соотношениях между h и I. Если же потребовать дополнительноу чтобы при h -> 0 и I —> 0 отношение h/l оставалось ограниченным, то порядок аппроксимации возрастет на единицу, Б. Экстремальное свойство По аналогии с одномерным случаем рассмотрим следующую ва- вариационную задачу. Пусть R = [я,б] х [c.c/j - заданный прямоугольник. Задача. Среди всех функций, принадлежащих классу C22(R) и принимающих в узлах сетки со а = хо<х,< ... <хт_{<хт=Ь, с = уо<у1< ... <ул_1<Уп=с/ заданные значения Zy >, I U, 1, ..., /W, J U, 1, ..., П, найти такую, которая доставляет минимум функционалу dxdy. \ дх1ду1 Для того чтобы сформулированная задача имела единственное ре- решение, необходимы дополнительные условия. Укажем некоторые ва- варианты таких условий. 63
Сплайны 1. Если потребовать, чтобы допустимые функции удовлетворяли условиям д2/ {„ .. \ -А A^"J/ / = 0, т, У=0, 1, ..., л, то решение вариационной задачи будет однозначно определе- определено и этим решением будет интерполяционный бикубический сплайн. 2. Если потребовать, чтобы допустимые функции удовлетворяли граничным условиям вида О J ( \_ 11,0. \x^yj) ~ zv > / = 0, m, j = 0, 1, ..., А?, ox су / = 0, /и, у = 0, то решение вариационной задачи будет однозначно определе- определено и этим решением будет интерполяционный бикубический сплайн. 3. Если потребовать, чтобы допустимые функции бьши двояко- периодическими .функциями с периодами Тх=Ь-а и Tv -d -с , то решение вариационной задачи будет однозначно определено и этим решением будет двоякопериодический ин- интерполяционный бикубический сплайн. Замечание Перечисленные выше сплайны являются решением сформулированной вариационной задачи в гораздо более широком массе функций, а именно в классе [Г22 2{Я) ♦ 64
Сплайн-функции двух переменных 7/ '.I 2.1.6. Построение сплайновых поверхностей при помощи сплайн-функций Выше рассматривались массивы, точки которых были занумерованы так, что и их абсциссы, и их ординаты образовывали строго возрас- возрастающие последовательности. Это обстоятельство определяло и выбор класса аппроксимирующих поверхностей (графики функций), и спо- способ их построения. Однако предложенный метод позволяет достаточно успешно , строить интерполяционую поверхность и в более общем случае, когда i нумерация точек массива г. и их расположение в пространстве, как правило, не связаны. Ясно, что для решения этой общей задачи необходимо сущест- существенно расширить класс допустимых поверхностей, включив в него и поверхности, которые нельзя однозначно спроектировать ни на одну ;: 'из координатных плоскостей, и поверхности с самопересечениями и •ч самоналеганиями. Такие поверхности удобно описывать при помощи , параметрических уравнений х = x(u,v): у = y(w, v), z = z(w, v)? At Потребуем дополнительно, чтобы функции х(и, v), у(и, v) и z(uf v) об- обладали достаточной гладкостью, например принадлежали классу С1 (/?) или классу С2 (/?) . Для отыскания параметрических уравнений поверхности, после- последовательно проходящей через все точки массива, поступим следую- следующим образом. 1-й шаг. На произвольно взятом прямоугольнике R изменения параметров и и v вводится вспомогательная сетка 11 лх\ число узлов которой совпадает с числом точек в массиве Р. ; 2-й шаг. По заданному массиву Р строятся 3 новых вспомогатель ных массива: X = {(и^.хД /=0, I, ..., m\j = 0. L ..., /?]. Y = {(w,^.vj, / = 0, I, ..., /w;y = 0, L ...,/? Z = {(w/;vy.,z^J. /=0, I, ..., m\j = 0. I, .... ny
Сплайны 3-й шаг. Для каждого из массивов X, Y и Z находятся соответст- соответствующие интерполяционные сплайн-функции х(и, v), у(и, v) и z(u, v). В результате мы получаем параметрические уравнения поверхнос- поверхности, проходящей через массив точек Р. Замечание Полученная поверхность будет гладкой, но не обязательно регуляр- регулярной, так как возможность rank и У и 2 и <2 ■для некоторой точки (m\v j e{a,j3) x (y*S) исключать нельзя. Кроме того, эта поверхность может иметь линии самопересечения и участки самоналегания. 2.1.7. Программная реализация Описанный выше алгоритм построения бикубического интерполя- интерполяционного сплайна и вычисления его значений в произвольной точке реализованы в виде подпрограммы Splint2, написанной на языке Фортран: Ы subroutine Splint2 * ;га,х,п,у,z.z 1,zr,zu,zd,zx,zy,zxy,ind,ibx, * iby-, xx, yy , a,f b, с , d, u, v , v;, t., s , z z , su, sd , spl ■ :' х с z Прогр?.:-::а Splint.2 строит :. бикубический cm. функции двух пеу- лолящюнный для таблично заданной число узлов сетки пс осп х массив длины т, содержит узлы сетки пс сси х число узлов сетки пс оси у массив длины и, содержит узлъ; . .тки пс оси у одно:-•.•■•■:рный массив длины п*гг;, содержит значения интерполируемой функции в узлах интерполяции; ержится с ibx - с zl - zr - с z 2 i с zu с- значение функции в узле сетки •: i, j в элементе z■i+ 1 -i ■ *m код типа граничных условий на прямых x-xl и х=х-т ibx = i ;, i = 1 -4 ) - условия i-rc типа массив длины п, элемент z 1 ■ J .■ содержит значение i-й частной производной пс для граничных условий i-r:- •; массив длины rv, элемент zkj i-й частной производной для граничных условий х в узл~х ; 1 х содес'жит значение в узга.х 'Ш,;. ■ r.u. . , 2 ■ - код типа граничных условий на прямых v=yl iby = i ■:.i = l-4i - словия i-ro типа массив длины т, элемент zu-j» содержит значение i-й частной производной по у в узлах Н,т) * * * * * * * * * * * * * * * * 66
f- Сплайн-функции двух переменных a ш с для граничных условий i-ro типа (i=l,2) с zd - массив длины т, элемент zd(j) содержит значение с i-й частной производной по у в узлах (j,l) с для граничных условий i-ro типа (i=l,2) с zxy- массив длины 4, содержит значения смешанных с производных в угловых течках сетки в случае гра- с ничных условий 1-го или 2-го типа с a,b,c,d - рабочие массивы длины maxin^i i с s , t ,u, v,v;, zz , su, sd - рабочие массивы длины таХ'П,т)+1) с zx,zy,zxy - одномерные массивы длины п*т, содержат с значения параметров сплайна с ind - код режима работы: с ind=O - программа вычисляет параметры сплайна с ind=l - параметры сплайна известны с с хх,уу - координаты точки, в которой вычисляются парамет- с • ры сплайна с с Результат: с spl - значение сплайна в точке с кссрдинатами ,хх,уу ~*********************************************************** * • .* • * * is- * * * dimension х ■, 1 ? ,у i 1 ; , z ■, 1 ;■ , zl 1.1 :■ , zr i 1 :■ , zu ■. 1 ; , zd ■: 1 j , zx ■: 1 :■ , zy A ■• , zxy A ■ , u <, 1 :< , v ■"' 1 '> , v:!.l) , til' , sil': ,3U'l'; , sd':l', a •. 1 ; , b-:.l .• ,c: 1 ■ ,d' 1 • , zz ■ 1 ■ , f • 4-' , g- 4 , , sum;4) if (ind.eq'. O'j then do j = 1,n call Spline (m, x, z •:. 1 + ■ j -1 :• *m • , a , b, с , d, zx ■, 1 + ■; j -1 :• *m • , u, v,w, t, s , ind, ibx, zl ■: j • , zr i i ; ,xx., sp,dsp,d23p':' end do if •:. iby . 1 e. 2 i then call Spline • m, x, zd , a , b, с , d , sd, u, v ,.:, t,s,0,ibx,zxy i ,zxy 2 ,xx,sp,dsp,d2sp call Spline . m, x, zu, a , b, с , d, su, u , v, v:, t, s, G , ibx, zxy • 3 ' , zxy ■' 4 .■ , xx, sp, dsp, d2sp ■ end if do i = 1, m do j = 1,n zz ; j •■ = zx i + j--l • *m ■ enddo call Spline ■; n,y , zz , a ,b, с ,d, zxy =, 1+ ■ i -1 ■ *n ■ , u, v ,v:, t,s,0,iby,sd i ,su i■,xx,sp,dsp,d2sp• enddo do i = 1, m do j = 1,n zz■i ' = z■l + -i -1 * m. enddc call Spline ■: n,y ,zz ,a ,b,c ,d , zy 1-»- •. i-i .■ *n ■ , u, */,'.•:, t, s, 0 , iby , zd ■ i ':■ , zu •. i • , xx, sp, dsp, d2sp enddo endif do i = 2,m ni = i i f -: x : i "• . gt. xx go to 1 67
Сплайны enddo 1. i = ni - 1 ' у—Ч do j = 2 , n nj = j i f ■ у ■. j • . gt. yy :• go to 2 enddo 2 j = nj - 1 с ' hx = x i i +1 ■ -' x ■■ i • tx ■ = xx - x i. i .:■ ■■ /hx с hy = у • j+1 :■ - у-.j .■ L j • j J J J ' l lJ f i 1 > = ■: 1. - tx •■ * * 2 * •. 1. + 2 . * tx ■• f i2 :• = tx**2* • 3 .- 2*tx f •:. 3 > = tx* ■.! . - tx; **2*hx . f'4'-- =-tx**2* ii.- tx-*hx с g ■ 1 • ■ = ■. 1. - ty ■ * * 2 * • 1 . + 2 . * ty :■ g ■ 2 ■• = ty * * 2 * ■ 3 . - 2 * ty .■ a • 3 • = ty * •: 1 . - ty ■■ * *2 *hy g 4' =-ty**2* 1.- ty-'*hy sum ■ 1 • = z ; i + • • j -1 :• *m :■ * f '.. 1 ..■ + z • i +1 + . j -1 ■*m ■ * + zx i+ j-1 ■*mi*f;3i + zx ■. i + l+• j-1 ■ *m ■ \^ sumi ■ 2 ■ = z i -*- j *m '■ * f '. 1 :• + z •. i +1-И *m > * f ■' 2 '■ * + zx; i + j*m.- *f ■■ 3 ■ + zx ■: i + l + j *m ; *f ■: 4 .■ с sum ; 3 ■ = zy ■. j + ; i -1 > * n '■ * f ' 1 i + zy ■: j + i * n :■ * f • 2 * + zxy j + i -1 :■ *n ■ * f • 3 ■ + zxy ■ j + i *n • * f 4 с sum ■ 4 .■ = zy ■ j +1 + ■' i -1 '■ *n ':• * f ■.' 1') + zy j +1 + i *n * -t- 7 V" "  •«- 1 ■*■ i _1 , *ri i *t ; ■? , 4. rr V" * . +1 +"i *^ spl = 0. do к =1,4 spl = spl + g ;k ■ *surri ■■ к ■ enddo с return end Обращение к программе имеет вид: call Splintz ' ■ * m,x,n,у,z,zl,zr,zu,zd,zx,zy,zxy,ind,ibx, * iby , xx, yy , a , b, с , d, u, v , v:,.t, з , z z , su, sd, sp 1 • Входные данные: m - число узлов сетки по оси х; х - массив длины т, содержит узлы сетки по оси х; п - число узлов сетки по оси у; у - массив длины п, содержит узлы сетки по оси у; 68
Сплайн-функции двух переменных if- I. z - одномерный массив длины n*m, содержит значения интерполируемой фикции в узлах интерполяции; значение функции в узле сетки (i, j) содержится в элементе z (i+ ( j -1) *m); ibx - код типа граничных условий на прямых х = xl и х = хт, ibx = i (i=l-4) -условия i-ro типа; zl - массив длины п, элемент zl( j ) содержит значение i-й частной производной по х в узлах A, j) для граничных условий i-ro типа (i = 1, 2); zr - массив длины п, элемент zr ( j ) содержит значение i-й частной производной по х в узлах (m, j) для фаничных условий i-ro типа (i = 1, 2); iby - код типа фаничных условий на прямых у = yl и у = уп, iby = i (i=l-4) -условия i-ro типа; zu - массив длины m, элемент zu( j ) содержит значение i-й частной производной по у в узлах (j, m) для фаничных условий i-ro типа (i = 1, 2); zd - массив длины ш, элемент zd( j ) содержит значение i-й частной производной по у в узлах Q, 1) для фаничных условий i-ro типа (i = 1, 2); zxy - массив длины 4, содержит значения смешанных производных в угловых точках сетки в случае фаничных условий 1-го или 2-го типа; а, b, с, d - рабочие массивы длины max (n, m), s,t,u,v,w,zz,su,sd - рабочие массивы длины max(n/m) + l, zx, zy, zxy - одномерные массивы длины n*m, содержат значения параметров сплайна; ind - код режима работы: ind = 0" - профамма вычисляет параметры сплайна, ind = 1 - параметры сплайна известны; хх, уу - координаты точки, в которой вычисляются параметры сплайна. Результат: spl - значение сплайна в точке с координатами (хх,уу). Чтобы показать, как пользоваться профаммой Splint2, рассмот- рассмотрим следующий пример. Пример. Построим сетку из 11x6 узлов в прямоугольнике [О,/г] х [0,/г/2], 69
Сплайны ^i =ТТ/> / = 0Д> ..., 10, •^>=Тп^'' ^*=:^' "' ^' и вычислим значения функции fix,у) = sin(x) sin(>>) в этих узлах. С этими исходными данными построим интерполяционный кубичес- кубический сплайн, удовлетворяющий граничным условиям 1-го типа на всей границе прямоугольника, а затем вычислим значения сплайна в точках с координатами П / -14 • 1 Л1 П / -14 • 1 11 Y* — ——— | 1 — || 1 — I / \ V" ~— —— I | — I 1 I — I II 1 20 J 20 У ^ Множество этих точек обозначим Q . Ддя оценки качества интерполяции сравним значения сплайна и заданной функции на множестве Q. Программа для решения этой задачи может иметь следующий вид: dimension xi.100) , yA00) , z (-100) , zlA00), * zr-:100», zu',100), zdt.100), zxllOO;, * zy-. 100), zxy(lOO), uilOO) , vflOO'i , * ' ailOO) , bA00), cA00) , dA00) , * v:-. 100) , tA00), sui'100), sdflOO?, * S--.100) , zz'100) с ■ • . data pi/3.1415926/ с hx = pi/10. hy = pi/10 m = 11 n =6 ibx - 1 iby = 1 do i = 1,m x i ■• = hx * ■. i -1 i zd ■ i ■ = sin •: x < i ') i zu ■. i • - 0 . enddo с do i = 1,n 7:3' = hy*«j-l) z 1 ■, j .• = s i n \ у •:. j ) ) z r ■: j :• = - s i n < у •:' j "i '• enddo do i = 1,m ' dc j = l,n enddo .enddo z xy •: 1 ; = 1. z xy ■:' 2 ) = -1 . zxy •: 3 '•• = 0 . 70
Сплайн-функции двух переменных i У z xyD ) = 0 . ' с . call Splint2 im,x,n,y,z,zl,zr,zu,zd,zx,zy,zxy,0, * ibx, iby , xx,yy, a, b, с , d , u, v, v:, t, s , zz , su , sd, spl > с hx = pi/2 0, hy = pi/2 0. del = 0. ' do j = 1,11 do l = 1,21 xx = hx* i i-1) ■ УУ = hy*(j-l) fun = sin •:. xx i *sin r/y) call Splint2 (m,x,n,y,z,zl,zr,zu,zd,zx,zy,zxy, * 1, ibx, iby',xx,yy ,a ,b,c ,d ,u,v,•'.•;, t, s , zz , su, sd, spl .- ■ if '•: abs f f un-spl) . gt. del ;• del^abs ; f un^spl '■ enddo enddo write ■*,*.. 'del= ' ,del stop end Вычисления по этой программе привели к следующим резуль- результатам: max fix, у) - S{x,y)\ = 5.0783 16£ - 05. Для построения по тому же массиву данных интерполяционного | сплайна, удовлетворяющего граничным условиям 2-го типа, можно воспользоваться следующей программой: &.' dimension х-. 100.- и '.' 10 0 ' d' 10G ■■ , у -100 ■• zd'100 v■100• V: : 1 U 'J ' z z 10 0 Z •. 1 U U i zx 10 0. а ■ 1 w 0 ■ ■■ 1 и U ■ luu и", I Г. Л ; О '• X \J <J ' su■100 z r \ 10 0 ; , zxy •. 100 г, С • 1 и v ■ , sa luw' , data pi/3.141592с/ hx = pi/10, hy = pi/,10 m = 11 П - D ibx - 2 iby = 2 do i = .1 ,m x.i: = hx* i-1 z d •: i :■ = 0 z u ; i t = - s i n ■ x * i • enddo do i = 1, n УО- = hy*j-l- zl•j • = 0 . z r i. j • = 0 . enddo 71
Сплайны dc i = 1, m dc j = 1,n z (i+■:'j-11 *m) = sin (x(i) ) *sin(y (j ) У enddc enddc с * zxy'.'I;- =0. zxy < 2 i. = 0 . . zxy i3) - 0 . z xy i 4 ' = 0 . call Splint2 (m,x,n,y,z,zl,zr,zu,zd,zx,zy,zxy,0, * ibx,iby,xx,yy,a,b,c,d,u,v,w,t,s,zz,su,sd,spl) с ■ hx = pi/2 0. hy = pi/2 0. open A,file='res2.dat'} del = 0. . ■ dc j = 1,11 do i = 1,21 xx = hx* •: i-1 ':■ yy = hy*.-j-li с fun = sin . xx■) *sin (yy) с call Splint2. (m,x,n,y ,z , zl, zr, zu, zd, zx, zy, zxy , * i, ibx,iby,xx,yy,a,b,с,d,u,v,w,t,s,zz,su,sd,spl• if ■, abs ■ fun-spl) . gt .del) del=abs (fun-spl )- .enddc enddc 1 write il,*'i 'del=' ,del step end Вычисления по этой программе привели к еледующему результату: max Приведенная Ниже программа строит интерполяционный сплайн, удовлетворяющий граничным условиям 3-го типа. dimensien x . 10 0; , у A0 0 } , z A00 ) , z 1 •: 10 0) , zг •: 10 0 • , * zu : 1 и 0 :• , zd •■ 1 и и :■ , zx i 10 и * , zy •: 1 и и :> , xy ■ l.u и ; , * u i 10 0 ;■ , v i, 10 0 • , a •:. 10 0 i ,. b i, 10 0 ) , с •: 10 0 :> , * d'. 100} , wdOO.1 , ti.100'1 , su A00), sd'lOG1., * s '10 0 ':• , z z i 10 0 ;- data pi/3.1415926/ hx = 2.*pi/10. hy■= 2.*pi/5; m = ll n ■= с • ibx = 3 iby = 3 с dc i = 1,m ' ■ xvi) = hx*.i-1) enddc ' ■ . 72
Сплайн-функции двух переменных do j = 1, n у (j ) = hy * ( j -1) enddc it- , . - dc l = l,m do j = l,n z (i + (j -1) *m) . = sin(xi.i ) ) *sin(y (j j ) enddc enddc call Splint2 m,x,n,y,z,zl,zr,zu,zd,zx,zy,zxy,0, к, * ibx, iby , xx ,yy , a ,b, с , d, u, v,w,t,s,zz,su,sd, spl) * ' с I hx = 2.*pi/2 0. ' hy = 2.*pi/2 0. open A,file='res3.dat') del = G. do j = 1,21 dc i = 1,21 xx = hx*(i-1} fun = sin i xx • *sin iyy > call Splint2 ;m,x,n,y,z,zl,zr,zu,zd,zx,zy,zxy, * 1, ibx, iby , xx, yy , a , b, с , d, u, v, v:, t, s , z z , su , sd, spl ':- if (abs ■: fun-spl» .gt. del'■ del=abs ■: fun-spl':■ enddc enddo write U,*1 'del='.,del close i' 1 i ' ' . stop ■ end • ' ■ Вычисления по этой программе привели к следующему результату: max , у) - S(x. y)\ = 9.367764Е - 03. Если необходимо построить интерполяционный сплайн, удовлет- ' воряющий граничным условиям 4-го типа, то можно воспользоваться следующей программой: dimension x < 10 G . , у ■. 1G G ■ , z • 10 0 :• , z 1 • 10 G . , zг -1 и 0 ■ , * zu ; 1G G :■ , zd ■ 1G G , zx , 1G G , zy • 1G G , zxy 1G G ■ , * * ' s . 1G G ■ , z z * u ; 1 и и , v 1 и и :• , а ; 1 о w ; , £-; 1 и и .• , с ; 1 и о ; * " d '. 1G G ':• , v; •: 1G С .■ , t ■ 1G 0 :■ , su ; 1G G ■ , sd •: 1G 0 data pi/3.1415926/ hx = 2.*pi/lG. hy = 2.*pi/5. m =11 n =6 ibx = 4 iby = 4 do i = 1, m x i. i > = hx *ч. i -1 "■• enddo 73
Сплайны do j- = 1, n yd» = hy*<j-l) enddo do i = 1,m - do j = l,n z i i+ -. j -1'• *m ; = sin (x [i) ) *sin (y (j ) ) enddo enddc call Splint2 (m,x,n,y,z,zl,zr,zu,zd,zx,zy,zxy,0, * ibx,i by,xx,yy,a,b,с,d,u,v,w,t,s;z z,su,sd,spl) с hx=2.*pi/20. hy = 2.*pi/2G'. open -: 1, f ile= ' res4 . dat' ) del = 0. do j = 1,21 ' do i = 1,21 xx = hx *;i-1: УУ = hy*.j-l- fun = sin(xx•*sin(yy) call Splint 2 (m'^x,!!^ ,z ,zl, zr ,zu,zd,zx,zy , zxy , * 1, ibx, iby ,xx,yy ,a ,b,c ,d,-u, v,v;,t ,s, zz , su,sd,spl ■> if ■ abs ''fun-spl) . gt. del) del=abs ( fun-spl) enddo enddo ' write '1,*; 'del=',del / stop end Вычисления по этой программе привели к следующему результа- результату: тах|/(х\ у) - S(x,y)\ = 5.985552E -02. Текст программы Splint2 находится в файле splint2.for в под- поддиректории INTERPOL на дискете, которую можно приобрести в из- издательстве "Диалог-МИФИ". В эту же поддиректорию помешены файлы, содержащие примеры применения программы Splint2 при дру- других граничных условиях. Подробную информацию об именах этих файлов и их содержании можно найти в файле readme.txt из директо- директории SPLINES этой дискеты и в приложении В нашей книги. 74
Сплайн-функции двух переменных 2.2. Сглаживающие бикубические сплайны 2.2.1. О постановке задачи сглаживания | Пусть заданы сетка со а = хо<х{< ... <хт_х <хт =.й, с = у0 <ух < ... <yn-x<yn=d и набор чисел z. , / = 0, 1, ..., tyi , у = 0, 1, ..., л. Комментарий к исходным данным. Величины z{J удобно интерпре- интерпретировать, например, как результаты измерений некоторой функции z(x, у) при заданных значениях переменных х и у, содержащие случай- случайную погрешность. При решении задачи восстановления функции по таким ее экспериментальным значениям вряд ли целесообразно ис- использовать интерполяцию, поскольку интерполяционная функция бу- | дет послушно воспроизводить причудливые осцилляции, обусловлен- обусловленные случайной компонентой в массиве \zA. Более естественным яв- является подход, основанный на процедуре сглаживании, призванной как-то уменьшить элемент случайности в результатах измерений. Существует много разнообразных процедур сглаживания. Фор- ц мально они чаще всего ставятся как задачи отыскания экстремума оп- ztj >, | на некотором классе допустимых функций. 2.2.2. Определение сглаживающего бикубического сплайна Сглаживающим бикубическим сплайном S(x, у) на сетке со называется функция, которая: 1) в каждой ячейке &и = Щ: U I / = 0, 1, ..., т - /, j — 0, 1, ..., п - 1 | представляет собой многочлен вида р=0 q=0 2) принадлежит классу 22 75
Сплайны 3) доставляет минимум функционалу \ ) dxdy *7(w) \2 \ J ./-i \2 V J dx где zy(i = 0. 1, ..., /?/;y = 0, 1, ..., w), p, > 0 (/ = 0, ..., w) и (Jy >0 (у =0, ...,/?)_- заданные числа; 4) удовлетворяет краевым условиям одного из трех указанных ниже типов. 2.2.3. Граничные (краевые) условия Граничные (краевые) условия задаются в виде ограничений на значе- значения сплайна и его производных в фаничных и угловых узлах сетки со. Граничные (краевые) условия 1-го типа ЙГ / = 0, m. У= 0, 1, ..., л, A / = 0, 1, ..., /я, у = 0, п, - в фаничных yxiax сетки r^ задаются значения 1-х частных произ- производных по х и по у искомой функции, а в угловых узлах - значения 2- ой смешанной производной. Число фаничных (краевых) условий 1-го типа равно 2т + 2л + 8. Наглядное представление о способе задания сплайна, отвечающе- отвечающего граничным условиям этого типа дает рис. 2.4. На нем жирными точками отмечены узлы сетки, которым соответствуют значения ztJ, горизонтальными и вертикальными стрелками указаны узлы, в ко- которых задаются значения первых частных производных SY и Sv coot- ■* у ветственно, а ромбиком - значения смешанной производной 76
Сплайн-функции двух переменных Граничные (краевые) условия 2-го типа ТТН'-У; "и » / = 0,/я, У-О, 1, ..., л, ^V—>/— '-0,1, ...,«, у-0, л, - в граничных узлах сетки со задаются значения 2-х частных произ- производных по х и по у искомой функции, а в угловых узлах - значения смешанной производной S . Число граничных (краевых) условий 2-го типа равно 2т + 2л + 8. Наглядное представление о способе задания сплайна, отвечающе- отвечающего граничным условиям этого типа, также дает рис. 2.4. На нем жир- жирными точками отмечены узлы сетки, которым соответствуют значения zy, горизонтальными и вертикальными стрелками указаны узлы, в ко- которых задаются значения первых частных производных Sw и S со- соответственно, а ромбиком - значения смешанной производной Sm,. Граничные (краевые) условия 3-го тина (?k (?kS d'S. ,_0Sf . ТТ^/Л) - "TT^"'-V« *' l' = 0, 1, ..., /w, / = 1, 2, 6* V £* V дхкд\к (х°'у^~ дхкдук ^m?'V^' y = 0, 1, ..., л, Л=1, 2, , ..., m, /=1,2, . ; ,n (/Q y/? t/ Все они и называются периодическими. В этом случае сплайн S(xf у) и его частные производные должны быть двоякопериодическими функ- функциями - с периодом Тх=Ь-а по переменной х и с периодом Ty-c-d по переменной у. 77
Сплайны Теорема. Среди всех функций из класса С2'2 (Я), удовлетворяю- удовлетворяющих граничным условиям 2-го типа (естественным у&ювиям), именно бикубический сплайн доставляет минимум функционалу /(/). Определение. Бикубический сплайн, минимизирующий функцио- функционал /(/) и удовлетворяющий граничным условиям /-го типа, назы- называется сглаживающим сплайном i-го типа. Замечания: *\ *\ / \ 1. Среди всех функций из класса С ' \Рл , удовлетворяющих гранич- граничным условиям 2-го типа, именно бикубический сплайн доставляет , минимум функционалу /(/). 2. Кроме перечиненных, возможны и смешанные граничные условия, то есть условия, относящиеся по разным переменным к разным ти- типам. При этом если, например, по переменной х заданы условия 1-го типа, а по переменной у - 2-го типа, то в вершинах прямоугольника R следует задавать частные производные S^, и т. д. 2.2.4. Построение сглаживающего бикубического сплайна Алгоритм построения сглаживающего бикубического сплайна основан на том, что его построение можно свести к решению последователь- последовательности одномерных задач сглаживания. 1-й шаг алгоритма На каждой линии y = yk(k = O, 1, ..., п) строятся одномерные куби- кубические сглаживающие сплайны •$*(*) по перехменной х с соответст- соответствующими граничными условиями (процедура построения таких сплайнов приведена в гл. 1). 2-й шаг алгоритма Для каждого узла (*,>';) сетки со вычисляются "исправленные" зна- значения ztj по формуле z0 = Sj(xt). 3-й шаг алгоритма аналогичен 1-му шагу: на каждой из линий х = xt (/= О, 1, ..., т) для массива z/y строится сглаживающий кубический сплайн St[v\ по переменной у\ удовлетворяющий граничным условиям соответст- соответствующего типа. 4-й шаг алгоритма Для каждого узла сетки # вычисляются новые "исправленные" значе- значения z^l по формуле z^ = ^() 78
Сплайм-функции двух переменных 5-й шаг алгоритма Для новой системы значений ц ' строится интерполяционный сплайн S(x, у), который и будет искомым сглаживающим сплайном. После выполнения 5-го шага ачгоритма в каждом узле сетки со будут известны величины i2.i ixi (>'! \ху: U ' №ij » Hij ? r-ij » которые полностью определяют сглаживающий бикубический сплайн, удовлетворяющий заданным граничным условиям. Алгоритм вычисления значений сплайна по заданным величинам B; !х> (у: \ху\ полностью совпадает с алгоритмом, приведенным в 2.1.4. Замечания: 1. Перечисленные выше сплайны являются решениями соответст- соответствующих вариационных задач в гораздо более широком классе функ- функций, а именно в классе \\'22' 2. При помощи весовых множителей pi и а можно управлять Ц свойствами сглаживающего сплайна, например, определяя форму слоя вблизи "экспериментальных " точек ztj , в котором размещается сглаживающий сплайн. Так как в двойную сумму J(J) весовые множи- множители pi и <т . входят в виде произведений, то их выбор будет ока- окаfS ?* P/ ,4 зывать влияние на характер сглаживания не в одной точке ух^уЛ, а соответственно на линиях х = х и v = V, . 3. Значительно более сложный случай, когда весовые множители в двойной сумме имеют значения ту * p^j , здесь не рассматрива- рассматривается. , , $/ 2.2.5. Построение сплайновых поверхностей при помощи ф; сплайн-функций X; Выше рассматриваюсь массивы, точки которых бьыи занумерованы ;||t так, что и их абсциссы, и их ординаты образовывали строго возрас- '•$: тающие последовательности. Это обстоятельство определяло и выбор класса аппроксимирующих поверхностей (графики функций) и способ их построения. Однако предложенный метод позволяет достаточно успешно строить сглаживающую поверхность и в более общем случае, когда ну- нумерация точек массива 79
Сплайны Р = \ги{ху>Уи>2и)> ' = °> ^ ' w> J = и их расположение в пространстве, как правило, не связаны. Ясно, что для решения этой общей задачи необходимо сущест- существенно расширить класс допустимых поверхностей, включив в него и поверхности, которые нельзя однозначно спроектировать ни на одну из координатных плоскостей, и поверхности с самопересечениями и самоналеганиями. Такие поверхности удобно описывать при помощи параметрических уравнений у = >>(", v); z = z(w,v), Потребуем дополнительно, чтобы функции х(и, v), y(u, v) и z(u, v) об- обладали достаточной гладкостью, например принадлежали классу С1 (R) или классу С2 (я). Для отыскания параметрических уравнений поверхности, сглажи- сглаживающей заданный массив, поступим следующим образом. 1-й шаг. На произвольно взятом прямоугольнике Я изменения параметров и и v вводится вспомогательная сетка а = и0 <!/,.'< ... <um_l<um=fl9 r = vo<v,< ... <vn_l<vn=S, число узлов которой совпадает с числом точек в массиве Р. 2-й шаг. По заданному массиву Р строятся 3 новых вспомогатель- вспомогательных массива: X = {(и^.дгД / = 0, 1, ..., /и;;=0, 1, ..., л Y = Z = 3-й шаг. Для каждого из массивов X, Y и Z методами, изложен ными выше, находятся соответствующие сглаживающие сплайн-функ ции x(w, v), ><w, v) и z{u, v). В результате мы получаем параметрические уравнения сглажи вающей сплайновой поверхности, порожденной точками Р^ . Замечание Полученная поверхность будет гладкой, но не обязательно регуляр- регулярной, так как возможность rank У* У и С <2 80
£ \ Сплайн-функции двух переменны I | \ для некоторой точки (w*,v*) e(cr,/?)x (;к,£) исключать нельзя. Кроме того, эта поверхность может иметь линии самопересечения и участки самоналегания. 2.2.6. Программная реализация Описанный выше алгоритм построения бикубического сглаживающе го сплайна и вычисления его значений в произвольной точке реализо | ван в виде подпрограммы Smspl2, написанной на языке Фортран: Ы subroutine Smspl2 * (m,x,n,y , z , zl,zr,zu,zd,rhc,sgm,zx,zy,zxy,ind,ib,xx, * yy,a,b,с,d,e,g,u,v, w,t,s,zz,su,sd,p,q,r,dd,zm,spl) Q*********************************************************** с Программа Splint2 строит сглаживающий бикубический * с ' ' сплайн для таблично заданной функции *ч с двух переменных ' * с z - одномерный массив длины m*n содержит значения * с сглаживающего сплайна в узлах сетки; * с значение сплайна в узле*. i,j ':> содержится в элементе * с • z ■ i+ ■■' j -I ■ *m'■■ . * cm - число узлов сетки по оси х * * с х - массив длины т, содержит узлы сетки по оси х • * сп - число,узлов сетки по оси у * с у - массив длины п, содержит узлы сетки по оси у * с z - одномерный массив длины n*m, содержит значения ' * с сглаживающего сплайна в узлах сетки; * с значение функции в узле сетки (i,i) содержится в * с элементе z ; i + (j -1 ':• *m) * с ib - код типа граничных условий на прямых x=xl, x=xm и * с на прямых y=yl и у=уп * с ib ='i (i=l-3i - условия i-rc типа * с zl - массив длины п, элемент zl • j'■ содержит значение * с i-й частной производной по х в узлах •.. 1, j ; .* с для граничных условий i-rc типа ■: i = 1, 2 "■ ,, * с zr - массив длины п, элемент" zr ■: j ; содержит значение * с i-й частной производной по х в узлах •: m, j .■ * с для граничных условий i-rc типа •:.i = 1, 2 • * с zu - массив длины т, элемент zu ■:.}•' содержит значение * с i-й частной производной по у в узлах •:. j ,m'; * с для граничных условий i-rc типа ■' i = 1 # 2 ■ * -с zd - массив длины т, элемент zd■j; содержит значение * с i-й частной производной по у в узлах ■■ j , 1 "'■ ' * с для граничных условий i-rc типа Гi = 1, 2 ;■ * с zxy- массив длины 4, -содержит значения смешанных * с производных в угловых точках сетки в- случае гра- * с ничных условий 1-го или 2-го типа' * с rhc- массив длины m для размещения весовых ксэффициен- * с тов функционала * с sgm- массив длины п для размещения весовых коэффициен- * с тсв функционала * с a,b,c,d - рабочие массивы длины max;.п,т; > * с s , t ,u, v ,v;, zz , su , sd, - рабочие массивы длины maxn,m!+l * с p,q,r,e,g - рабочие массивы длины maxi'n/mi+2 * с zx, zy , zm, zz , dd - рабочие массивы длины max •:' n,m) * с ■ * с ind - код режима работы: * 8
Сплайны с ind=O - программа вычисляет параметры сплайна * с ind=l - параметры сплайна известны * с " . ■ . • " * с хх,уу - координаты точки, в которой вычисляются парамет- * с ры сплайна - • * с * с Результат: ■ * с spl - значение сплайна в точке с координатами t.xx,yy.) * (-а********************************************************** dimension xil) , yd) , z(l) , zl(l) , zrf.1"), zuil), * zd'l), zx(l), zy(l), zxy(l), u(l) , v(l) , * v:.i. 1 • , tfli , sdi , su A) , sd i 1) , ail) , * p \ 1 :• , q A ) , r A i , dd A ') ., zm • 1 > , ••* rho '. 1) , sgm 11) с if (ind.eq.0■ then if < ib.eq . 2 :• then do i=l,m zu'i1 =0. zd-ii = 0. enddo do i =1,n Zl'ji = 0. zr • j :• = 0. enddo do j=l,f zxy •: j :• =* 0 . enddo endif с ._••■■ do j = 1, n call Smspline (m, ib, 0 ,x, z t, 1+ (j -1) *m :> ,a,b,c ,d,e,g, * rho,z1(j),zr!j),u,v,w,p,q,r,s,t, * ■ zx (. 1+ ! j -1':- *m'.' ,dd, zm,xx,sp,dsp,d2sp) enddc do i = 1, m do j = 1,n • ■ . zz ; i • = zx'. i + i j -1 • *m» enddc call Smspline m,ib,0,y,zz,a,b,c,d,e,g,sgm,zu[i), * . zd (i) ,u, v,w,p,q,r ,s, t, zy i'l+ •:'i-l> *n) , 1 * . dd, zm,xx,sp,dsp,d2sp':' enddc с do i = 1, m do j ■ = 1, n z i+/j-l■*m = zyij+ »i-l-*n) enddc enddo с call Splint2 i,m,x,n,y , z , z.1, zr, zu, zd, zx, zy, zxy, 0 , ib, * ib,xx,yy,a,b,c,d,u,v, w,t,s,zz,su,sd,spl endif с ■ call Splint2 (m,x,n,y,z,zl,zr,zu,zd,zx,zy,zxy,1,ib, * ib,xx,yy,a,b,c,d,u,v, w,t,s,zz,su,sd,spl return 82
Сплайн-функции двух переменных end Обращение к программе имеет вид: call Smspl2 * ш,х,п,у,z,zl,zr,zu,zd,rhc,sgm,zx,zy,zxy,ind,ib,xx, * yy,a,b,с,d,e,g,u,v, w,t,s,zz,su,sd,p,q,r,dd,zm,spl) Входные данные: m - число узлов сетки по оси х, j х - массив длины т, содержит узлы сетки по оси х, п - число узлов сетки по оси у, у - массив длины п, содержит узлы сетки по оси у, z - одномерный массив длины n*m, содержит значения сглаживающего сплайна в узлах сетки; значение сплайна в узле сетки (i, j) содержится в элементе z (i + (j-1; *m), ib - код типа граничных условий на прямых х = х1их = хти на прямых у = yl и у = уп, ib = i (i = l-3) -условия i-ro типа , zl - массив длины п, элемент zl (j ) содержит значение 1-ой частной производной по х в узлах A, j) для граничных условий 1-го типа, zr - массив длины п, элемент zr(j) содержит значение 1-й частной производной по х в узлах (m, j) для граничных условий 1-го | типа, zu - массив длины т, элемент zu ,' j } содержит значение 1-й частной производной по у в узлах (j> m) для граничных условий 1-го типа, zd - массив длины т, элемент zd(j} содержит значение 1-й частной производной по у в узлах (ь 1) для граничных условий 1-го типа, zxy - массив длины 4, содержит значения смешанных производных в угловых точках сетки в случае граничных условий 1-го типа, то - массив длины m содержит значения весовых коэффициентов, sgm - массив длины п содержит значения весовых коэффициентов, а, b, с, d - рабочие массивы длины max ; n, m} } s,t,u,Y,tt/Zz,su,sd - рабочие массивы длины max{n,m)+*l р, q, г, е, g - рабочие массивы длины max (n, m} + 2 zx, zy, zm, z z, dd - рабочие массивы длины max (n, m} ind - код режима работы: ind = 0 - программа вычисляет параметры сплайна, ind = 1 - параметры сплайна известны, 83
Сплайны хх, уу - координаты точки, в которой вычисляются параметры сплайна. Результат: spl - значение сплайна в точке с координатами (хх,уу). В процессе работы программа Smspl2 обращается к программам Smspline и Splint2. Чтобы показать, как пользоваться программой Splint2, рас- рассмотрим следующий пример, имитирующий сглаживание эксперимен- экспериментальных данных. Пример. Предположим, что фунция z = sin(x+#y2) "измеряется" в узлах сетки 1 . 1 , yj\ / = 0,l, ..., 5, у =0,1, ...,20}. 1U 2,\) с погрешностью £, которая распределена равномерно на отрезке [0.1, 0.1]. Для весовых коэффициентов примем значения р, =0.001, / = 0,' ..., 5, crj =0.001, у =0, ..., 20. Программа для решения этой задачи может иметь следующий вид: - dimension х-. 2 00; , у B00') , zB00) , z 1 B00 :■ , zrB 00;- , * zu ■. 2 0 0 • , zd i 2 0 0 ! , zx i 2 0 0) , zy B 0 0 ':■ , zxy •. 2 0 0 } , * и ; 2 и и • , v •: 2 и и :< , a i 2 и 0 ) , b 12 и и > , с *. 2 и и ■ , * а', ^uu,i , wi^uu) , tBuu) , sui20u.i , sai.^uuj , *. . s; 2GO , zzBOO1, rhot'200'j, sgmB00;, p'200'; , * ■ q.,200- , ri200- , dd-:200) , zmB00)-, e':200'.- * g-200- aata rhc /^uu*u.uul/ data sgm / 2 00*0.001/ m = 6 n = 21 hx = 0.5/(m-1) hy = 1./..П-1 ■■• ^-^ ^- do i = 1,m x ; i :■ = hx* ■, i-1"; zu;i;= 2.*cosd. + x -. i /> :• zd •:. i • = 0 . enddc G do j = 1, n ■yo"i = hy*(j-l) zl ■ j :• = cos (y (j ) **2 ) 84
Сплайн-функции двух переменных I ■'!■ V 4 . ■к * zr(j)= cos@.5 + y(j)**2) enddo yA! = 0. zxyB) = 0. zxyC) = -2.*sinA.) zxy i 4 ;■ = -2 . *sin ■' 1. 5 > call seedi1234i do j = 1,n do i = l,m call random i df). zti+(j-l!*m> = sin. enddo enddo xi i :■+y ■: j > **2'> + 0.4*;df-0.5) ind - ib = call и 1 Smspl2 ■: m, x, n,у , z , z 1, zr , zu, zd, rho, sgm, zx, zy, zxy Дnd,ib,xx,yy,a,b,с,d,e,g,u,v, w, t,s,zz,su,sd^p^q,r,dd,zm,spl) * ind=l open ■ 1, f ile= ' resl. dat' .■ hx = hx/2. • hy = hy/5,- dc i = 1,11 xx = hx* -: i-1 ) dc j = 51,cl yy = hy*.:j-l> call Smspl2 •:.m ,x,n,y , z , zl, zr , zu, zd, rhc, sgm, zx, zy,zxy,ind,ib,xx,yy,a,b,с,d,e,g, ■ u , v , v:, t, s , zz , su , sd, p, q, r , dd, zm , spl : v:*rite 1,* xx, yy, spl enddc . ' " enddo step end Замечание Сравнение сглаживающего стайна с интерполяционным, построен- построенным на том же массиве исходных данных и удовлетворяющим тем же граничным условиям, показывает, что осциляции, присущие ин- интерполяционному сплайну у практически полностью отсутствуют в сглаживающем сплайне. Приведенная ниже программа сначала создает массив "экспери- "экспериментальных" данных, а затем строит сглаживающий сплайн, удовлет- удовлетворяющий граничным условиям 2-го типа. ы \ > dimension * х zu U ! d'. *■> *> <■> zvj ■ , i 2 0 0 :• , z и и .' , 2 0 0 ''. , у • z и 0 .' v i 2 00 :- *■> *> *^ v: ■: z и и ; , z , zx , ai , t. 2 0 0 i ■,200 :• 2uu ; ^ U U •' , zl. , zyi , bB 2 0 0'. *->t «Л Л , z!u0 • и и ) , zr;. , zxy , c; 2 , sd ■: 2 00 ; , ! 2 0 0 • , UU.i , 85
Сплайны * si 200) , zzB00), rhoB00), sgm B 00), pBGG'> * . qi'200) ,, rB00) , ddB00) , zmB00) , eB00) * gB0p) i с data rho / 200*0.001/ data sgm / 200*0.001/ с , m = б n = 21 hx = 0.5/im-1) ■ hy = l./(n-i) с do i = 1, m x {i ••. = hx* ( i-1) enddc с do j = 1, ri у j ;■ =■ hy*ij-l) enddc с ' ■ ■ ' call seed'.. 12 34) do j = 1, n do i = 1, m call random(df) z ; i+ ; j-1 ; *m) = sin • X'i'■+y i. j ) **2) + 0.4* i'df-:0.5 • enddo enddc с ind = 0 ib = 2 с call Smspl2 im,x,n,y,z,zl,zr,zu,zd,rhc,sgm,zx,zy, * zxy,ind,ib/xx,yy,a,b,c,d,e,g,u,v, v:, ind=l ' open ; 1, f ile= ' res2 . dat' :■ hx = hx/2. hy = hy75. do i = 1Д1 xx = hx*■i-1* do j = 51,61 yy = hy*o-i;.. call 3mspl2 imtx,n,y,z,zl,zr,zu,zd,rhc,sgm,zx, * zy,zxy,ind,ib,xx,yy,a,b,с,d,e,g, * u , v, v:, t, s , z z f su, sd, p, q, r, dd, zm, sp 1 ■■ write ■!,*'> xx, yy, spl enddc enddo с step end Следующая профамма сначала создает массив "эксперименталь- "экспериментальных" данных, а затем строит сглаживающий сплайн, удовлетворяю- удовлетворяющий граничным условиям 3-го типа, 86
0 Сплайн-функции двух переменнь в * * * * * с с dimens data data data m = ■ n = hx = hy = dc i X ! ■enddc dc j enddc ion rho sgm pi 21 21 2.* 2,* = 1 * l ■• = 1 j • X E0) zu E0 u d s q g / / / / / Pi pi ,m = ,n = E0) «50) E0) E0) E0) 50* 50* * / t 0. 0. У ( zd w z r ul ul ( ( z ( / 1 3.141592 i '• m** / ;П-. hx* i hy* i 1) 1) i- 1'' 1» 50) , E0) ; 50) . 50) . E00», 50) , 6/ zE00) , zxE00), aE0) , t«50) rhoE0), ddE0) , 21' zy ( bE SU (. sgm zm ( 50) , 500) , 00) , 50) , E0) , 50) , • zrE0) , zxyE00) сE00) sdE0) , PEO) , eE0) , * call seed'1234i dc j = l,n-l uc i = i, m"i. call random(df.» z (i+ i j-1) *m'< = sin^X'i'+sin enddc enddc ■ i idf-0\5) W--' I * do i - 2 ,m-l . • z '■■ i+ rn-1 j *m\ enddc do j = 2,n-l z i j *m :• = z '1 enddc - = z ■ i z •• m .• z ■ т*П' z ■ 1+ ''n- ind ■ = ib rn = z •. 1 :• = z ■. 1 ■• l : *m ;■ = z ■: 1 Smspl2 (т,х,п,у,z,zl,zr,zu,zd,rhc,sgm,zx,zy, zxy,ind,ib,xx,yy,a,b,c,d,e,g,u,v, w, t,s,z z,su,sd,p,q,r,dd,zm,spl• ind=l open (i,files'res3.dat') hx = hx/2. hy = hy/2. 8
Сплайны dc j = 10,21 yy = hy*(j-l) dc i = 20,35 xx = hx*(i-1) call Smspl2 (m,x,n,y, z , zl, zr, zu, zd,rho,sgm, zx, * zy,zxy,ind,ib,xx,yy,a,b,с,d,e,g, * u, v, w, t, s , zz , su, sd, p , q, r , dd, zm, spl ■ write A , *) xx, yy, spl enddc enddc с close A ;• step end Текст профаммы SMspl2 находится в файле smspl2.for в поддирек- поддиректории SMOOTH на дискете, которую можно приобрести в изда- издательстве "Диалог-МИФИ". В эту же поддиректорию помещены фай- файлы, содержащие примеры применения профаммы Smspl2 при других фаничных условиях. Подробную информацию об именах этих файлов и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 88
Часть II Геометрические сплайны Во многих задачах требование того, чтобы конструируемая кривая или поверхность однозначно проектировалась соответственно на прямую или плоскость, является слишком жестким. Расширяя допустимые классы кривых и поверхностей, естественно обратиться и к более общему способу описания их частичных фрагментов. В качестве нового способа задания кривых и поверхностей удобно взять парамет- параметрический способ. Параметрическое задание кривой или поверхности имеет извест- известные преимущества над другими методами, в частности, потому, что оно не накладывает практически никаких ограничений на множество вершин в опорном массиве. Вместе с тем этот метод требует и большой осторожности: для того чтобы составная кривая или поверхность, описываемая парамет- параметрическими уравнениями, была достаточно регулярной, необходимо быть очень внимательным, особенно в местах стыковки: связь между геометрическими и аналитическими свойствами не всегда оказывается простой. Выбор многочленов 3-й степени для описания координатных функций проектируемых кривых геометрически вполне обоснован: координатные функции должны быть сравнительно простыми и одно- одновременно обеспечивающими разумную гладкость. Как и в I части, при построении составных поверхностей разумно использовать результаты решения соответствующих одномерных задач, в частности ограничиться полиномиальным описанием ко- координатных функций. Это заметно упрощает решение задачи создания поверхностей сложной формы. 89
Сплайны Глава 3. Сплайновые кривые Общую задачу, рассматриваемую в этой главе, можно сформулировать так: по заданному множеству вершин * = \М)>*1>••• с учетом их нумерации построить гладкую кривую, которая, плавно изменяясь, последовательно проходила бы вблизи этих вершин и удовлетворяла некоторым дополнительным условиям. Эти условия могут иметь различный характер. Например, можно потребовать, что- чтобы искомая кривая проходила через все заданные вершины или, про- проходя через заданные вершины, касалась заданных направлений, явля- являлась замкнутой или имела заданную регулярность и т. п. При отыскании подходящего р решения задачи приближения важ- 1 ную роль играет ломаная, звенья ко- которой соединяют соседние вершины заданного набора. Эту ломаную на- называют контрольной или опорной, а ее вершины - контрольными или опорными (рис. 3.1). Во многих слу- Рис. 3.1 чаях она довольно точно показывает, как будет проходить искомая кривая, что особенно полезно при решении задачи сглаживания. Каж- Каждая вершина заданного массива является либо внутренней либо гранич- граничной (концевой). В массиве Р вершины Pf., 6 = 1,..., /?/-l) внутренние, а вершины Ро и Рт - граничные (концевые). В отличие от ситуации, рассматриваемой в гл. 1, в данном случае никаких ограничений на множество вершин не накладывается - они могут быть заданы как на плоскости, так и в пространстве, их взаимное расположение может быть совершенно произвольным, некоторые из вершин могут совпадать и т. д. Поэтому описание нуж- нужной кривой следует искать в более общей, параметрической форме, например в следующем виде где at(t) - некоторые функциональные коэффициенты, подлежащие определению. 90
Сплайновые кривые Если количество вершин в заданном множестве Р достаточно ве- велико, то найти универсальные функциональные коэффициенты at как правило, довольно затруднительно. Если универсальные коэффи- коэффициенты afy все же найдены, то часто оказывается, что они наряду с нужными свойствами обладают и такими, которые не всегда удовлет- удовлетворительно согласуются с ожидаемым поведением соответствующей кривой (например, кривая, описываемая уравнением C.1) с этими коэффициентами, может осциллировать или отклоняться от заданного множества местами очень заметно). Для успешного решения поставленной задачи приближения, весьма удобно привлечь кривые, составленные из элементарных фраг- фрагментов. В случае, когда эти элементарные фрагменты строятся по еди- единой сравнительно простой схеме, такие составные кривые принято называть ста и новым и кривыми. Параметрические уравнения каждого элементарного фрагмента ищутся в виде (*) с той лишь разницей, что всякий раз привлекается только часть заданных вершин множества Р, а соответствующие коэф- коэффициенты имеют одинаковую природу: часто используются многочле- многочлены одинаковой степени, рациональные дроби, экспоненты и др. Для описания элементарных кривых и вычисления их геометри- геометрических характеристик (информация о которых необходима при состы- состыковке) в качестве функциональных коэффициентов обычно исполь- используются многочлены невысоких степеней, 2-й или 3-й, в первую очередь потому, что они сравнительно просто вычисляются. Конечно, привлекая многочлены больших степеней, можно описывать весьма сложные кривые. Однако у таких многочленов много коэффициентов, физический и геометрический смысл которых трудно понять. Кроме того, использование многочленов высокой степени может вызвать нежелательные колебания результирующей кривой. Наибольшее распространение получили методы конструирования составных кривых, в которых используются кубические многочлены (которые, кстати, активно применялись и в гл. 1). Выбор в качестве функциональных коэффициентов кубических многочленов позволяет учесть и дифференциальные и внешнегеометрические требования, накладываемые на искомую кривую. Высказанные соображения определяют характер изложения раз- разделов этой главы. Глава начинается с описания минимально необхо- необходимого набора сведений из дифференциальной геометрии кривых. За- Затем рассматриваются различные классы кривых, при помощи которых можно решить поставленную задачу приближения. Описание каждого из классов проводится практически по одной и той же схеме. Сначала 91
Сплайны определяются элементарные кривые (фрагменты), а затем пока- показывается, как путем состыковки этих элементарных кривых получить составную кривую с достаточно хорошими характеристиками. Зна- Значительное внимание уделено описанию основных свойств рассматри- рассматриваемых кривых. Такой подход поможет пользователю в выборе наибо- наиболее подходящего для него класса кривых. Часть из свойств формулируется в виде ответов на стандартный набор вопросов, среди которых есть, например, такие: • каков порядок гладкости построенной кривой? • каковы особенности расположения кривой относительно заданных вершин опорной ломаной? • как сказываются на форме кривой изменения опорных вершин? Полезно также знать, как связаны между собой форма кривой и простейшие геометрические преобразования (аффинные и проек- проективные). Остановимся на этом подробнее. Ясно, что, построив кривую, можно подвергнуть ее любому (аф- (аффинному или проективному) преобразованию. Можно поступить и по-иному: сначала подвергнуть этому преобразованию заданный на- набор опорных вершин и только потом построить по нему кривую из рассматриваемого класса. Если результаты оказываются одинаковыми, то говорят, что кривая инвариантна относительно этого (аффинного или проективного) преобразования. Напомним, что аффинные преобразования включают в себя вра- вращение, растяжение и сжатие, параллельный перенос и их всевозмож- всевозможные комбинации, а к проективным преобразованиям, кроме того, от- относятся еще и преобразования перспективы. Большинство из рассматриваемых классов кривых обладают свойством аффинной инвариантности. Есть среди них и проективно- инвариантные. Хотя окончательный результат и не зависит от после- последовательности выполнения этих двух операций - преобразования на- набора опорных точек и построения кривой, выбор порядка их исполне- исполнения может заметно снизить вычислительные затраты. Легко заметить, например, что поворот массива вершин вокруг оси на некоторый угол и последующее построение кривой требуют меньшего объема вычис- вычислений, чем поворот построенной кривой. Использование рациональных кривых вносит в решение задачи приближения нужную гибкость, ибо в описании таких кривых прини- принимают участие свободные числовые параметры. Возможность выбора позволяет учесть многие обстоятельства, неизбежно возникающие при построении кривых с предписанными свойствами. Вместе с тем ра- рациональные кривые сохраняют многие из свойств, которыми облада- 92
Сплайновые кривые ют соответствующие нерациональные (полиномиальные) кривые. А то обстоятельство, что рациональные кривые проективно инвариантны, является одним из наиболее привлекательных их свойств, весьма по- полезных при визуализации. Очень важным является вопрос единой параметризации состав- составной кривой. Дело в том, что связь между аналитическим описанием составной кривой и ее геометрической формой не всегда проста и очевидна; и некоторые проблемы, которые могут возникнуть при состыковке кривых, обсуждаются в 3.1.7 на нескольких типичных примерах. Как правило, каждый раздел, посвященный определенному клас- классу сплайновых кривых, завершается программной реализацией и кон- конкретными примерами вычислений. 3.1. Элементарные сведения из дифференциальной геометрии кривых 3.1.1. Параметризованные кривые Параметрически заданной пространственной кривой называется мно- множество у точек М пространства, декартовы координаты х, у и z кото- которых определяются посредством соотношений x = x(t). v=v(r)? z = z(t), a<t<b, где x(t)9 y(t), z(t) - функции, непрерывные на отрезке \a*b\, или в век- торно-матричной форме: R = Щ = 4I a<t<b. Эти соотношения называют параметрическими уравнениями кри- кривой у или просто параметризацией кривой у. 3.1.2. Гладкие и регулярные кривые Пространственная кривая у называется С -гладкой относительно за- заданной параметризации, если векторная функция R(r) является С - гладкой на отрезке [а, Ь\, то есть каждая из координатных функций x{f), y(f), z(t) имеет на отрезке [а, Ь\ непрерывные производные до по- порядка г включительно (в точках а и b вычисляются односторонние производные, соответственно правая и левая). 93
Сплайны Гладкая параметризация называется регулярной, если т \' О, a <t< ь, где точкой обозначается дифферен цирование по параметру /. Величина Щ называется скоростью кривой (отно- (относительно заданной параметризации) в точке М Рис. 3.2 M(t), a - длиной дуги отрезка кривой kjAM (рис. 3.2). 3.1.3. Замена параметра Замена параметра г = г(/), где f (/) > 0, параметрические уравнения кривой у • R(r) = R(r(r)), а<т< где t = t(r) - функция, обратная функции г = а<т<Ь9 изменяет , и ее скорость dR dz = • R но сохраняет форму кривой и ее гладкость (последнее при условии соответствующей гладкости функции r(f)). Параметризация, где в качестве параметра выбирается длина дуги регулярной кривой, называется естественной параметризацией, а сама длина дуги - естественным параметром. Скорость кривой относитель- относительно естественной параметризации равна единице в каждой точке, (здесь штрихом обозначено дифференцирование по длине дуги). 3.1.4. Трехгранник Френе Пусть R = R(r) - параметрическое векторное уравнение регулярной кривой у. С3 - 94
Сплайновые кривые 15 it Тогда Щ * - единичный вектор касательной кривой в точке M{t). Пусть векторы R\tj и R\t) неколлинеарны. Плоскость П, проходящая через точку M(t) параллельно R(/) и , называется соприкасающейся пюскостью кривой у в этой точке, а ее нормальный вектор R(t) x R(t) является направляющим вектором бинорма!и (рис. 3.3). В теории кривых важную роль R/7)AR/f) играют единичный вектор бинормали щ - и единичный вектор главной нормали Щ = в(/) х Щ (он лежит в соприкасающейся плоскости). Тройка взаимно перпендику- перпендикулярных единичных векторов I, Щ Щ Рис. 3.3 В N называется основным трехгранником или трехгранником Френе (рис. 3.4). рис jj В случае произвольной параметризации R=R(r) векторы трехфанника Френе вычисляются по формулам а в сл>^чае естественной параметризации R = R(s) - по формулам R"(*) ^л.^А^А R"(s) R'(s)xR"(j) Трехгранник Френе не зависит от параметризации кривой. 95
Сплайны Замечание Формулы теории кривых, в которые входит естественный пара- параметр, как правило, выг.гядят проще и часто более явно несут в себе отражаемый ими геометрический смысл. Однако в приложениях (в частности, при построении кривых) использование естественной параметризации весьма затруднительно, хотя бы потому, что зачастую еще нет самой кривой. 3.1.5. Кривизна и кручение кривой Для производных векторов трехгранника Френе С3 -регулярной кри- кривой справедлива следующая формула (формула Серре-Френе): T(s)) V V О О \ kx(s) 0 -k2(s) О \ J / V где k\(s) - кривизна, a /^(s) - кручение кривой в рассматриваемой точке. Кривизну и кручение произвольной регулярной кривой можно вычислить посредством следующих формул: R"(s) k2=k2{t) = Щ Щ x R(/) Величины k\ и ki не зависят от выбора параметризации кривой у и показывают степень ее искривленности: кривизна кривой характе- характеризует степень отклонения кривой от прямой линии (кривизна пря- прямой тождественно равна нулю), а кручение - от плоскости (кручение любой плоской регулярной кривой тождественно равно нулю). Вектор К, вычисляемый по формулам Щ - Щ Щ называется вектором кривизны кривой у. Этот вектор лежит в соприка- соприкасающейся плоскости кривой в точке, перпендикулярен касательной к кривой в этой точке, и его длина равна кривизне кривой в точке M(t), 96
Онлайновые кривые Окружность с центром в точке N() RM k2x{t) радиуса называется соприка- соприкасающейся окружностью кривой у в точке M{t). Соприкасающаяся ок- окружность лежит в соприкасающейся плоскости кривой у, проходящей че- через точку Л/(г), и имеет с кривой в этой точке касание, порядок кото- которого не ниже второго. Центр сопри- соприкасающейся окружности называется центром кривизны кривой, а ее ради- радиус - радиусом кривизны кривой в точ- точке M(f) (рис. 3.5). Рис. 3.5 3.1.6. Плоские кривые А. Параметрическое задание Запишем основные формулы для случая, когда кривая у является плоской: , a<t<b. Ч.' Скорость кривой в точке M(t) - Единичный вектор касательной - 1 Щ Ч-9В5 97
Сплайны Единичный вектор нормали (рис. 3.6) - R " R"(s) N@ = 1 Л Кривизна плоской кривой - к = k(s) = x'(s)y"(s) - x" M(t) Рис. 3.6 V/ / . -» / ч . i/\\3;2 (может менять знак). Формулы Серре-Френе - rT(sf N'D V О Щ о ) №)) V Б. Неявное задание Непустое множество у точек М(х, у) плоскости, декартовы координаты х и у которых удовлетворяют уравнению вида где F(x, у) - гладкая функция своих аргументов, называется неявно за- заданной кривой, а само уравнение - ее неявным уравнением. Пусть F(xy у) - гладкая функция своих аргументов. Точка Л/0(х0. Vo) называется регулярной точкой неявно заданной кривой, если выполнены следующие условия: и особой точкой, если о) = О. Fx(x0..y0) = 0, Fy(xo,vo) = O. 3.1.7. Составные кривые Часто кривую приходится строить из определенным образом подо- подобранных частей. Для того чтобы получающаяся в результате составная кривая имела достаточно хорошие геометрические характеристики, 98
Сплайновые кривые важна не только регулярность составляющих ее частичных кривых, но и выполнение определенных требований в стыковочных ухчах. Пусть , a_<t<b_, R = - параметрические уравнения гладких, кривых у_ и у + соответст- соответственно. Требование 1 Для того чтобы составная кривая y-Uy+ была непрерывна, необходимо, чтобы правый конец кривой у_ совпа- совпадал с левым концом кривой у+ : / о ~ч Рис. 3.7 (рис. 3.7). При построении составных кривых важно помнить, что, с одной стороны, кривая как множество точек может иметь прекрасные гео- геометрические характеристики, но описываться сравнительно плохими параметрическими уравнениями, а с другой - хорошие дифференци- дифференциальные свойства координатных функций кривой не всегда приводят к регулярной кривой. Поясним сказанное несколькими примерами. Внимание: примеры! Пример 1. Составная кривая у = у _ \Jy+ задана параметрически- параметрическими уравнениями 4' 2 R_(f) \ 1+/J (рис. 3.8). Результат: составная кривая - прямолинейный отрезок, касатель- касательные векторы в обшей точке не совпадают, ...I- \ 99
Сплайны Причина особенности: несогласованность параметризаций в точке стыковки кривых. Требование 2 () () a > 0. / ч ,2Л Пример 2. Составная кривая у = у_ [Jy+ задана параметрически- параметрическими уравнениями '-0-<): О-'У (рис. 3.9). Результат: составная кривая имеет излом, касательные векторы в общей точке равны, «-о-д. «.и- Причина особенности: неудачная параметризация стыкующихся кри- кривых - касательные векторы в точке стыковки равны нулю. Пример 3. Составная кривая у = у _ \Jy+ задана параметрически- параметрическими уравнениями -7 COSIy^l- sini^O-- у\ ч Ч ) О < / < 1. (рис. 3.10). Результат: составная кривая - Рис. ЗЛО круговая двузвенная ломаная, касательные векторы в точке стыка нулевые, вторые производные радиусов-векторов в точке стыка нулевые, векторы кривизны в точке стыковки различны, 100
Сплайновые кривые Ч' Причина особенности: несогласованность параметризаций стыку- стыкуемых кривых. Пример 4. Составная кривая у =у- 1)у + задана параметрически- параметрическими равнениями МО = л ч v / МО- ч \ У Y. (рис. 3.11). Результат: составная кривая - полуокружность, касательные векто- векторы в точке стыка различны, '°^ '' м- V О ' Рис. 3.11 вторые производные радиусов-векторов в точке стыка различны, \ -я > кщ- о \-Ю векторы кривизны в точке стыковки одинаковы. К A) = 0) ' М°) = ч Причина особенности: один из касательных векторов в точке сты- стыковки нулевой. Требование 3 101
Сплайны Пример 5. Составная кривая у = у _(jy + задана параметрически- параметрическими уравнениями -t2+2t V Рис. 3.12 (рис. 3.12). Результат: касательные векторы в точке стыковки равные и не нулевые, \ ОГ ч or вторые производные радиусов-векторов в точке стыковки не нулевые и неравные, -2j' векторы кривизны в точке стыковки равны, 1 ( 25V-2 J К+@) = — v ' 25 ч -2) Причина особенности: несогласованность параметризаций состы- состыкованных кривых. 3.1.8. Геометрическая непрерывность При построении составных кривых приходится сталкиваться с ситуа- ситуацией, когда каждая из регулярных кривых, участвующих в процессе создания новой кривой, имеет собственную параметризацию. Важное замечание Случай, когда первые производные радиусов-векторов кривых в точке стыковки обращаются в нуль, из рассмотрения исключен (вследствие многообразия сложностей, которые могут встретиться). Несогласованность параметризаций часто яатяется причиной особенностей, возникающих в стыковочных узлах. Это - особенности параметризации. 102
Сплайновые кривые Непрерывная кривая называется G1 -непрерывной {геометрически непрерывной, G1 -кривой), если вдоль этой кривой ее касательная изме- изменяется непрерывно. Любая G1-непрерывная кривая является С1-регулярной относи- относительно естественной параметризации. Кривая, изображенная на рис. 3.8 (пример 1), G1 -непрерывна. G1 -непрерывная кривая называется G2 -непрерывной (геометри- (геометрически непрерывной, G2 -кривой), если вдоль этой кривой ее вектор кри- кривизны изменяется непрерывно. Любая G2 -непрерывная кривая яатяется С2 -регулярной относи- относительно естественной параметризации. Кривая, изображенная на рис. 3.12 (пример 5), G2 -непрерывна. Требования к С2 -регулярным кривым Если С2 -регулярные кривые v_: R = R_(t). a_<t<b_, удовлетворяют условиям: то составная кривая у = у_^jy\ будет G2 -кривой. G2-кривая - это кривая, являющаяся С2-регулярной относи- относительно естественной параметризации, но не обязательно С2 -регуляр- -регулярная относительно другой параметризации. Если параметр кривой - длина дуги s, то в каждой точке G2 -кри- -кривой выполняются равенства юз
Сплайны 3.2. Кривые Безье 3.2.1. Параметрические уравнения кривой Безье По заданному массиву вершин (элементарная) кривая Безье степени т определяется при помощи век торного уравнения, имеющего следующий вид: т /=0 w! где - многочлены Бернштейна. Здесь введено обозначение Матричная запись параметрических уравнений, описывающих кривую Безье: Ч'Г У о - У "Ш т /^00 \ где 0<г<1 т J V/. В случае, если промежуток изменения параметра произволен, а < t <b , уравнение кривой Безье имеет следующий вид: т i=0 Важный частный случай. При т — Ъ имеем элементарную куби- кубическую кривую Безье, определяемую четырьмя вершинами и описы- описываемую уравнением 104
Сплайновые кривые ««-(((■- или в матричной форме: где X1 - О < / < 1. = PMT, М = ч 1 -3 О 3 о о о о 3 -6 3 о 1 3 —"J 1, (Р0 Р, Р2 Р3) = / •тр X, \ >'о У\ Уг Уъ . 2п *>\ *>") Zi. Матрица М называется базисной матрицей кубической кривой Безье. 3.2.2. Свойства кривых Безье При описании элементарных кривых Безье в качестве функциональ- функциональных весовых множителей берутся многочлены Бернштейна [ Свойства, которыми они обладают, оказывают существенное влияние на поведение элементарных кривых Безье. Укажем некоторые из них. Многочлены Бернштейна 1+ неотрицательны, 2+ в сумме составляют единицу: т /=0 3+ не зависят от вершин массива Р (универсальны). Основные свойства кривых Безье Элементарная кривая Безье, порожденная массивом Р: 1+ яшшется гладкой кривой, в частности 1-ю и 2-ю производные радиуса-вектора R(r) можно записать так: 105
Сплайны / = 0 d2 т-2 Щ = — R(/) = т{т - 1) Х(Р/+2 - 2Р/+1 ™ / = 0 2+ начинается в 1-й вершине Ро массива Р, R(o) = Ро, касаясь отрезка P0Pj опорной ломаной, R@) = m(P, - Ро), и заканчивается в последней его р вершине Pm, R(l) = Рт, касаясь от- ° Р Р резка Pm_jPm опорной ломаной, т ' R(l) = т(?т - ?т_{) Лс- 13 (рис. 3.13); 3+ лежит в выпуклой оболочке, порожденной массивом Р (рис. 3.14); 4+ симметрична - сохраняет свою форму при перемене порядка вер- вершин массива на противоположный; Fo.Fj,...-.Fm_j,гт ^> "т,гт_j.....Fj.Fo ; 5+ аффинно инвариантна; рис. 3.14 6+ "повторяет" опорн>то ломаную (рис. 3.15) (в частности, число точек пересечения кривой Безье с произвольной прямой не больше числа точек пересечения с этой прямой опорной ломаной); а о в Рис. 3.15 7+ в случае, если опорные вершины Р0,....Рт лежат "на одной прямой (коллинеарны), кривая Безье совпадает с отрезком Р0Рт; 8+ в случае, если опорные вершины Р0,....Рт лежат в одной плоскости (компланарны), кривая Безье лежит в этой же плоскости; 106
Сплайновые кривые О 9" степень функциональных ко- коэффициентов напрямую связана с количеством вершин в массиве (на единицу больше) и растет при его увеличении; 10" при добавлении в массив хотя бы одной вершины возникает необходимость полного пересчета параметрических уравнений элемен- элементарной кривой Безье; 11" изменение хотя бы одной вершины в массиве приводит к за- заметному изменению всей кривой Безье; 12" априорные сведения о рас- расположении кривой Безье (принад- (принадлежность выпуклой оболочке задан- заданного массива вершин) являются дос- достаточно грубыми (на рис. 3.16 пока- показан вид кривых Безье для массива из четырех вершин* на плоскости при разном порядке их нумерации; не- нетрудно видеть, что, находясь в одном и том же выпуклом четырехугольни- четырехугольнике и пытаясь повторить ход соответ- соответствующих опорных ломаных, эти кривые сильно разнятся); 13" в уравнении, описывающем элементарную кривую Безье, нет свободных параметров - заданный массив однозначно определяет кри- кривую Безье, не давая возможности хоть как-то влиять на ее форму; 14" элементарная кривая Безье проективно - неинвариантна. 3.2.3. Составные кривые Безье В этом подразделе мы подробно останавливаемся на построении сос- составных кубических кривых Безье. Именно такие кривые наиболее часто используются в приложениях. Составные кривые Безье других степеней конструируются по аналогичной схеме. " Составная кубическая кривая Безье - это G0 -непрерывная кривая у, являющаяся объединением элементарных кубических кривых Безье в Рис. 3.16 107
Сплайны Сказанное означает, что концевая точка кривой у[1], / = 0, ..., /-1, совпадает с начальной точкой кривой у{1+ ]. Если кривая /" задает- задается параметрическим уравнением вида то это условие записывается так: /=0, Условия гладкости составной кубической кривой Безье Для того чтобы составная куби- кубическая кривая Безье, определя- определяемая набором Р0,...,Рт , была 1) G1 -непрерывной кривой, не- необходимо, чтобы тройки вер- вершин о т-1 были коллинеарны (лежали на одной прямой) (рис. 3.17); Рис' 3'17 2) G2 -непрерывной кривой, необходимо, чтобы пятерки вершин Р Р Р Р Р (i>\\ бьши компланарны (лежали в одной плоскости). Условия замкнутости составной кривой Безье Ддя того чтобы составная кубическая кривая Безье, определяемая на- набором вершин Р Р Р Р и • I тп— [^ тп ' была замкнутой G1 -непрерывной кривой, необходимы совпадение вершин Ро и Рт и коллинеарность тройки Р ,,Р = Ро.Р, (рис. 3.18). R= m Р - Р а о 108 Рис. 3.18
Сплайновые кривые Единая параметризация Рассматривая составную кривую / как целое, более естественно поль- пользоваться единой параметризацией где параметрическое векторное уравнение (i)-Pi элементарной кривой Г* ! I Безье у . Выбор промежутка [/о.//1 и частичных сегментов на нем заслуживает отдельного рассмотрения. Простейший способ - положить t. = / - часто вполне удобен. Ес- Если же такое (равномерное) разбиение промежутка изменения парамет- параметра оказывается слишком грубым, то для выбора узлов tt применяются другие подходы. Опишем один из способов выбора узлов на промежутке измене- изменения параметра для массива, в котором каждые 3 вершины лежат на одной прямой (коллинеарны). В этом случае составная куби- кубическая кривая Безье будет иметь вид, указанный на рис. 3.17 (каса- (касательная изменяется вдоль кривой непрерывно). Выберем последова- последовательность узлов t. по следующему правилу: tQ = 0, f, = /-1 _ Р -Р Г3/+1 Г3/ Р -Р Г3/ *3/-1 т £т л • • • * w • Относительно введенного параметра t кривая у будет С1 -гладкой, и вдоль нее касательный вектор будет изменяться непрерывно. Замечание Выбор параметризации не изменяет формы кривой, но может вли- влиять на класс ее гладкостиу так как наличие общей касательной в точке стыка в общем случае не влечет непрерывности касатель- касательного вектора. Класс ыадкости кривой не есть чисто геометрическое свойство, а результат ее параметризации. Он зависит не только от формы кривой, но и от выбора ее параметризации. Если в исходном массиве коллинеарных троек вершин нет, их всегда можно получить путем соответствующего расширения этого 109
Сплайны массива, причем так, чтобы получающаяся в результате составная кривая была С1 -гладкой. Пример, Пусть Р - произвольный массив из шести вершин р р р р р р Возьмем на отрезке Р2.Р3 опорной ломаной вспомогательную вершину Р„ (для простоты середину отрезка Р2,Р3(рис. 19)) и постро- построим для каждой четверки вершин ные кубические кривые Безье :' 1 'l »^ \ 1 Г' • Д 9 а^^ Ш9 ■ W^L a^^ W^L жх жх у : R = R "(г), 1<г<2. В результате получится составная кривая О < / < 1, и Р„,Р3,Р4,Р5 элементар- элементару: R = R(r) = с непрерывно изменяющимся каса- касательным вектором, но разрывной кривизной. Рис. 3.19 3.2.4. Рациональные кривые Безье По заданному массиву вершин РО,...,РШ (элементарная) рациональная кривая Безье степени т определяется уравнением следующего вида: щ где В™(/) - многочлены Бернштейна. Неотрицательные числа м\, с>^мма которых положительна, назы- называются весами. Если все веса wt равны между собой, получается стандартная элементарная кривая Безье т-п степени. Свойства рациональных кривых Безье Элементарная рациональная кривая Безье, порожденная массивом Р: 1+ является гладкой кривой; 2+ начинается в 1-й вершине,Ро массива Р, R@)=Po, касаясь отрезка P0Pi опорной ломаной, 110
Сплайновые кривые и заканчивается в последней его точке Pm, R(l) = Pm , касаясь отрезка Pm_,Pm опорной ломаной, 3+ лежит в выпуклой оболочке, порожденной массивом опорных вершин Р; 4+ симметрична - при перемене порядка вершин массива на про- противоположный, popi К\К~>?т iK >pipo> не изменяет своей формы; 5+ аффинно-инвариантна; 6+ "повторяет" контрольную ломаную (в частности, число точек пересечения рациональной кривой Безье с произвольной прямой не больше числа точек пересечения с этой прямой контрольной лома- ломаной); 7+ в случае, если опорные вершины Р0,...,Рт лежат на одной прямой (коллинеарны), рациональная кривая Безье совпадает с отрез- отрезком Р0Рт; 8+ в случае, если опорные вершины Р0,...,Рт лежат в одной плоскости (компланарны), рациональная кривая Безье также лежит в этой плоскости; 9+ элементарная рациональная кривая Безье проективно-инва- проективно-инвариантна; 10+ поведение рациональной кривой Безье определяется не толь- только массивом вершин, но и набором свободных параметров - весов М';., параметров формы; при заданном наборе вершин формой рацио- рациональной кривой Безье можно управлять, меняя весовые множители; 11" степень функциональных коэффициентов напрямую связана с количеством вершин в массиве (на единицу больше) и растет при его увеличении; 12" при добавлении в массив хотя бы одной вершины возникает необходимость полного пересчета параметрических уравнений эле- элементарной кривой Безье; 13" изменение хотя бььодной вершины в массиве приводит к за- заметному изменению всей кривой Безье. Свойство рациональной кубической кривой Безье Рассмотрим два набора вершин: Ро ,PJ '^ ,Р3 и Pq ^Р,' ^ ,Р3 • 111
Сплайны ^ ' При условии, что вершины Р^1' и Р^ совпадают, рациональные кубические кривые Безье у- и у[ , порожденные этими наборами, имеют общую точку. ' Пусть / = у\ • UИ ' - полненная составная кривая. При условии, что вершины коллинеарны, подбором весов / i Г. ill fli w = ^ j - i'2i / i'2'i i'2i i'2". i'2>\ можно добиться непрерывного изменения касательного вектора вдоль кривой у. Достаточно положить 1 -Р При условии, что вершины Wr A; рГ1' pfl) ] *Г2 -Г3 p 0 *Г1 компланарны (лежат в одной плоскости), то есть векторы p '-•. A 2" коллинеарны, подбором весов w и w можно добиться непрерыв- непрерывности вектора кривизны вдоль кривой у. Их нужно взять так, чтобы выполнялось равенство г г -I 1 гг»1 2 I р -р з где '^ , / = 1, 2. Это cbopictbo рациональных кубических кривых Безье позволяет поместить элементарную рациональную кубическую кривую Безье в разрыв между любыми двумя заданными (уже построенными) С2 -ре- -регулярными кривыми (в частности, элементарными рациональными кубическими кривыми Безье) так, что получаемая в результате состав- составная кривая будет иметь непрерывный касательный вектор и непре- непрерывный вектор кривизны. 112
Сплайновые кривые №*' 1$ it; mi i/j v-Y, Vffi* Задача. По заданным набору из четырех вершин Р^Р^Р^Рз и двум неотрицательным числам к0 и къ найти веса m'q.w^Wj^ так, чтобы значения кривизны рациональной кубической кривой Безье, порождаемой заданным массивом, в концах опорной ломаной Ро Pj Р2 Р3 совпадали с заданными числами (с к0 в вершине Ро и с къ в вершине Р3). Решением задачи является набор где 4 3 \1/3 4 2 3 \ 1/3 , щ = I (Р1-Р0)х(Р2-Р0) L г г п сз — (P2-Pl)x(P3-P1) 2 Р3-Р2 Замечание Для планарного набора Ро, Р,. Р2. Р3, опорная ломаная ко- которого имеет S-форму (рис. 3.20)у числа к0 и къ должны иметь разные знаки (кривизна плоской кривой Безье меняет знак). Рис. 3.20 3.2.5. Программная реализация алгоритма Описанный алгоритм реализован в виде функции на языке С. Обра- Обращение к ней имеет следующий вид: bezier< p, segments, div, output '; , где Fit p[] iin- - спорная ломаная кривей Безье, ее элементы р[0]... р[т-1], где т = 3*segments+l int segments-.in ■■ - число звеньев кривей Безье, di int div-in.- - число звеньев в аппроксимирующей ломаной, Fit output []■■ out'■- выходной массив с элементами output[0]...output[k-1], где k=segments*div+l. Приведем полностью текст этой программы. Fit bezier_3». Fit p[4], Fit t ) Fit s = 1 - t ; 113
Сплайны Fit t2 = t*t ; Fit t3 = t2 * t ; return (!s*p[O] + 3*t*p[l]i*s + 3*t2*p[2]>*s + t3*p[3] ; } void bezieri Fit p[], int segments, int div, Fit output [] :• { Fit t, dt = 1.0 / div ; int s, d, first = 0 ; f or ■: s = 0; s < seaments; s + + ) t = 0 ; for; d = 0; d <= div; d ++ :■ { ■ . output [ first + d ] = bezier_3 ■. &p [ s*3 ] , t t += dt ; v ; first += div Приведем пример использования функции для построения плоской сплайн-кривой. ^include "iib.h" /* Описание вызываемой функции п */ void fcezier-, Fit p[], int segments, int div, Fit output [] .•; /* число точек опорной ломаной */ /* М должно быть числом вида к*3+1 */ #define К ' 2 ■ #define M >:K*3 + li #define DIV ■: 1G "■ /*• число точек аппроксимирующей ломаной */ #define N •K*DIV-1; /* Определение спорной ломаной */ Fit хр[И] = {0.2 95 , С . 7 0 5 , G.2 с 6 , 0 . 2 0 б , 0.172, 0.503, 0.603}; • Fl t ур [М] = { 0 .. 154 , 0.233,0.413, 0.530, 0.31с, 0 . ~4 5 , 0.515); /* Описание выходного массива */ Fit ох[М] , су [13] ; void main' void { /* вычисление параметров сплайна */ bezier; хр, К, DIV, ох ,■ .; bezier: ур, К, DIV, оу .- ; /* инициализация графической моды */ SetVidecHode ■. ■■ ; '* отображение на дисплее опорной ломаной */ DrawPolygcn • хр, ур, М, 1 ■■ ; /* отображение на дисплее построенной онлайновой кривой */ DrawPolygcn ■■'. ох, су, Г], 2 • ; Текст программы bezier находится в файле bezier.c в поддирек- поддиректории CURVES на дискете, которую можно приобрести в издательстве "Диалог-МИФИ". Подробную информацию об именах файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 114
Сплайновые кривые 3.3. В-сплайновые кривые 3.3.1. Параметрические уравнения элементарной кубической S-сплайновой кривой По заданному массиву Р Р Р Р (элементарная) кубическая В-сплайновая кривая определяется при по- помощи векторного уравнения, имеющего следующий вид: 3/3-6/2+4 -3/3+3r2+3/ + l P 6 и+ 6 1+ 6 2 6 3' 0</<1. Матричная запись параметрических уравнений, описывающих элементарную кубическую 5-сплайновую кривую, R(r) = РМТ, где м = 1 -3 3 -1 4 О ч 0 0 -6 3 о 'to\ тр I х2 \ У о У\ Уг У = (р0 р, р2 Р3)= Матрица М называется базисной матрицей В-сплайновой кривой. Свойства элементарных кубических ^-онлайновых кривых Свойства функциональных весовых множителей п /л=0-03 ; /л_зг3-б/2+4 6 6 -ЗГ3+ЗГ2+3/ + 1 •оказывают существенное шгияние на поведение элементарной куби- i ческой 5-сплайновой кривой. Укажем некоторые из них. 115
Сплайны Функциональные коэффициенты /?,(/) 1+ неотрицательны, 2+ в сумме составляют единицу, 3+ не зависят от точек массива Р0,РрР2,Р3 (универсальны). Элементарная кубическая /^-онлайновая кривая 1+ лежит в выпуклой оболочке, порожденной вершинами Р0,Р!,Р2,Р3 опорной ломаной, и, как правило, не проходит ни через одну из них; 2+ касательная в концевой точ- точке i(P0+4P,+P2) параллельна отрезку Р0Р2, а в кон- концевой точке О ~(Р,+4Р2+Р3) Рис. 3.21 - отрезку PjP3 (рис. 3.21). 3.3.2. Составные кубические jB-сплайновые кривые {Составной) кубической В-сплайновой кривой, определяемой массивом Р0,...,Рт, А/7>3, называется кривая у, которую можно представить в виде объединения элементарных кубических 5-сплайновых кривых у[ ,...,/""' , (/)-я кривая у ' описывается параметрическим уравнением следу- следующего вида: R (г) = (Рм Р, Pw 0</<1. / = 1? ..., т-2 , где М - базисная матрица кубической Б-сплайновой кривой. Единая параметризация Рассматривая составную кривую у как целое, более естественно пользоваться единой параметризацией. 116
Сплайновые кривые и г 7, л. \ г 1 (" ? Наиболее простой является параметризация с равноотстоящими целочисленными узлами. Для массива из т + 1 опорных вершин со- составная 5-сплайновая кривая строится из т - 2 элементарных фраг- фрагментов. Если каждый из них определен на единичном отрезке, то длина общего промежутка изменения параметра должна быть равной т - 2. Взяв 0 за начальную точку, получаем отрезок [0,w-2]. В этом случае узлы параметризации» определяются по формуле Описанный выбор отрезка параметризации позволяет записать уравнение составной кубической 5-сплайновой кривой у следующим образом: R = R(r), где 1 - L - lm-l •> Р,+2)М o^ \ J - параметрическое векторное уравнение (/)-й элементарной кубичес- кубической 5-сплайновой кривой у" . Свойства составной кубической /?-сплайновой кривой Составная к>^бическая 5-сплайновая кривая, порожденная массивом Рл Р т>3 1+ является С2 -гладкой кривой в промежутке [О./т_2] (f,+1 =/,.+1, tx =0), в точке стыка эле- элементарных кривых Г!" и г'м> выпол- .Рп.з.22 няются равенства т-2 т-1 117
Сплайны 42 (рис. 3.22); 2+ как правило, не проходит ни через одну точку заданного массива, 3+ лежит в объединении т-2 выпуклых оболочек, порожденных четверками вершин Рм,Р,,Р+1,Р/>2 > i = Ь •> /и-2 (рис. 3.23); 4+ "повторяет" опорную лома- ломаную (рис. 3.24) (в частности, число точек пересечения составной куби- кубической 5-сплайновой кривой с про- произвольной прямой не больше числа точек пересечения опорной ломаной с этой прямой); 5+ если опорные вершины Рис. 3.23 Рис. 3.24 Р0.....Рт массива лежат на одной прямой, то составная кубическая 5-сплайновая кривая также лежит на этой прямой (между вершинами 6+ если опорные вершины Р0,...,Рт массива лежат в одной плос- плоскости, то составная кубическая ^-сплайновая кривая также лежит в этой плоскости; 7+ изменение одной вершины в массиве приводит к изменению только части кривой: при изменении вершины Р;. нужно пересчитать параметрические уравнения только четырех элементарных кривых: Y ', У ,7,7 (рис 3.23); 118
Сплайновые кривые б Рис. 3.25 8+ при добавлении в массив одной вершины возникает необхо- необходимость пересчета параметрических уравнений только четырех, эле- элементарных кривых, в формировании которых участвует эта вершина; 9+ составная кубическая #-сплайновая кривая аффинно-инва- риантна; 10- кубическая #-сплайновая кривая проективно-неинвариантна; П-в уравнениях, описывающих составную кубическую £-сплай- новую кривую, нет свободных параметров - заданный массив одно- однозначно определяет составную кубическую 2?-сплайновую кривую, не давая возможности изменять ее форму. Замечание На взаимное расположение вершин в массиве не накладывается ни- никаких ограничений: они могут и совпадать. Однако следует иметь в виду, что в подобных случаях кривая может потерять свою регу- регулярность. Впрочем, если номера совпадающих вершин сильно разнятся, то никакой потери регулярности не происходит. Случай, когда совпадают две или три первые (последние) верши- вершины, рассматривается ниже. 3.3.3. Кратные и воображаемые вершины Составная кубическая 2?-сплайновая кривая, как правило, не проходит ни через одну вершину определяющего ее массива. Однако располо- расположение ее начальной и конечной точек всегда известно: начальная точ- точка Rr (О) составной кривой у лежит в треугольнике P0PjP2 , а конеч- конечная R(m (l) - в треугольнике Pm_2Pm-iPm- Подбором вспомогательных вершин и построением дополнительных элементарных кривых можно добиться того, чтобы начальная точка новой составной кривой выхо- выходила на отрезок Р0Р,, располагалась ближе к вершине Ро и даже сов- совпадала с ней. Аналогичных результатов можно добиться и для конеч- конечной точки. Обычно это проводится путем использования кратных или воображаемых вершин. 119
Сплайны Л. Двойные вершины Положим P_j = Ро и Рот+1 = Рт и построим две новые элементар- элементарные кривые у ] и ут"', задав их параметрическими уравнениями следующего вида: = /70(/)Pm_2 где 0 < t < 1. С учетом кривых у[0} и 5-сплайновая кривая х ■ = х Ux U ... иг будет начинаться в точке т~Х] ут~Х] новая составная кубическая касаясь отрезка и заканчиваться в точке Fm-2 F™-1 а касаясь отрезка Pm_tPm , (рис. 3.26, а). Кроме того, Р кривая. х* будет иметь в двух этих точках нулевую кривизну. О Pm-2 P»'-/ б Рис. 3.26 Б. Тройные вершины Положим Р_2=Р_!=Р0 и Рот+2 =POT+1 =Pm и возьмем в качестве двух новых элементарных кривых у{~ ' и ут] прямолинейные отрез- ки Р +-—Р 120
Сплаймовые кривые ■'.-1 + Л V где 0 < t < 1 (рис. 3.26, б). С учетом кривых у кривая и у т ' новая составная if-сплайновая будет начинаться в вершине Ро и заканчиваться в вершине Рт. В. Воображаемые вершины Подбором дополнительных вершин Рч и Рт+1 к массиву Р Р /;/ > 3 можно добиться выполнения различных условий на концах составной кривой. Например, составная ^-сплайновая кривая, построенная по новому массиву Р Р Р Р где Р , =(Р0-Р.) + Р0. Pm+1 =(Pm-Pm ,) + Pm, будет начинаться в вершине Ро, касаясь отрезка РОРИ R@>@) = P1-P0, и заканчиваться в вершине Р , касаясь отрезка Pm_,Pm , (рис. 3.27). Кривизны новой кривой в точках Ро и Ри, вообще гово- говоря, отличны от нуля. Замечание Дополнительные вершины Р_! и Рт+1 можно выбрать так у чтобы в кон- концах новой состав- составной кривой 1-е или 2-е производные ра- радиусов-векторов рис 2.27 Р Р / 121
Сплайны Rl0(A и R(m4)(/) кривых у^ и у^т~^ совпадали с заданными значениями (соответственно при t = 0 и t = 1). Построение замкнутой кривой Чтобы по заданному массиву р0,:.., да, , построить С2-гладкую замкнутую кривую, достаточно выбрать допол- дополнительные вершины Pm+1,Pm+2,Pm+3 по правилу р —РР — Р Р —Р Гт+\ ~ Г0>*т+2 ~" Г1'Гт+3 ~ Г2 и рассмотреть массив ррр рр —РР —РР —Р (при условии, что ti+l = tt + 1, tx = 0 ). Неравномерное расположение узлов Перейдем к случаю, когда узлы tt расположены на отрезке изменения параметра / неравномерно, '/-',-1 *'»!-',• По заданно\гу массиву Ро, ..., Pm, w>3, составная ^-сплайновая кривая определяется подобно тому, как это делается при равномерном разбиении отрезка изменения параметра: однако теперь функциональные коэффициенты существенно зависят от промежутков между узлами и определяются рекурсивно о, t<tt,tM<t, 122
Сплайновые кривые Свойства функциональных коэффициентов А,3(/) Функциональные коэффициенты N? 1+ неотрицательны, 2+ в сумме составляют единицу: m /=0 Замечание Выбор узлов параметризации может быть совершенно произвольным. Однако часто весьма удобной оказывается параметризация, в кото- которой промежуток изменения параметра t и узлы Л определяются дли- длинами соответствующих хорд: ^о = ^». t = Р -Р /, = tiA + Р,-Р,_, , / = 2, ..., /w-1, Г р _ р 3.3.4. Рациональные кубические В-сплайновые кривые По заданном>^ массиву Р0,...,Рт (элементарная) рациональная кубинес- кая В-сп:шйновая кривая определяется уравнением, следующего вида: R(V) = J2l , 0 < / < 1 . 1=0 Неотрицательные числа м/9 с>^мма которых положительна, назы- называются весами. В случае, если все веса \\\ равны между собой, полу- получается стандартная элементарная кубическая if-сплайновая кривая. Свойства составных рациональных кубических /?-сплайновых кривых Составная рациональная кубическая if-сплайновая кривая, порожден- порожденная массивом Р: 1+ является С2-гладкой кривой (при условии //+1 =/,- + !, tx =0); 123
Сплайны 2+ как правило, не проходит ни через одну точку заданного мас- массива; 3+ лежит в объединении т-2 выпуклых оболочек, порожденных массивами из опорных вершин Р Р Р Р i = Я т • 4+ "повторяет" контрольную ломаную (в частности, число точек пересечения составной рациональной кубической 2?-сплайновой кри- кривой с произвольной прямой не больше числа точек пересечения контрольной ломаной с этой прямой); 5+ если опорные вершины Ро. ..., Рт лежат на одной прямой, то составная рациональная кубическая if-сплайновая кривая также лежит на этой прямой; 6+ если опорные вершины Ро, ..., Рот лежат в одной плоскости, то составная рациональная кубическая if-сплайновая кривая также ле- лежит в этой плоскости; 7+ изменение одной вершины в массиве приводит к изменению только части кривой: при изменении вершины Pf. нужно пересчитать параметрические уравнения только четырех, кривых: /'~2 , у{'~[ , ■(О 8+ при добавлении в массив одной вершины возникает необхо- необходимость пересчета параметрических уравнений только четырех эле- элементарных кривых; 9+ составная рациональная кубическая ^-онлайновая кривая аф- финно инвариантна; 10+ поведение составной рациональной кубической if-сплайно- вой кривой определяется не только массивом вершин, но и набором свободных параметров - весов \\>п параметров формы; при заданном наборе вершин рациональной кубической if-сплайновой кривоц можно управлять, меняя весовые множители; 11+ рациональная кубическая #-сплайновая кривая - проективно инвариантна. 3.3.5. Форма Безье составных кубических 5-сплайновых кривых Одна и та же составная кривая может быть построена из, элементар- элементарных" фрагментов кубических кривых разных классов; правда, в этом случае для каждого класса требуется свой набор опорных вершин. Здесь мы показываем, как пересчитать вершины заданного массива Р 124
Сплайновые кривые '< ' на новый массив S, чтобы составная кубическая if-сплайновая кри- кривая, построенная по массиву Р, и составная кубическая кривая Безье, построенная по массиву S, совпадали. Удобство использования кри- кривых Безье связано с тем, что кубические многочлены Бернштейна (l-f) , 3/(l-/) ,- 3/2(l-/). t3 обладают большей устойчивостью отно- относительно вычислений по сравнению с мономиальным набором 1, /, t1 Пусть заданы вершины p_,,p0?..., pm,pm+ l и последовательность узлов tQ < ... <tm. Положим Ait • __ ■% * I — 1 """" ' I 1 — 1 ' - • • •) "" ? g и определим вершины (■ по формулам 1 и 1 1. 1 1 1 ' 1: №. * I So s, s3 s2 S3,-i s3, ^3m-2 s3m = P-., = Po, Д, Ao+A, ° _ д. s , — Дл 1 Ao+A, A,-,. + A, Д A,p +A,-2 Д '"' A, «, 3/— 1 — 1 1 Am_, tn~L m~\ = Pm» — P ~ *m+l ' A Ao + - + A Pot Ao o+A,' До p A/-2 p A " A._, *i > А,-, с A , A ^3l4l> A/-1 + Л/ 1 ТП— л. -1 ' A , A A_- ,+Am, где А = А,,: +'АМ +А., / = 2, ..., т-1. 125
Сплайны Определение. Ломаная Р_!...Рт+1 называется ломаной В-спгайна, ломаная Sq^.S^ - соответствующей ломаной Безье, а вершины S,- на- называются вершинами Безье. С2 -гладкая кубическая 2?-сплайновая кривая, определяемая набо- набором вершин Р., / = -1, ..., /71+1, совпадает с составной кубической кривой Безье, определяемой набором найденных вершин 'S., У = 0, ..., 3/71, при этом каждая элементарная кривая Безье определяется набором вершин S3jt+/, / = 0, 1,2, 3; к = 0, ..., т - 1. Поступая аналогично, можно найти вершины Безье и для рацио- рациональных кубических /?-сплайновых кривых. 3.3.6. Программная реализация алгоритма Описанный алгоритм реализован в виде функции на языке С. Обра- Обращение к ней имеет следующий вид: bsplinef p, m, div, output ), где Fit p[] in> - опорная ломаная сплайна, ее элементы р[0].'..р[т- 1], int т •. in :> - число вершин опорной ломаной, int div (in - число звеньев аппроксимирующей ломаной, Fit output [] (out •■ - выходной массив с элементами output [0] . ..output[(m-3)*div]. Приведем полностью текст этой программы. Н #include "common.h" Fit bspline__3- Fit p[ 4 ], Fit t ) { Fit s = l.C - t ; Fit t2 = t * t ; Fit t3 = t2 * t ; return ■, s*s*s * p[0] + f 3*t3 - 6*t2 + 4 :■ * p[l] + -3*t3 3*t2 + 3*t, + 1 ) * p[2] + t3 * p[3] :• / 6.0 void bspline-' Fit d[], int m, . int div, Fit output [] < { Fit t, dt = l.C / div ; ■int i, d, first = 0 ; for-: i = 1; i < m - 2; i ++ ) { t = 0 ; for-- d = 0; d <= div; d ++ ) { output[ first + d ] = bspline_3( &p[ i-1 ], t ) ; t += dt ; 126
Сплайновые кривые К' ■ - first + = div ; w. Приведем пример использования функции для построения плос- плоской сплайн-кривой. #include "lib.h" /* Описание вызываемой функции п */ void bspline1 Fit p[], int m, int div, Fit output[] ) ; '/* число точек опорной ломаной */ #define M ■. 8 :■ Ь #define DIV A0) /* число точек аппроксимирующей ломаной */ Jfdefine И ( i'M-3 ) *DIV + 1 )• /* Определение опорной ломаной */ Fit xp[M] = {0.056,0.287,0.655,0.716,0.228,0.269,0.666,0.929}; Fit ур[Ы] = {0.32 0,0.2 02,0.202,0.521,0.521,0.820,0.820,0.227}"; .,; . /* Описание выходного массива */ . р Fit ox [11] , оу [11] ; Ш void maim' void' :■ • , I'1 /* вычисление параметров сплайна */ |?. bspline! xp, M, DIV, ox ) ;' bspline; yp, M, DIV, oy .:• ; /* инициализация графической моды */ . SetVideoModet ' ; l • » /* отображение на дисплее опорной ломаной */ Drav:Polygon i xp, yp, M, 1 ) ; /* отображение на дисплее построенной сплайновсй кривой */ Drav:Polygon ■" ох, оу, N, 2 ) ; . Текст программы bspline находится в файле bspline.с в под- поддиректории CURVES на дискете, которую можно приобрести в изда- издательстве "Диалог-МИФИ". Подробную информацию об именах фай- |*.лов из этой директории и их содержании можно найти в файле i readme.txt из директории SPLINES этой дискеты и в приложении Б нашей книги. Приведем также пример программной реализации описанного выше алгоритма построения рационального кубического ^-сплайна. Программа написана в виде функции на языке С. Обращение к ней имеет следующий вид: *nurbs-. р, '.*:, knot, m, div, output. ■ , 1 (|гце Fit p[] '.in:1 -• спорная ломаная для рационального Б- сплайна, .ее элементы р[0] .. р[ т-1 ], Fit *.•:[] . •■in - весовые коэффициенты для точек ломаной соответственно w[0] .. w[ m-1 ], Fit knot[] (in) - узлы knot[0] .. knot[ m+3 ], int m i.in'i - число точек опорной ломаной, int-div -.in1 - число звеньев аппроксимирующей ломаной, 127
Сплайны Fit output[] (out) - аппроксимирующая ломаная для рацион го В-сплайна, ее элементы output[0]...output[(m-3)*div] Приведем полностью текст этой программы. #include "common.h" Fit N( int n, int i, Fit u, Fit knot[] ) iff n == 0 ) return ( knot[i] <= u && u < knot[i+1] 1.0 : 0.0 ; return ( u - knot[i] ) * N( n-1, i, u, knot ) / ■:-knot[i + n] - knot[i]) + ( knot[i+n+l] - u ) * N( n-1, i + 1, u, knot .:■ (knot[i+n+1] - knot[i+1]) ; } ' Fit nurbs_3i Fit p[], Fit w[]. Fit knot[], int j, Fit u { Fit si = 0, s2 = 0 ; int i ; fcri I = j-3; i < j+1; i ++ ) ' { Fit tt = N' 3, i, u, knot ) * w[ i ] ; si += tt * p[ i ] ; s2 += tt ; } return sl/s2 ; ■void nurbs'. Fit p[], Fit w[], Fit knot [ ] , int m, int div output[] ) { Fit u, du ; int. j , d ; for; j = 3; i < m; j ++ u = knot[ j ] ; du = ( knot[ j+1 ] - u ) / div ; for1 d = 0; d <= div; d ++ ) { ' output[ ij-3)*div + d ] = nurbs_3i p, w, kno u += du ;■ Приведем пример использования функции для построения кой сплайн-кривой. В ^include "lib.h" /* Описание вызываемой функции п */ void nurbsi Fit p[], Fit w[], Fit knot[], int m, int div output [ ] ! ; /*' число точек спорной ломаной */ #define M (8) #define DIV A0) /* число точек аппроксимирующей ломаной */ 128
Сплайновые кривые т.-' #define N ((М-3)*DIV+1) /* Определение опорной ломаной */ Fit xp[M] = {0.056,0,287,0.655,0.716,0.228,0.269,0.666,0.929}; Fit yp[M] = {0.820,0.202,0.202,0.521,0.521,0.820,0.820,0.227}; /* Весовые коэффиценты */ Fit ww[M] ={1,1, 1, 1, 7 /* Узлы */ Fit knct[M+4] ={0,1,2,3,4,5,6,7 ' 1. 1, 1 8, 9, 10, 11 } ; /* Описание выходного массива */ Fit ох [Ы] , оу [N] ; void main' void i /* вычисление параметров сплайна */ nurbs i xp, vr.-7, knot, H, DIV, ox ; ; nurbs'. yp, vr.'i, knot, M, DIV, cy ) ; /* инициализация графической моды */ SetVideoMode • '"• ; /* отображение на дисплее опорной ломаной */ Draw Polygon ■. xp, yp, H, 1 :• ; /* отображение на дисплее построенной аппроксимирующей ломаной*/ Drav.-Pclygcn • ох, су, N, 2 } ; Текст программы nurbs находится в файле nurbs.c в поддиректо- поддиректории CURVES на дискете, которую можно приобрести в издательстве "Диалог-МИФИ". Подробную информацию об именах файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 129 --33S
Сплайны 3.4. Бета-сплайновые кривые 3.4.1. Параметрические уравнения элементарной Бета-сплайновой кривой По заданному массиву р р р р (элементарная) Бета-сплайновая кривая определяется при помощи век- векторного уравнения вида Щ = М')Ро + М0Р> + Ч0Р: + *з(')р3' 0 < / < 1, функциональные коэффициенты 6,G) в котором задаются следующи- следующими формулами: -3/ -f 3) + 2/?f(/3 ~3/ + 2) + 2Д(/3 -3/ + 2) + /?2B/3 -З/2 +1 д b2(t) = ~B/?2/2(-/ 4- 3L-2/v(-'2 +3) + 2/?2/2(-2f 4- 3) + 2(-/3 + l)j, где Д>0 и /?2>0 и £ = 2/?34-4/?2+4/?,+/?:+2. Числовые параметры /^ и /?2 называются параметрами формы Бета-сплайновой кривой, при этом параметр j3] называется парамет- параметром скоса (смещения), а /32>0 - параметром напряжения. Замечание При /?j = 1 и E2 ■ = 0 получается элементарная кубическая В-сплай- новая кривая. Матричная запись параметрических уравнений, описывающих элементарную кубическую Бета-сплайновую кривую, R(f) = РМТ, 0 < / < 1, где г Y \ О 1 2 3 . О >1 >2 >3 О *•! Z2 Z3' 130
Сплайновые кривые \ >■(<) т = м = R \ (здесь n = 2 врх о о 3/7 О -2C\ 2C/?;- +0) -2@+l) 2 J Матрица М называется базисной матрицей Бета-сплайновой кривой. Свойства элементарной Бета-сплайновой кривой Свойства функционашных весовых коэффициентов bo(fL b\(f), biif)* Аз(О оказывают существенное влияние на поведение элементарной Бета-сплайновой кривой. Укажем некоторые из них. Функциональные весовые коэффициенты 1+ неотрицательны; 2+ в сумме составляют единицу; 3+ не зависят от вершин массива Р0.Р,,Р2.Р3 (универсальны). Элементарная Бета-онлайновая кривая 1+ лежит внутри выпуклой оболочки, порожденной вершинами РО.Р,.Р2.Р3 опорной ломаной (рис. 3.21), и, как правило, не проходит ни через одну из опорных вершин; 2+ в концевой точке 1 I касательная Бета-сплайновой кривой паратлельна вектору |д(^(р1-р0)+(р2-р1)), а в концевой точке 131
Сплайны вектору 3.4.2. Составные Бета-сплайновые кривые (Составной) Бета-аиайновой кривой, определяемой массивом Ро, ..., Pm, w>3, называется кривая уу которую можно представить в виде объединения т-2 элементарных Бета-сплайновых кривых у[ ', ..., ут~ , 11 i (/)-я кривая у описывается параметрическим уравнением следующе- следующего вида: 0<Г <1, /= 1, ..., /и-2, где М - базисная матрица Бета-сплайна. Единая параметризация Рассматривая составную кривую у как целое, более естественно поль- пользоваться единой параметризацией. Наиболее простой является параметризация с равноотстоящими целочисленными узлами. Для массива из т + 1 опорных вершин со- составная Бета-сплайновая кривая строится из т - 2 элементарных фрагментов. Если каждый из них определен на единичном отрезке, то ддина общего промежутка изменения параметра должна быть равной т - 2. Взяв 0 за начальную точку; получаем отрезок [0.///-2]. В этом случае узлы параметризации определяются по формулам 'i = 0> 'i+i = ',- + 1 > ' = 1> —» w"^- Описанный выбор отрезка параметризации позволяет записать урав- уравнение составной кубической 2?-сплайновой кривой у след>тощим образом: где 132
Сплайновые кривые / Р, Р, ,ч, Р,+2)М ('-О (Л V /,. <^</;+,, /= 1, ..:, /и-3, - параметрическое векторное уравнение (/)-й элементарной Бета-сплайновой кривой y[t]. Свойства составной Бета-сплайновой кривой Бета-сплайновая кривая, порожденная массивом Ро, ..., Рт, /;/>3, 1+ является G2 -гладкой кривой; в точках стыка элементарных ' [t+ кривых у и y[ выполняются равенства +2P ,+2), 2+ как правшго, не проходит ни через одну вершину заданного массива; 3+ лежит в объединении т-2 выпуклых оболочек, порожденных четверками вершин (рис. 3.23); 4+ "повторяет" опорн>то ломаную (см. рис. 3.24) (в частности, число точек пересечения составной Бета-сплайновой кривой с произ- произвольной прямой не больше числа точек пересечения контрольной ломаной с этой прямой); 5+ если опорные вершины Ро, ..., Рт массива лежат на одной прямой, то составная Бета-сплайновая кривая также лежит на этой прямой (между вершинами Ро и Pw); 6+ если опорные вершины Ро. ..., Рт массива лежат в одной плоскости, то составная Бета-сплайновая кривая также лежит в этой плоскости; 133
Сплайны 7+ изменение одной вершины в массиве приводит к изменению только части кривой: при изменении вершины Р; нужно пересчитать параметрические уравнения только четырех элементарных кривых: /' , У'%~\ УУ%\ У''+' » в формировании которых принимает участие эта вершина (см. рис. 3.25); 8+ при добавлении в массив одной вершины возникает необхо- необходимость пересчета параметрических уравнений только четырех эле- элементарных кривых; 9+ составная Бета-сплайновая кривая аффинно-инвариантна; 10" Бета-сплайновая кривая проективно-неинвариантна; 11+ параметры EХ и /?2 позволяют изменять форму Бета-сплай- новой кривой, правда сразу всю целиком. Замечания: 1. Параметры формы /?, и C2 не обязательно должны быть одина- одинаковыми для всех элементарных фрагментов. С учетом взаимного расположения вершин массива их можно выбирать так, чтобы: 1) пара значений ji{ и /72" для каждого элементарного фрагмента быт своя; 2) на каждом единичном отрезке[0\1]функции Pi{f) и P2(t) ли- линейно зависели от параметра t; 3) функции /?,' (/) ) и f5l{t\ были разными для разных элементарных фрагментов (i = L ..., т - 2). Как правило, выбор параметров формы /?, и рг определяется вза- имным расположением вершин в массиве. Если расстояния между со- соседними вершинами приблизительно равны (различаются не слишком сильно), то выбор параметров формы, одинаковых для всех частич- частичных кривых, дает достаточно хорошее приближение. Если же взаим- взаимное расположение вершин нельзя рассматривать как равномерное, то хороших результатов можно добиться подбором переменных пара- параметров формы. 2. На взаимное расположение вершин в массиве не накладывается никаких ограничений: они могут и совпадать. Однако следует иметь в виду, что в подобных случаях кривая может потерять свою регу- регулярность. Впрочем, если номера совпадающих вершин сильно разнят- разнятся, то никакой потери регулярности не происходит. Случай, когда совпадают две или три первые (последние) верши- вершины, рассматривается ниже. 134
Сплайновые кривые 3.4.3. Кратные и воображаемые вершины Составная Бета-сплайновая кривая, как правило, не проходит ни че- через одну вершину массива, который ее порождает. Однако заранее вполне определенно можно сказать, что начальная точка R F\ сос- i'm-2i I тавной кривой у лежит в треугольнике Afof1P2, a Rm ' (\\ - в тре- треугольнике APm_2Pm_jPm . Подбором вспомогательных вершин и по- построением дополнительных элементарных кривых можно добиться то- того, чтобы начальная точка новой составной кривой выходила на отре- отрезок Р0Р,, располагалась ближе к вершине Ро и даже совпадала с ней. Аналогичных результатов можно добиться и для конечной точки. Обычно это проводится* путем использования кратных или вообра- воображаемых вершин. А. Двойные вершины Положим Р, = Ро и ■ ные кривые ■/■ ну следующего вида: = Рт и построим две новые элементар- задав их параметрическими уравнениями | где 0 < t < 1. С учетом кривых ркривая у* =y@)Uy{l)U... U) 1 будет начинаться в точке и у[т~ новая составная Бета-сплайновая касаясь отрезка Р0Р , И заканчиваться в точке 0) = т-\ 1- \ 5 ) т 135
Сплайны касаясь отрезка (см. рис. 3.26, а). Кроме того, кривая у* будет иметь в двух этих точках нулевую кривизну. Б. Тройные вершины Положим Р_2 = Р_, = Ро и Ри+2 = Рм+1 = т и возьмем в качестве i mi двух новых элементарных кривых у ну прямолинейные отрезки 1- \ 1£_ S ) 5 1- \ где 0</<1 (см. рис. 3.26, б). С учетом кривых /' и ут~;, построенных ранее, новая состав- составная В-сплайновая кривая ** (-1) . | @) , , A) у = уу ] \}у иух , , A) . , , , (т) | , (т-\) , , (т) иух и ••• и/1 ' иук и у будет начинаться в вершине Ро и заканчиваться в вершине Рт (см. рис. 3.26, б). В. Воображаемые вершины Выбором дополнительных вершин Р_, и Рт+, к массиву о. т можно добиться выполнения различных условий на концах составной кривой. Например, составная В-сплайновая кривая, построенная по но- новому массиву р р Р Р где будет начинаться в вершине Ро, касаясь отрезка 136
Сплайновые кривые к- i и заканчиваться в вершине Рт , касаясь отрезка (см. рис. 3.27). Кривизны новой кривой в точках Ро и Рт, вообще говоря, отличны от нуля. Замечание Дополнительные вершины Р_, и Рт+1 можно выбрать так, чтобы в концах новой составной кривой 1-е или 2-е производные радиусов- векторов К [tj и R (/] кривых у и у ] совпадали с заданными значениями (соответственно при t = 0 и t = 1). Построение замкнутой кривой Чтобы по заданному массиву РР м> 1 построить G2 -непрерывную замкнутую кривую, достаточно выбрать дополнительные вершины Рт+1, Рт+2, Рт+з по правилу и рассмотреть массив РРР РР -РР -РР -Р (см. рис. 3.28). 3.4.4. Программная реализация алгоритма Описанный алгоритм реализован в виде функции на языке С. Обра- Обращение к ней имеет следующий вид: betaspline- Ы, Ь2, р, m, div, output ), где Fit Ы, Fit P[] int. m int div ■. m ■ in in - параметры betal и beta2, - опорная ломаная В-сплайна, ее элементы р[0] .. pfm-l], - число точек спорной ломаной, - число звеньев ломаной, аппроксимирующей сплайн Fit output[] cut1 - выходной массив длины (m-S.^div, содержит вершины аппроксимирующей ломаной для В-сплайна, его элементы output [0] ... output [ ('m-3 ■ *div] Приведем полностью текст этой программы: #include "commcn.h" 137
Сплайны static Fit betal, beta2; static Fit Ы2, bl3, b22, b23 ; /* 2-я pi 3-я степени параметров betal и beta2 соответственно */ static Fit delta, d ; Fit betas.pl ine_3 •• Fit p[ 4 ], Fit t ) ■ • { Fit s = 1.0 - t ;. Fit t2 = t * t ; Fit t3 = t2 * t ; Fit bO = 2 * ЫЗ *d*s*s*s; Fit b3 = 2 * t3 * d * ' Fit bl = d*'2*bl3*c.*it2-3*t + 3:-+2*bl2*it3- 3*t2+'2 ; +2*betal* ■ t3-3*t+2 ':• +beta2* ■: 2*t3-3*t2 + l • ; , ; ■ Fit b2 = d * ■: 2*bl2*t2* i-t + 3 ; + 2*betal*t* • - " ' *t2* ■-2*t + 3 ;+2* ;'-t3+l Г- ; return b0*p[0] + bl*p[l] + b2*p[2] + b3*p[3] ; } void betaspiine' Fit bl, Fit b2, Fit p[], int. m,. int div, Fit output [ ] ■> • . { . Fit t, dn = 1.0 / div ; int i, dd, first = 0 ; benal - bl ; , beta2 = b2 ; , Ы2 =? betal * betal ; Ь13 = Ы2 * betal ; ' . b2 2 = beta2 * beta2 ; . b2'3 = b22 * beta2 ; . ■ ' . delta = 2.G * ЫЗ + 4.0 * bl2 + 4.0 * beta! + bet.a2 + 2.0 ; a = 1.0 / delta ;. for^ i = 1; i <■ m - 2; i ++ :• t = и ; for' dd '= 0; ■ dd <;= div; dd ++ ~ ■ f output [ first *■ dd ] = betaspline_3 ■ &p[ i-1 ]; t t += dt ; irst += div ;■■ }■ . Приведем пример использования функций для построения плоской сплайн-кривой. U' « 1 <-. - 1 ч ia "lib Ь * /* Списание вызываемой функции */ void betasplinei Fit bl, Fit b2, Fit 'p[] , int m, int.div, Fit output []:•;■ /* Число точек опорной ломаной */ ' #define Ы ■: S • Цdefine DIV •: 10 • /* Число точек аппроксимирующей ломаной */ 138
Сплайновые кривые #define N1 #define N2 #define N3 i;M-3i*DIV+1) ((M-l)*DIV+1) (<M+1i*DIV+1) /* Определение спорней ломаной первая и последняя точки утроены для демонстрации кратных вершин. Fit хр[М+4] = { 0.056, 0.056, 0 0.223, 0.269, 0 Fit ур[М+4] = { 0.820, 0.820, 0 056, 666, ■к I ■к > Fit i * betal = писание Fit oxl[Nl] Fit ox2 ЕП2] Fit охЗ[ПЗ] 1 0 beta2 =0.0 выходных оу1[ГЛ} оу2[М2] cy3[N3] массивов */ vcid main ■:' vcid 716, 0.287, 0.655, 0 0.929, 0.929, 0.929 } 0.202, 0.202, 0.521, 0.521, 0.820, 0.820, 0.227, 0.227, 0.227 } * / /* вычисление параметров сплайна' betaspline; betal, beta2, &хр[2], М, DIV,'oxl ) ; betaspline-. betal, beta2, &yp[2], M, DIV, oyl ) ; betaspline betal, beta2, &xp[l], M+2, DIV,'ox2 ] betaspline betal, beta2/ &yp[1], M+2, DIV, cy2 ) betaspline betal, beta2, xp, M+4, DIV, cx3 ) ; betaspline. betal, beta2, yp, M+4, DIV, oy3 } ; /* инициализация графической моды */ SetVidecMode• » ; /* отображение на дисплее опорной ломаной * / Drav:Polygorij' &хр[2], &ур[2], М, ■/* отображение на дисплее построенной аппроксимирующей ломаной*/ ' ' • Drav;Pplygon ■ охЗ, оуЗ, N3, 2 } ; Drav:Pclygon ох2, су2, N2, 3 ) ; DrawPclygon■ oxl, oyl, N1,4);- Текст программы betaspline находится в файле beta.c в подди- поддиректории CURVES на дискете, которую можно приобрести в изда- издательстве *\Диалог-МИФИ". Подробную информацию об именах файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 139
Сплайны 3.5. Другие сплайновые кривые 3.5.1. Интерполяционные кубические кривые Эрмита По заданным вершинам Ро и Р, и не нулевым векторам Qo и Q1 {элементарная) кубическая кривая Эрмита определяется при помощи векторного уравнения, имеющего следующий вид: ( ) + гC-2г)Р, +/(l ) Матричная запись параметрических уравнений, описывающих элементарную кубическую кривую Эрмита, - = GMT, 0</<1, где = (P0 Q Xo Xj V'o v, U \ V, / л V 7 M = V T = 10-3 2 0 0 3 -2 0 1-21 .0 0-1 \j Матрица М называется базисной матрицей кубической кривой Эр- Эрмита, а матрица G - ее геометрической матрицей. Касательный вектор элементарной кубической кривой Эрмита в концевой точке Ро, R(o) = Ро, совпадает с заданным вектором Qo, R@) = Qo, а в концевой точке Pl, R(l) = Pj , - с вектором R(l) = Qj (рис. 3.28). При линейной замене парамет- Q ра преобраз>тощей единичный отрезок [0, 1] в промежуток [а, Ь\, форма элементарной кривой Эрмита изме- изменяется. Для ее сохранения необхо- 0 Рис. 3.28 140
Сплайновые кривые димо заменить векторы Qo и Q, на и -4-Q, Ь Q0 4 b-а Ь-а соответственно. Кроме предложенных форм записи элементарной кривой Эрмита ис- используются и другие. Запись элементарной кубической кривой Эрмита в форме Безье - где Bf(t} - кубические многочлены Бернштейна; в форме Эрмита - R(/) = Я03(г)Р0 + H?(t)Q0) + #3(/)Q, + Я 3 где H*(t) - кубические многочлены Эрмита, ' (г), Замечание Вследствие большей вычислительной устойчивости многочленов Бернштейна описание эрмитовой кривой в форме Безье является более предпочтительным. Составные кубические кривые Эрмита (Составной) кубической кривой Эрмита, определяемой массивом Р Р /// > 1 и парой не нулевых векторов Qo и Qm , называется кривая у, которую можно представить в виде объединения элементарных кубических кривых Эрмита у' \ .... у т■ , A) , , , - (т) у = г U ...U г '; (/)-я кривая у' описывается параметрическим уравнением следующе- следующего вида: R:'(/) = (PM Р, Q,_, Q,)MT, 0<t<l, i=l, ..., т, 141
Сплайны где М - базисная матрица эрмитова сплайна, а векторы Q,, ..., Q определяются из матричного уравнения следующего вида: '14 1 V Q0 * 14 1 Q, т-\ \ 1 4 1 1 4 V Q ет-1 Q т J '-Ъ 0 3 -3 0 3 Ро р. \ Vn-1 V -3 0 3 -3 0 \ Единая параметризация Рассматривая составную кривую у как целое, более естественно поль- пользоваться единой параметризацией. Наиболее простой является параметризация с равноотстоящими целочисленными узлами. Для массива из т + 1 опорных вершин со- составная кубическая эрмитова кривая строится из т элементарных фрагментов. Если каждый из них определен на единичном отрезке, то длина общего промежутка изменения параметра должна быть равной т. Взяв 0 за начальную точку, получаем отрезок [0, /и]. В этом случае узлы параметризации определяются по формуле /0 =0, tt =tiX +1, / = 1, ..., 7Я. Описанный выбор отрезка параметризации позволяет записать урав- уравнение составной кубической эрмитовой кривой у следующим образом: где / Q,)M (Л ('-'.У tt_x <t<tf, /= 1, ..., /и, - параметрическое векторное уравнение (/)-й элементарной кубичес- кубической кривой Эрмита у" . 142
Сплаймовые кривые 14- i. Свойства составной кубической кривой Эрмита Составная кубическая кривая Эрмита, порожденная массивом Р Р /;/ > 1 г0' -•' гт' '"-Ь и парой не нулевых векторов Qo и Qm : 1+ является С2-гладкой кривой (имеет непрерывную кривизну); 2+ проходит через вер- вершины Ро, ..., Рт, в точках стыка элементарных кривых ^0, • Y. .'ivi. у и у выполняются равенства ?, у ту \' р . Ж. Ж | (рис. 3.29); Рис-329 I 3+ касательный вектор Q; во внутренней вершине Р, (/= 1, ..., I m-1) однозначно определяется через вершины массива Р и касатель- [ ные векторы Qo и Qm в концевых вершинах; . 4" не лежит в выпуклой оболочке, порожденной заданным мас- массивом; 5" изменение одной вершины в массиве или одного из касатель- касательных векторов в концевых вершинах массива приводит к изменению всей кривой; 6" пр:: добаачении в массив одной вершины возникает необходи- необходимость пересчета всех параметрических уравнений; 7+ составная кубическая кривая Эрмита аффинно-инвариантна; 8" заданные векторы однозначно определяют составную кубичес- I кую кривую Эрмита, не давая возможности хоть как-то влиять на ее форму; h 9" кубическая кривая Эрмита проективно- не инвариантна. Замечание При помощи элементарных кубических кривых Эрмита составную кривую можно построить по заданному массиву и произвольному набору не нулевых векторов I Каждая четверка Рм, Р,, QM, Q, задает элементарную эрмитову кри- кривую, которая описывается матричным параметрическим уравнением ш вида 143
Сплайны Q,)M <Л ('-О1 ч /M <t <ti, i = 1, ..., m. Однако в отличие от рассмотренного выше случая получаемая в ре- результате составная кривая является всего лишь С1 -гладкой. Программная реализация Описанный алгоритм реализован в виде функции на языке С. Обращение к ней имеет следующий вид: * hermite* p, m, qO, qm, div, output ), где Fit p[] -ini - оперная ломаная сплайна, ее элементы р[0] .. р[ т-1 ] v in) - число точек спорней ломаной' 'ij - компоненты касательных векторов i'inj int' m Fit qG, qm int di%r (inI - число звеньев аппроксимирующей ломаной Fit output[] (cut' - аппроксимирующая ломаная кривой Зрмита, ее элементы output [0] ... .output [ im-1'» *div] Приведем полностью текст этой программы. #include "common.h" void find_q; Fit qO, Fit qm, Fit p[], int m, Fit q[] ■ Fit a[ 30 ], b[ 30 ] ; int i ; a[l] = 0..0 ; b[l] = qO ; for1 i = 1; i <= m-1; i ++ q[ m ] = qm ; a[ i + 1 , 1 = - 1.0 / ■• 4 + a[ i ] b[ i + 1 ] = •■ b[i] - 3 * ( p[i + l a[ i } for1 i = m-1; i >= 0; i -- q[ i ] = a[i+l]*q[i+l] Fit hermite_3 ■' Fit p[ 2 ], Fit q[ 2 ] , Fit t :■ Fit t2 = t * t ; Fit t3 = t2 * t ; return i-l-3*t2 + 2*t3 »*p[0] + t2* •: 3-2*t) *p [1 ] + t*i'l-2*t + t2»*q[0] - t2* A-t) *q[l] ; } void hermitei. Fit p[], int m, Fit qO, Fit qm, int div, Fit output[] ) 144
Сплайновые кривые Fit t, dt = 1.0 / div ; Fit q[ 30 ] ; int i, d, first = 0 ; find_q( qO , qm, p, m-1, q ) ; /* find intermediate values Qi */ for*' i - 1; i < m; i for( d = 0; d <= div; d + + ) output[ first + d ] = hermite_3( &p[ i-1 ] , &q[ i t .+ = dt ; first += div ; Приведем пример использования функции для построения i плоской сплайи-кривой. #include "lib.h" /* Описание вызываемой функции */ void hermitei Fit p[], int m, Fit qO, Fit qm, int div, Fit output[] ) ; /* Число точек оперной ломаной */ #define M (8) #define DIV A0) /* Число т*очек аппроксимирующей ломаной */ #define U ( i'M-1 :• *DIV+1) */ /* Построение,опорной ломаной Fit хр[Ы] = { 0.056, 0.287, 0.655, 0.716, 0.223, 0.269, 0.666,' 0.929 } ; Fit ур[М] = { 0.S20, 0.202, 0.202, 0.521, 0.521, 0.820, 0.820, 0.227 } ; Fit qOx = .1, qOy = .1 ; Fit qmx = -.1, qmy = -.1 ; /* Описание выходных массивов */ * Fit ox[M], cy[M] ; void main( void • /* вычисление параметров сплайна*/ hermite( xp, H, qOx, qmx, DIV, ox • ; hermite( yp, H, qOy, qmy, DIV, cy } ; /* инициализация графической моды */ SetVideoMode (':• ; /* инициализация графической моды */ DrawPolygon( xp, yp, M, 1 ) ; /* отображение на' дисплее опорной ломаной */ DrawPolygon •:.. ох, су, U, 2 ) ; 145
Сплайны Текст программы hermite находится в файле hermite.c в подди- поддиректории CURVES на дискете, которую можно приобрести в изда- издательстве "Диалог-МИФИ". Подробную информацию об именах фай- файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 3.5.2. Сплайновые кривые Catmull-Rom По заданному массиву Р Р Р Р (элементарная) сплайновая кривая Catmull-Rom определяется при помо- помощи векторного уравнения, имеющего следующий вид: if Po + B - At )p2 -11 A - r)P3, Матричная запись параметрических уравнений, описывающих элементарную сплайновую кривую Catmull-Rom, - где P = (Po / •(<)! Ч' i'V M = Рз) = i 7 i j 4 О 1 3 .0 0 х0 Xj \ У у 3 -6 3 0 Г,оЛ т = r 1 Матрица М называется базисной матрицей сплайна Catmull-Rom. Касательная к элементарной сплайновой кривой Catmull-Rom в концевой точке Pj, R@) = P,, парал- параллельна отрезку Р0Р2, а в концевой точке Р2, R(l) = Р2, - отрезку PjP3 (рис. 3.30). Рис. 3.30 146
Сплайновые кривые Составные сплайновые кривые Catmull-Rom (Составной) сплайновой кривой Catmull-Rom, определяемой массивом Ро, ..., Рт, /я>3, называется кривая /, которую можно представить в виде объединения элементарных сплайновых кривых Catmull-Rom A) l'm-2) (/)-я кривая у1] описывается параметрическим уравнением следующе- следующего вида: 0</<1, /= 1, ..., т - 2, где М - базисная матрица сплайна Catmull-Rom. Рассматривая составную кривую у как целое, более естественно пользоваться единой параметризацией. Взяв за tx произвольное число (например, положив /, =0), определим узлы параметризации по фор- формуле tj+l = f. +1, / = 1, ..., т - 3. Тогда уравнение сплайновой кривой Catmull-Rom у можно записать так: tx<t<tm_2, где W Kit4- ч ('-О (< - о (< - (Л tt ^t </.+1, / - 1, ..., т - 3, - параметрическое векторное уравнение (/)-й элементарной сплайно- сплайновой кривой Catmull-Rom у1'. Свойства составной сплайновой кривой Catmull-Rom Составная кубическая сплайновая кривая Catmull-Rom, порожденная массивом Ро, ..., Рт, т>Ъ: 1+ является С1 -гладкой кривой; 147
Сплайны 2+ интерполирует вершины Р1? ..., Рт_!, в точках стыка элемен- элемен"+ тарных кривых у1 и /"+ выполняются равенства 3+ касательный вектор в вершине Р.ч, / = 2, ..., т, параллелен отрезку, соединяющему Р;_2 и Р.:, Рис. 3.31 (рис. 3.31); 4" не лежит в выпук- выпуклой оболочке, порожденной заданным массивом; 5+ изменение одной вершины в массиве приво- приводит к изменению только части кривой: при измене- изменении вершины Р; нужно пе- пересчитать параметрические уравнения только четырех кривых: у{1~2), г(м), y(l). у{'^1); 6+ при добавлении в массив одной вершины возникает необхо- необходимость пересчета параметрических уравнений только четырех эле- элементарных кривых; 7+ составная кубическая сплайновая кривая Catmull-Rom аф- финно-инвариантна; 8" заданный массив однозначно определяет составную сплайно- вую кривую Catmull-Rom, не давая возможности хоть как-то влиять на ее форму; 9" сплайновая кривая Catmull-Rom проективно-неинвариантна. Программная реализация Описанный алгоритм реализован в виде функции на языке С. Обращение к ней имеет следующий вид: catmull_rom ■ р, m, ctiv, output -, где Fit int m n Fit q 0 , qm •, i n ■ int div '''in: Fit output [] •out - опорная ломаная сплайна, ее элементы p[G] .. р[ m-1 ] - число точек спорной ломаной - компоненты касательных векторов - число звеньев аппроксимирующей ломаной - аппроксимирующая ломаная кривой Зрммта, 148
Сплайновые кривые ее элементы output[0]...output[(m-1)*div] Приведем полностью текст этой программы. Н #include "common.h" Fit catmull_rcm_3 <: Fit p[ 4 ], Fit t ) Л Fit s = 1.0 - t ; Fit t2 = t * t ; Fit t3 = t2 * t ; return .5 * •: -t p[0] + ( 2 - 5*t2 + 3*t3 ) * p[3] t* <l+4*t-3*t2 p[2] -t2 void catmull_rom' Fit p[], int m, int div, Fit output[] Fit t, dt = 1.. 0 / div ; int i , d, first = 0 ; for1 i = 1; i < m - 2; i ++ ) t - ч • for ( d = 0; d <= div; d +'+ ) output[ first + d ] = catmull_rom_3( &p[ i-1 ], t t += dt ; } first += div ; Приведем пример использования функции для построения плоской сплайн-кривой. ^include "lib.h" /* Списание вызываемой функции */ void catmuli_rcm ■: Fit р[], int m, /* Числе точек опорной ломаной */ int div, Fit output [] ■ ; M #def ine #define DIV •. 10 ■ . ' /* Число точек аппроксимирующей ломаной ^define U : -.Ы-3 ; *DIV) /* Построение спорной ломаной ' tit xp[h] = { u.udo, v.zBj, O.d55, 0.929};' it yp[l-lj = { V . 6Z'J , . *J . ZUZ , U.ZUZ, 0.22"}; /* Описание выходных массивов Fit ox[:M-3■*DIV], oy[iM-3)*DIV] void main-: void :■ ■ . */ 71о, ZZX, 0.2сУ, и. odd, U.DZl, */ { /* вычисление параметров сплайна */ catmull_rom ■: xpy M, DIV, ox ) catmull_romi yp, M, DIV, oy ) /* инициализация графической моды */ m 149
Сплайны SetVidecMcdei ; /* отображение Drav:Polygon ■-. хр, ур, М, 1 /* отображение на дисплее Drav.7Polygon'. ох, оу, IJ-, 2 /* отображение ка дисплее оперной ломаной */ v:Polygon ■-. хр, ур, М, 1 > ; /* отображение на дисплее аппроксимирующей ломаной */ Текст программы catmull_rom находится в файле catmull.c в под- поддиректории CURVES на дискете, которую можно приобрести в изда- издательстве "Диалог-МИФИ". Подробную информацию об именах фай- файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 3.5.3. Составные плоские кубические кривые, заданные в неявной форме Плоские сплайновые кривые можно составлять из элементарных фрагментов алгебраических кривых, описываемых неявными уравне- уравнениями. Геометрическая конструкция фрагмента алгебраической кривой 3-й степени Пусть Р^Р^Р, - неколлинеарные точки. Положение точек плоскости относительно треугольника А = АР0Р,Р2 можно описывать при помощи барицентрических координат. Пусть (х.,)'.) - декартовы координаты точек Р., / = 0, 1,2, и Р(х, у) - произвольная точка гитоскости. Справедливо разложение (х, у) = s(xo,yo) + ^х^у^ + и(х2, у2), где 5, Г и и - барицентрические координаты точки Р(х, у) относительно точек Ро,- Р, и Р2, причем s,+ t + и — 1. Если точка Р(х, у) лежит внутри тре- угольника А , то s > 0, г > 0, и > 0. Возьмем произвольною тбчк>^ А(.у0. /о, w0) вн\три треугольника о > 0, /0 > 0. и0 > 0) и точку (р 0,1/J, лежащую на продолже- нии отрезка Р0Р2 (sx <0, их > 1 или sl > 1, w. <0) (рис. 3.32). Рис. 3.32 В семействе неявно заданных алгебраических кривых 3-й степени 150
Сплаймовые кривые I as2 +bsu2 + cst2 +dt2u+estu = 0 существует кривая, которая проходит через точку Ро, касаясь отрезка Р0Р,, через точку Р2, касаясь отрезка Р,Р2, и через точку А, касаясь отрезка АВ (рис. 3.33). Чтобы записать уравнение этой кривой, доста- достаточно положить > с = ~A ~Px)sA > где 0 </?,, /?2 < 1 - произвольные числа, а И Кривизна части кривой, лежа- лежащей внутри треугольника, неотрица- неотрицательна. Составная алгебраическая кривая Пусть на плоскости задан набор точек Р Р Р . J.JJ такой, что точки Р7|._1,Р2/,Р,М, / = 1, ...„/я-1, коллинеарны (рис. 3.34). Кривая, составленная из элементарных фрагментов, построенных по описанном}' выше правилу для каждого треугольника А,. = АР2|.Р2|Ч1Р2/+2 путем произвольного выбо- выбора интерполируемой точки А,, касательной к искомой кривой в этой точке, и па- параметров формы 01 и 0[ , будет выпуклой в каждом •треугольнике А,, и G1 -не- -непрерывной. Выбор можно сделать универсальным для всех треугольников А.. Например, положить /?, - 02 = 1/2, И - -1/3 и взять в качестве точек Ау центры тяжести треугольников Ai. 2т-2 2т-1 151
Сплайны Глава 4. Сплайновые поверхности Общую задачу, рассматриваемую в этой главе, можно сформулировать так: по заданному множеству вершин с учетом их нумерации по- построить гладкую поверхность, которая, плавно изменяясь, проходила бы вблизи этих вершин и удовлетворяла некоторым дополнительным условиям. Эти условия могут иметь различный характер. Например, можно потребовать, чтобы искомая поверхность проходила через все заданные вершины или, проходя через заданные вершины, касалась заданных направлений, имела заданную регулярность и т. п. При отыскании подходящего решения задачи приближения важ- важную роль играет многогранная поверхность, вершины которой совпа- совпадают с точками заданного набора. Эту многогранную поверхность на- называют контрольной или опорной. Во многих случаях она довольно точно показывает, как будет проходить искомая поверхность, что осо- особенно полезно при решении задачи сглаживания. Мы будем рассматривать массивы, организованные как двумер- двумерные графы, топологически эквивалентные правильным прямоуголь- прямоугольным сеткам. Сказанное означает, что в массиве p p p K mO у K ml > '" K } наряду с вершинами Vtj учитываются еще и связывающие их ребра Р(/Р/,;+1 > ' = О, 1, ..., т - 1, т; j = О, 1, ..., п - 1, (рис. 4.1). Вершины Р|7, /= 1, ..., т - 1;у = 1, ..., п - 1, называются шины Роу К Р,п внутренними, • У • / = = 0, = 0, у = • 1, 1, 1, ,2, 2, , л m ..., а вер- -1, -1, т, - граничными. Каждая внутренняя вершина имеет 4 соседние вер- тп Рис. 4.1 152
Сплайновые поверхности шины, а каждая граничная - 3, за исключением четырех угловых вершин Р Р Р Р ж 00 > ж On » * тп » ж тО > у каждой из которых только две соседние вершины. Так организованный массив часто называют контрольным или опорным графом искомой сплайновой поверхности. В отличие от ситуации, рассматриваемой в гл. 2, в данном случае ограничения на множество вершин являются менее жесткими. Поэтому довольно естественно искать описание поверхности в более общей, параметрической форме. Для отыскания подходящих параметрических уравнений нужной поверхности удобно воспользоваться способом, естественно связан- связанным с интуитивным представлением о поверхности как о множестве точек, которое "заметает" кривая, движущаяся вдоль другой фиксиро- фиксированной кривой и изменяющая свою форму. Кроме того, желательно учесть и структуру опорного графа. Попытаемся прояснить геометрический смысл параметрического уравнения вида т п /=0 y=0 где #,(w) и bj{v) - некоторые функциональные коэффициенты. Положив п , /=0, ...,/и, это уравнение можно переписать так: т j=0 Первое из этих соотношений будем рассматривать как параметри- параметрическое уравнение /-й кривой (/ = 0, ..., т). Зафиксировав переменную v, v = го = coflst, получим на каждой из этих кривых по точке R,(v0). По набору полученных точек определим кривую при помощи пара- параметрического уравнения т /=0 (рис. 4.2). Говорят, что уравнение D.1) есть задание поверхности в виде тензорного произведения. Такие поверхности имеют целый ряд преиму- 153
Сплайны ществ, одно из которых особенно существенно для наших целей, ибо позволяет перенести на двумерный случай многие результаты и на- наблюдения предыдущей главы, посвященной кривым. Дело в том, что при повышении размерности задачи неизбежно возникает большое число новых проблем. Ограничения на структуру опорных массивов и выбор в качестве рабочего одного из наиболее простых классов по- поверхностей позволяют удержать это число в рамках, разумных для первого знакомства. Если количество вер- шин в заданном множестве Р достаточно велико, то найти универсальные фун- функциональные коэффици- коэффициенты c.(z/, v) = ai(u)bj (v), как правило, довольно за- труднительно. К тому же может оказаться (а часто так и бывает), что найден- рис j 2 ные функции Су (и, v) на- наряду с нужными свойствами обладают и такими, которые не всегда удовлетворительно согласуются с ожидаемым поведением соответст- соответствующей поверхности (например, поверхность, описываемая уравнени- уравнением D.1), с этими коэффициентами может осциллировать или откло- отклоняться от заданного множества местами очень заметно). Для успешного решения поставленной задачи приближения весь- весьма удобно привлечь поверхности, составленные из элементарных фрагментов. В случае, когда эти элементарные фрагменты строятся по единой сравнительно простой схеме, такие составные поверхности принято называть сплайновыми поверхностями. Параметрические уравнения каждого элементарного фрагмента ищутся в виде D.1) с той лишь разницей, что всякий раз привлекается только часть заданных вершин множества Р. При этом в качестве функциональных коэффициентов с^.(//, v) используются многочлены одинаковой степени. Для описания элементарных поверхностей и вычисления их гео- геометрических характеристик (необходимых при состыковке) часто ис- используют функциональные коэффициенты, в которых функции яД/v) и bj(v) - многочлены, как правило, невысоких степенней, второй или третьей. Конечно, привлекая многочлены больших степеней, можно описывать весьма сложные поверхности. Однако у таких многочленов 154
Онлайновые поверхности много коэффициентов, физический и геометрический смысл которых трудно понять. Кроме того, использование многочленов высокой степени может вызвать нежелательные колебания результирующей поверхности. Наибольшее распространение получили методы создания состав- составных поверхностей, для построения которых используются бикубичес- бикубические многочлены (которые, кстати, активно использовались в гл. 2). Выбор в качестве функциональных коэффициентов бикубических многочленов позволяет учесть многие дифференциальные и внеш- внешне геометрические требования, накладываемые на искомую поверх- поверхность. Высказанные соображения определят характер изложения разде- разделов этой главы. Глава начинается с описания минимально необходимого набора сведений из дифференциальной геометрии поверхностей. Затем рас- рассматриваются различные классы поверхностей, при помощи которых можно решить поставленную задачу приближения: определяются эле- элементарные поверхности (будущие фрагменты) и описываются их ос- основные свойства. Такой подход поможет пользователю в выборе наи- наиболее подходящего для него класса поверхностей. Часть из свойств формулируется в виде ответов на стандартный набор вопросов, среди которых есть, например, такие: • какова гладкость построенной поверхности? • каковы особенности расположения поверхности относительно за- заданных вершин опорного графа? • как сказываются на форме поверхности изменения опорных вер- вершин? 'Полезно также знать как связаны между собой форма поверхно- поверхности и простейшие геометрические преобразования (аффинные и про- проективные). Напомним, что аффинные преобразования включают в себя вра- вращение, растяжение и сжатие, параллельный перенос и их всевозмож- всевозможные комбинации, а к проективным преобразованиям, кроме того, от- относятся еще и преобразования перспективы. Большинство из рассматриваемых классов поверхностей обладают свойством аффинной инвариантности. Есть среди них и проективно •инвариантные. Хотя окончательный результат и не зависит от после- последовательности выполнения этих двух операций - преобразования на- набора опорных точек и построения поверхности, выбор порядка их ис- исполнения может заметно снизить вычислительные затраты. 155
Сплайны Использование рациональных поверхностей вносит в решение за- задачи приближения нужную гибкость, ибо в их описании принимают участие свободные числовые параметры. Возможность выбора позво- позволяет заметно влиять на форму искомых поверхностей, а также учиты- учитывать предписанные свойства. Важно и то, что рациональные поверх- поверхности сохраняют многие из свойств, которыми обладают соответ- соответствующие нерациональные (полиномиальные) поверхности/ А то об- обстоятельство, что рациональные поверхности ко всему еще и проек- тивно-инвариантны, является одним из наиболее привлекательных их свойств, весьма полезных при визуализации. Кроме того, показывается, как путем состыковки этих элементар- элементарных поверхностей можно получить составную поверхность, удовлетво- удовлетворяющую требуемым условиям, обсуждаются различные вопросы, свя- связанные с программной реализацией рассматриваемых подходов (их особенности, преимущества и недостатки, вопросы устойчивости). 4.1. Элементарные сведения из геометрии поверхностей 4.1.1. Параметризованные поверхности Параметрически заданной поверхностью называется множество S точек М(х, у, z) пространства, декартовы координаты х, у и z которых опре- определяются посредством соотношений х = х(и, v), у = у(и, v), z = z(uy v), a<u<b, c<v<d, где x(u, v) , y(u, v) , z(uy v) - функции, непрерывные в прямоугольнике R = {(и, v)\a<u<b,c<v<d), или в векторно-матричной форме: х{и, v) R = R(i/, v) = >•(!/, v) (w, v) e R. Эти соотношения на- называют параметрическими уравнениями поверхности S Рис. 4.3 или просто параметризацией поверхности S (рис. 4.3). 156
Онлайновые поверхности Величины и и v называются внутренними криволинейными коор- координатами на поверхности S. При v = v# = const векторное уравнение R = R(w, v0), a<u<b, описывает на поверхности S кривую - линию и. Аналогично при и = ио = const получа- получаем векторное уравнение R = R(wo,v), c<v<d, линии v. Линии и и v образуют на поверх- поверхности S координатную сеть (рис. 4.4). 4.1.2. Гладкие и регулярные поверхности v=\' о Рис. 4.4 Поверхность S называется Сг -гладкой относительно заданной пара- параметризации, если векторная функция R(w,v) является Сг -гладкой в прямоугольнике R, то есть каждая из координатных функций х(и, v), у(и, \*)щ z(u, v) имеет в этом прямоугольнике непрерывные производ- производные до порядка г включительно. Гладкая параметризация называется регулярной, если вектор R>, v)xRv(w,v)*O, (u,v)eR. Векторы Ru(u, v) и Rv(w, v) регулярной поверхнос- поверхности S лежат в ее касательной пло- плоскости в точке R(w, v) и ка- касаются в ней координатных ли- линий и и v, а единичный вектор N = R х R параллелен нормали поверхнос- поверхности S в этой точке (рис. 4.5). В каждой точке регулярной поверхности определена тройка не компланарных векторов Рис. 4.5 R.., R. и •> N. 4.1.3. Первая квадратичная форма поверхности Первой квадратичной формой регулярной поверхности S называется скалярный квадрат вектора dR — Kudu + RYdv: 157
Сплайны = dR2 = (Rudu + Rydv) = Edu2 +2Fdudv + Gch>2, где £ = £(n, v) = R2", F = F(u9 v) = ReRvf С = G(n, v) = R^( - коэффициенты 1-й квадратичной формы, связанные неравенством EG-F2>0. 4.1.4. Кривая на поверхности Параметрические уравнения w = w@, v=v@, a<t</3, определяют на поверхности S кривую у, описываемую векторным уравнением у: R = R@ = R(w@,v@), a<t<p. (рис. 6). Уравнения и — u(t), u v = v(t) называются внутрен- внутренними уравнениями кривой у. На регулярной- поверх- поверхности S кривая у регулярна при условии, что w2+v2>0. Касательный вектор кри- кривой у вычисляется по формуле 2 +2Fuv.+ а длина дуги - s = s(c) = Г R(t)dt = \ 4.1.5. Угол между кривыми на поверхности Пусть две кривые, описываемые внутренними уравнениями = v,(O, и пересекаются в точке M(t) па- параметрической плоскости, от- отвечающей значению / пара- метра. Соответствующие кривые на поверхности S, 158
Онлайновые поверхности пересекаются в точке R(r) этой поверхности под прямым углом (рис. 4.7), если \>\Vi = 0. I Координатные линии и и v поверхности S ортогональны тогда и толь- только тогда, когда F(u, v)=0. и 4.1.6. Площадь Л поверхности Площадь части поверхности 5, отвечающей области Q на J ^V параметрической плоскости (и, у) (рис. 4.8), равна ()• Рис. 4.8 4.1.7. Вторая квадратичная форма поверхности Второй квадратичной формой С1 -регулярной поверхности S называет- называется скалярное произведение векторов d2R и N: // = (d1 RN) = Ldu2+ IMdudv + Ndy2, где J _ L _ yIEG-F2 MM IN) , yJEG-F2 N) . Jeg-f2 4.1.8. Линии кривизны Кривизна кривой, лежащей на поверхности S и проходящей через точку R(u, v) в направлении Я = (du : dy) (рис. 4.9), вычисляется по формуле k(X) = *(R, Я) = IMdudv + Ndv Ed и + 2 Fdudv + Gtfv 159.
Сплайны U X=(du,dv) Рис. 4.9 Возможны два случая. 1. Функция &(R, Я) не зависит от направления Я в точке R. Тог- Тогда точка R называется либо омбилической (шаровой) точкой либо точкой уплощения по- поверхности 5. Все точки сферы - омбиличес- омбилические, все точки плоскости - точки уплощения. 2. Функция k(R, Я) имеет ровно два экстремума: к. и к+ - главные кривизны поверхности S в данной точке. Соответствующие направления на поверхности называются главными. Сеть кривых, направления которых в каждой точке поверхности главные, называется сетью линий кривизны. Если /г=0 и А/=0, то сеть координатных линий является сетью линий кривизны. 4.1.9. Гауссова и средняя кривизны Произведение главных кривизн в данной точке поверхности называет- называется ее гауссовой кривизной в этой точке, K = k k = EG-F2 а их полусумма - ее средней кривизной, гт 1 NE-IMF-LG И = — = : . 2 EG-F2 В каждой точке регулярной поверхности гауссова и средняя кри- кривизны описывают характер и степень отклонения этой поверхности от ее касательной плоскости в рассматриваемой точке. Точка поверхнос- поверхности называется эллиптической, если в ней К > О, гиперболической, если К < 0, и параболической при К = 0. 4.1.10. Геометрическая непрерывность При работе с поверхностями важно помнить о следующих двух обсто- обстоятельствах. С одной стороны, поверхность как множество точек в пространстве может иметь прекрасные геометрические характерис- характеристики, но описываться при этом достаточно плохими параметрически- параметрическими уравнениями. С другой стороны, хорошие дифференциальные свойства координатных функций, задающих поверхность, не всегда обеспечивают ее регулярность. 160
Сплайновые поверхности Рассмотрим некоторые примеры. Пример 1 Поверхность S задана парамет- &. рическими уравнениями ъ й R = R(w, v) = и cosv и sin v и -\<u<L 0<у<2тг (рис. 4.10). Результат: координатные функ- |! ции имеют производные всех по- порядков, а поверхность S имеет осо- особенность - коническую точку. Пример 2 Поверхность S задана парамет- параметрическими уравнениями Рис. 4.10 R = Щи, v) = и \ и и 1 -\<и<\, -1 < v < 1 (рис. 4.11). Результат: координатные функ- функции имеют непрерывные производ- производные до 4-го порядка включительно, а поверхность S имеет особенность - ребро. Причина особенностей - Rtt x Rv = О - в обоих примерах одна и та же. Требование регулярности Рис. 4.11 обеспечивает отсутствие у поверхности и ребер, и конических точек. При построении составных поверхностей наиболее типичной яв- является ситуация, когда каждая из регулярных поверхностей, участвую- участвующих в процессе создания новой поверхности, имеет собственную па- параметризацию. Несогласованность параметризаций может явиться | (и часто является) причиной особенностей, возникающих вдоль линий сопряжения. Это - особенности параметризации. 161
Сплайны 0) cB) < v s Предположим, что заданы две регулярные поверхности «ьv/ и , описываемые соответственно параметрическими уравнениями a(l) <u< b{l\ cA) < v < R = Rl"(w,v), ( и такие, что их граничные кривые имеют общий участок (рис. 4.12). В этом случае составная поверхность S = SA) u SB) называется непре- непрерывной или G0 -непрерывной. G0 -непрерывная составная по- поверхность S - S{1) kj SB) называется G1 -непрерывной, или G1 -поверхнос- -поверхностью, если ее касательная плос- ^ ' \£^ ^^2) Рис. 4.12 кость при переходе через общую кривую изменяется непрерывно. Пример 3 Составная поверхность, заданная параметрическими уравнениями v О и, V) = V V О является G1 -поверхностью. Это просто вырезок координатной плоскости Оху (рис. 4.13). У каждой G1 -поверхности сущест- существует такая параметризация, относитель- относительно которой эта поверхность является. С1 -регулярной. G1 -непрерывная составная поверх- о оA) оB) /^>2 ность о = »S w ^ называется и -не- -непрерывной или G2 -поверхностью, если ее гауссова кривизна при переходе через 7 1. X 162
Сплайновые поверхности общую кривую изменяется непрерывно. Пример 4 Составная поверхность, заданная параметрическими уравнениями w, v) = и и Ouuul, 0^ v< 1, / -tco t «) \ v) = I является G2 -поверхностью (рис. 4.14). ■ У каждой G2 -поверхности существует I такая параметризация, относительно которой эта поверхность является С2 -регулярной. 7 А sfi} Рис. 4.14 4.1.11. Вектор скручивания и билинейная поверхность Вектором скручивания регулярной поверхности 5, заданной параметри- параметрическим векторным уравнением R = R(u, v), называется смешанная производная Rwv. Геометрический смысл введенного вектора скручивания лучше все- всего пояснить на примере билинейной поверхности. Билинейной поверхностью, порожден- порожденной массивом из четырех некомпланар- некомпланарных вершин Роо, Р01, Р10, Рп, назы- р вается поверхность В, описываемая па- параметрическими уравнениями ч 'Рлп РпЛА-V R(w, v) = (l - и и) 00 00 01 10 11/ V ■'V/ 0< w, v< (рис. 4.15). Рис. 4.15 163
Сплайны Граничные кривые поверхности В суть прямолинейные отрезки РР РР РР РР *00г10> *10г11' *11г01> г01 г00 ' Вектор скручивания билинейной поверхности В легко вычисляется: Он показывает меру отклонения точки Рп от касательной плоскости к по- поверхности В в точке Роо (рис. 4.16). Важное замечание Значение смешанной производной радиуса-вектора зависит ко (и не столько) от геометрических свойств поверхности, способа ее параметризации. Пример. Параметрическое уравнение R(w,v) = wi+vj, 0<w,v<l, где i, j - орты координатных осей Ох и Оу, описывает единичный квадрат на координатной плоскости Оху (рис. 4.17). Вектор скручивания тождествен- тождественно равен нулю RMV(w, v) = О. Параметрическое уравнение R(j/, v) = их + wvj, 0 < w,v < 1, I 0 1 x Рис. 4.17 описывает тот же квадрат, однако вектор RMV(w, v) = j Ф О. В заключение отмети\т полезное соотношение Л/ = (RmN), связывающее вектор скручивания регулярной поверхности с коэффициентов ее второй квадратичной формы. 164
Сплайновые поверхности 4.2. Поверхности Безье 4.2.1. Параметрические уравнения поверхности Безье По заданному массиву Р = {Р..> / = 0,1,...,/и, У = 0,1,..., л} (элементарная) поверхность Безье определяется при помощи векторно го уравнения, имеющего следующий вид: т п R(",v) = LLB"{u)B]{v)Y>.n 0 < и, v < 1, 1=0 ;= где -многочлены Бернштейна. Матричная запись параметрических уравнений, описывающих по- поверхность Безье, - (х(и, vj /poo M РОл • • • р M mn/ где М = (///у) и порядка тип, = (v;:/) - квадратные матрицы соответственно Mv = (-1Г' л J / Л В случае, когда область изменения параметров ииу- произволь- произвольный прямо>тольник вида R = {(u, v)\a <u<b,c<v<d), уравнение поверхности Безье принимает следующий вид: т п 1=0 ;=о и - а \ v - с \ \d -с) Р . У Важный частный случай. При т = п = 3 имеем элементарную кубическую поверхность Безье, определяемую 16 вершинами: 165
Сплайны Р Р Р Р *00' *01> *02> *03> Р Р Р Р *10> *11» *12» Г13' Р Р Р Р Г20> * 21' Г22> Г23> Р Р Р Р *30> *31' *32> *33* Используя многочлены Бернштейна, эту поверхность можно задать так: /=0 J 0< w, v< 1, или в матричной форме: 00 10 20 01 11 21 31 02 12 22 32 03 13 23 33/ ( з ^ A) (v) o(v) JB>l(v)j Последнюю формулу часто записывают и так: где Щи, v) = x(u, v) \ J u = и и 3 \Ц J V = v \ р = 00 10 20 30 21 31 02 12 22 32 03 13 23 М = 1 -3 \ \ 3 1 0 3 -6 3 0 0 3-3 0 0 0 V Матрица М называется базисной матрицей бикубической поверхности Безье. 4.2.2. Свойства элементарных поверхностей Безье Свойства элементарных поверхностей Безье являются прямыми следс- следствиями свойств элементарных кривых Безье. Укажем некоторые из них. 166
Сплайновые поверхности Основные свойства элементарной поверхности Безье Элементарная поверхность Безье, порожденная массивом Р: 1+ является гладкой поверхностью, в частности 1-е производные радиуса-вектора R(w, v) можно записать так: р т-\ п >, v) = — Щи, v) = о . т п-\ v(i/, v) = -Щи, v) = « если векторы RM(w, v) и Rv(w, v) не коллинеарны, то определен еди- единичный вектор нормали поверхности $езье N(w, v); 2+ граничные кривые эле- элементарной поверхности Безье суть элементарные кривые Безье соответствующих степеней, их опорные ломаные образуют гра- границу опорной многогранной по- поверхности (опорного графа), в частности граничная кривая, опи- описываемая радиусом-вектором R@, v), является элементарной кривой Безье л-й степени с опор- Рис. 4.18 ным массивом вершин Р^,..., РОй (рис. 4.18); все 4 угловые вершины опорного многогранника Р^, РОй, Рт0 и Рти лежат на поверхности Безье, R@,0) = Pfl0, R(l,O) = PmO, К@,1) = Р0я) Ra(l,D = PmM, и поверхность касается >тловых граней опорного многогранника, на- например для угловой вершины Роо (и = v = 0), R@, 0) = Poo, выполняются равенства R,@, 0) = и(Р10 - Р^), R,.@,0) = и(Р01 - PJ (касательные векторы элементарной поверхности Безье в угловой вер- вершине коллинеарны звеньям соответствующих фаничных опорных ло- ломаных, исходящих из этой вершины (рис. 4.19), Rn.@, 0) = /ии((Ри - Р10) - (Р01 - Роо)) (вектор скручивания RMV@> 0) в угловой вершине Роо только множи- множителем отличается от вектора скручивания билинейной поверхности, порожденной четверкой вершин 167
Сплайны p p p p и оценивает степень отклонения опорной вершины Рп от касательной плоскости элементарной поверхнос- поверхности Безье в вершине Роо, * 0 Рис. 4.19 V* 10 * 00/ Х \*01 * 00| (вектор нормали перпендикулярен плоскости треугольника Роо^о^ю (для каждой из трех других угловых вершин Р01(и = 0, v= 1), Р10 (и = 1, v = 0), Рп {и - v = 1) - выполняются аналогичные соотношения); 3+ элементарная поверхность Безье лежит в выпуклой оболочке, порожденной массивом Р; 4+ элементарная поверхность Безье аффинно-инвариантна; 5+ элементарная поверхность Безье "повторяет" опорную много- многогранную поверхность; 6+ если все вершины массива Р лежат в одной плоскости, то оп- определяемая этим массивом элементарная поверхность Безье представ- представляет собой плоский криволинейный многоугольник, лежащий в этой плоскости; 7" степень функциональных коэффициентов напрямую связана с количеством вершин в массиве и растет при его увеличении; 8" при добавлении в массив новых вершин возникает необходи- необходимость полного пересчета параметрических уравнений элементарной поверхности Безье; 9" изменение хотя бы одной вершины в массиве приводит к за- заметному изменению всей поверхности Безье; 10" априорные сведения о расположении поверхности Безье (принадлежность выпуклой оболочке заданного массива вершин) яв- являются достаточно грубыми; 11- в уравнениях, описывающих элементарную поверхность Безье, нет свободных параметров - заданный массив однозначно опре- определяет поверхность Безье, не давая возможности хоть как-то влиять на ее форму; 12" элементарная поверхность Безье проективно-неинвариантна. 168
Сплайновые поверхности 4.2.3. Составные поверхности Безье В этом подразделе мы остановимся на построении составных бикуби- бикубических поверхностях Безье вследствие того, что именно такие поверх- поверхности Безье наиболее часто используются в приложениях. Составные поверхности Безье более высоких степеней конструируются по анало- аналогичной схеме. Составная бикубическая поверхность Безье - это С0-гладкая (не- (непрерывная) поверхность, являющаяся объединением элементарных бикубических поверхностей Безье. Пусть R = R(I)(«,v), (и, v) е [0,1] х [0,1], И R = RB)(«,v), (и, v) е [0,1] х [0,1], - радиусы-веюгоры двух элементарных поверхностей Безье, соответс- соответственно Sil) и Si2), порожденные массивами ,0) rod) P'"={Pi", / = 0,1,..., т, j = 0,1,--,«}, и B) <2) РB)={Р<2), 1 = 0,1,..., m, j = 0,1,.-..,/!}, такими, что рA) _ рB) mj Последнее означает, что по- поверхности S{1) и SB) имеют общую граничную кривую RA)(l,v) = RB)@,v), 0<v<l (рис. 4.20). Рис. 4.20 С1 -гладкость составной поверхности S = S(]) u Si2) обеспечивает- обеспечивается коллинеарностью всех троек вида т/ и и выполнением условия щ B) B) = const 169
Сплайны для всех у (рис. 4.21). Вы- Выполнение этого условия означает, что нормаль (или, что то же, касатель- касательная плоскость) составной поверхности при перехо- переходе через общую гранич- граничную кривую стыкуемых фрагментов изменяется непрерывно. р(П _ г03 " 33 _ рB) 30 Рис. 4.21 4.2.4. Рациональные поверхности Безье По заданному массиву р _ ip / = 01 т / = 01 п\ (элементарная) рациональная поверхность Безье определяется уравнени- уравнением следующего вида: Щи, v) = 0<u,vul, где В™{и) и В"(v) - многочлены Бернштейна. Неотрицательные числа wy, сумма которых положительна, назы- называются весами. В случае, если все веса \\>^ равны между собой, полу- получается стандартная элементарная поверхность Безье. Важный частный случай. При т — п — Ъ имеем элементарную би- бикубическую рациональную поверхность Безье, порожденную массивом из 16 вершин 00 10 20? 30' 01? 11» 21? 31 02? 12? 22? 32' 03? 13? 23? 170
Сллайновые поверхности и описываемую уравнением ZZ ZZ > V) /=o y=0 где /=o y=o Свойства рациональных бикубических поверхностей Безье Элементарная рациональная бикубическая поверхность Безье, порож- порожденная массивом Р: 1+ является гладкой поверхностью; 2+ граничные кривые элементарной бикубической поверхности Безье суть элементарные рациональные кубические кривые Безье (уп- (управляемые, правда, разными наборами весовых коэффициентов); их опорные ломаные - границы опорной многогранной поверхности (опорного графа), в частности граничная кривая, описываемая радиу- радиусом-вектором R(w, v), яштяется элементарной рациональной кривой Безье с опорным массивом вершин Р^, Р01, Р07, Роз; все 4 угловые вершины опорного многогранника РОО,РОЗ,РЗО и Р33 лежат на по- поверхности Безье, R@,0)=Poo, НA,0) = Рзо, R@,l) = P03, R(U) = P,,, и поверхность касается угловых граней опорного многогранника, на- например для угловой вершины P00(w = \> = 0), R@,0) = Р^, выпол- выполняются равенства, содержащие 3 весовых отношения R.@, 0) = 3^(Р10 - Pw), Rv@, 0) = По (касательные векторы элементарной бикубической поверхности Безье в угловой вершине коллинеарны звеньям соответствующих граничных опорных ломаных, исходящих из этой вершины), ^00 W00 / (вектор скручивания Ruv@, 0) в угловой вершине Роо оценивает сте- степень отклонения опорной вершины Рц от касательной плоскости эле- элементарной бикубической поверхности Безье в вершине Роо (для каж- 171
Сплайны дой из трех других угловых вершин Р^(и = 0, v = 1), P10(w = 1, v = 0), Рп (и = v = 1) выполняются аналогичные соотношения); 3+ элементарная рациональная бикубическая поверхность Безье лежит в выпуклой оболочке, порожденной массивом Р; 4+ элементарная рациональная бикубическая поверхность Безье аффинно-инвариантна; 5+ элементарная рациональная бикубическая поверхность Безье "повторяет" опорную многогранную поверхность; 6+ если все вершины массива Р лежат в одной плоскости, то оп- определяемая этим массивом элементарная рациональная бикубическая поверхность Безье представляет собой плоский криволинейный четы- четырехугольник, лежащий в этой плоскости; 7+ поведение рациональной бикубической поверхности Безье оп- определяется не только массивом вершин, но и набором свободных па- параметров - весовых множителей w^: при заданном наборе вершин формой элементарной рациональной бикубической поверхности Безье можно упраштять, меняя весовые коэффициенты; 8" изменение хотя бы одной вершины в массиве приводит к за- заметному изменению всей элементарной рациональной поверхности Безье; 9" априорные сведения о расположении элементарной рацио- рациональной бикубической поверхности Безье (принадлежность выпуклой оболочке заданного массива вершин) являются достаточно грубыми, 10+ элементарная рациональная поверхность Безье проективно- инвариантна. Замечание При построении составной рациональной бикубической поверхности Безье следует иметь в виду, что 1) определяющий ее массив Р = {Р^, / = 0,1,...,/и, У = 0,1,..., л} не может быть произвольным: чист тип должны удовлетворять условию m=3k+l,n=3l+l (впрочем, этдго всегда можно добиться путем добавления в исходный массив новых вершин), 2) хотя выбором весов можно влиять на форму составной поверхнос- поверхности, однако в общем случае она будет всего лишь непрерывной, и кри- кривые стыка элементарных фрагментов будут на этой поверхности ребрами. 172
Сплайновые поверхност 4.2.5. Программная реализация Описанный алгоритм реализован в виде функции на языке С. Обра I щение к ней имеет следующий вид: bezier__surf асе С р, seg_x, seg_y, div_x, div_y, output ), где I Point **p iin) int seg_x, seg_y i in int div_x ■: in * int div_y -.in-1 Point **output ■: out - точки оперного графа Pij, i = 0 . . . i'm-1) , j=0 . . . (n-1) , m = 3*seg_x+l,n = 3*seg_y+l, - число криволинейных сегментов по и и по v) - число звеьев в и - ломаной, - число звеьев в v - ломаной, - выходной массив точки Qij, i = 0...seg_x*div_x j - 0...seg_y*div_y Приведем полностью текст этой программы. #include "common.h" Fit Bi int i, Fit t Fit s = 1.0 - t switch1' i :• *s* case 0: return s*s*s ; case 1: return 3*t*s*s case 2: return 3*t*t*s ase return t*t*t void bezier_3_3 Point **p, int n, Fit u, Fit v, int i, int j Point out ; int k, 1 ; Fit yy ; Point t = { G, 0, 0 } ; f or ; k=0;k<4;k++ .■ Point s = { С, 0, 0 } ; for; 1=0; 1<4;!++•• Vec Fit tt = B'. 1, v : ; VecAddS •' tt, pp ■: p, i + k, j+1, n = Б ■. k, u • ; AddS •. yy, s, t, t :• ; , s, s VecCopy •: t, cut void bezier__surface d i v_x, int d i v_y, Point **p, int seg_x, int Point **output "j int 17
Сплайны int i, j , dl, d2 ; Fit u, v, du = 1.0 / div_x, dv = 1.0 / div_y ; int np = 3*seg__y + 1 ; int no = seg_y*div_y + 1 ; for i' j = 0; j < seg_y; j ++ ) for( i = 0;.i < seg_x; i ++ ) { v = 0 * for? d2 = 0; d2 <= div_y; d2 + + ) { u = 0 ; for-: dl = 0; dl <= div_x; dl ++ ) { bezier_3_3( p, np, u, v, i*3, j*3, pp( output, i*div—x + dl, + d2, no > ) ; u += du ; } v += dv ; } Приведем пример использования функции для построения сплайн-поверхности. ^include "lib.h" /* Описание вызываемой функции */ void bezier_surf асе ( Point **p, int seg_x, int seg.j,', int div_x, int div_y, Point **output ) ; /* число сегментов */ #define SEG •2 ■ /* число точек в опорном графе */ #define И • SEG*3+1 ) '#define DIV E' /* число точек в аппроксиьвфующем графе */ #define N iSEG*DIV+l} . /* Control graph initialization */ Point p[ M ][ M ] ; Point рЗО={ .5, -.5, 0};- . Point p22 = •{ .33, 1, -.33 } ; Point pG6 ={0.0,1,-1.0}; 'Point p60 = { 1,-1,0}; Point p54 = { .83,. 2, -.67 } ; .Point p3 6 = { .5,5,-1 } ; /* вспомогательная переменная */ Point tt = { 0, 0, 0 } ; /* Описание выходных массивов */ Point cc[ M ][ N ] ; Point EyePcs = { .5, 6, 2 } ; Point LockAt = { .5, 0, -3 } ; 174
Сплайновые поверхности Vec Up = { G, 1, -1 } ; Fit Alpha = .7 ; void maint' void ) { int i, j ; /* Заполнение массива течек */ for' i = 0; i < M; i ++ ) for ( j = 0; j < M; i j + + '• tt[ 0 ] = (Fit !i / i-Fit ) i M - 1 )) tt[ 2 ] = - 'Fit ,j / ((Fit > ( M - 1 VecCcpy( tt, p[ i 3[ j ] J ; VecCcpyt рЗО, р[ 3 ][ G ] VecCcpyi p22, p[ 2 ] [ 2 ] VecCcpy', pGc, p[ G ] [ 6 ] VecCopyi pcu, p[ 6 ] [ G ] VecCcpy( p54, p[ 5 ][ 4 ] VecCopy p36, p[ 3 ][ 6 ] /* вычисление сплайна */ bezier_surface- ('Point ** ■ p, SEG, SEG, DIV, DIV, •; Point **>cc "» /* инициализация графической моды*/ SetVidecMcde• > ; /* инициализация трехмерной графики */ Init3D( EyePos, LookAt, Up, Alpha :• ; /* отображение на дисплее построенного сплайна */ PlotSurface- ■: Point **.-оо/ М, М, 1 ■ ; Текст программы bezier_surface находится в файле bezier.c в под- поддиректории SURFACES на дискете, которую можно приобрести в из- издательстве "Диалог-МИФИ". Подробную информацию об именах файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 175
Сплайны 4.3. Б-сплайновые поверхности 4.3.1. Параметрические уравнения элементарной бикубической В-сплайновой поверхности По заданному массиву p 00' p *20' *30> P n p P31, n n n p32, p131 Раз, P33 (элементарная) бикубическая В-сплайновая поверхность определяется при помощи векторного уравнения - "'v -1> ф^кциональные коэффициенты п.(и) и яДу) в котором задаются следующими формулами: 6 (З3 32 3 l) () ( ), 3() 6 6 (форм>глы для многочленов лДу) отличаются от приведенных только тем, что всюд>^ вместо переменной и стоит переменная v). Замечание Запись параметрического уравнения бикубической В-сплайновой по- поверхности в виде 3 f 3 /=o vy=o J хорошо подчеркивает тесную связь, существующую между кубичес- кубическими В-сплайновыми кривыми и бикубическими В-сплайновыми по- поверхностями. Матричная запись параметрических 'уравнений, описывающих элементарную бикубическую #-сплайновую поверхность, - 176
Онлайновые поверхности w, v) = (по(и)пх(и)п2(и)пг(и)) p p p p Mo An 21 \ 31 02 12 22 32 03 13 23 33 \ п2(и) J 0 < w, v < 1. Последнюю формулу часто записывают так = UrMrPMV, где / \ v u = J л U U U V = v v /l \ 00 10 01 11 21 31 02 12 22 32 03 13 23 M = - -3 -3 ~ 0 -6 1 .0 О 3 -3 0 V Матрица М называется базисной матрицей бикубической В-сплай- новой поверхности. 4.3.2. Свойства элементарных бикубических В-сплайновых поверхностей Свойства элементарных бикубических Я-сплайновых поверхностей яв- являются прямыми следствиями свойств элементарных кубических В- сплайновых кривых. Укажем некоторые из них. Основные свойства элементарных бикубических /?-сплайновых поверхностей Элементарная бикубическая 5-сплайновая поверхность, порожденная массивом Р: 1+ яштяется гладкой поверхностью; 2+ как правило, не проходит ни через одну из 16 опорных вершин массива; 3+ граничные кривые элементарной бикубической 5-сплайновой поверхности суть элементарные кубические 5-сплайновые кривые; их опорные ломаные - границы опорной многогранной поверхности 177
Сплайны сом-вектором R@, v), является элементарной кубической 2?-сплайно- вой кривой с опорным массивом вершин Р^, Р01, Ро,, Роз; 4+ элементарная бикубическая ^-сплайновая поверхность лежит в выпуклой оболочке, порожденной заданным массивом Р из 16 вершин; это свойство является следствием того, что неотрицательные функциональные коэффициенты nt{u) и яДу) (hj= 0, 1, 2, 3) раз- разбивают единицу, ;=0 j=Q 5+ элементарная бикубическая /?-сплайновая поверхность аф- финно-инвариантна; 6+ элементарная бикубическая ^-сплайновая поверхность "пов- "повторяет" опорную многогранную поверхность; 7+ если все вершины заданного массива Р лежат в одной плос- плоскости, то определяемая этим массивом элементарная бикубическая ^-сплайновая поверхность представляет собой плоский криволиней- криволинейный четырехугольник, лежащий в этой же плоскости; 8~ изменение хотя бы одной вершины в массиве приводит к за- заметному изменению всей элементарной бикубической Я-сплайновой поверхности; 9" априорные сведения о расположении элементарной бикуби- бикубической /?-сплайновой поверхности (принадлежность выпуклой обо- оболочке заданного массива вершин) являются достаточно грубыми; 10+ в уравнениях, описывающих элементарную бикубическую Я-сплайновую поверхность, нет свободных параметров - форма эле- элементарной бикубической /?-сплайновой поверхности однозначно оп- определена; 11- элементарная бикубическая /?-сплайновая поверхность прое ктивно - не инвариантна. 4.3.3. Составные бикубические В-сплайновые поверхности Составной бикубической В-сплайновой поверхностью, определяемой массивом из (т + \)(п + 1) вершин Р = {Р.., / = 0, 1,...,/и, у = 0,1,...,/»} гп>Ъ л>3, называется поверхность 5, которую можно представить в виде объеди- объединения (т - 2){п - 2) элементарных бикубических Я-сплайновых по- поверхностей s(U), ...,s(m-2>n-2\ S = kJ£ kj"£ S{iJ); 178
Сплайновые поверхности (/,у)-я поверхность S(lJ) описывается параметрическими уравнениями вида k=0 1=0 0<w,v<l, 1</</я-2, или в матричной форме: (Р, , , , Ри_х Ри Р 1 < у < л - 2 , V*/-l,y+2 /,у+2 /+1 J+l /+1,у+2 /+2J+1 U2J+2J MV, \<j<n-2, где М - базисная матрица бикубического 2?-сплайна. Взаимное распо- расположение элементарных фрагментов составной поверхности схемати- схематически представлено на рис. 4.22. Свойства бикубических В-сплайновых поверхностей Составная бикубическая В-сплайновая поверхность, порожденная массивом Р: 1+ является С2 -не- -неРис. 22 прерывной; 2+ как правило, не проходит ни через одну из опорных вершин массива; 3+ граничные кривые составной бикубической 5-сплайновой по- поверхности суть составные кубические 2?-сплайновые кривые; их опор- опорные ломаные - границы опорной многогранной поверхности (опорно- (опорного графа), в частности граничная кривая, описываемая радиусом-век- радиусом-вектором R@, v), является составной кубической 5-сплайновой кривой с опорным массивом вершин Р^,..., РОя; 4+ составная бикубическая 5-сплайновая поверхность лежит в объединении (т - 2)(п - 2) выпуклых оболочек, порожденных наборами 179
Сплайны p, p, p p, p, p p p p /+2J-1 I t+2J I '+2J+1 i42j+2 (схематическое разбиение составной бикубической 2?-сплайновой по- поверхности показано на рис. 4.23); A,1) • • • 0, 1) (i+h 1) • • • 0+1, 1) • • • • • • • • • • • • • • • • • • (hi) • • • 0,i) O+i, J) • • • (m-2,j) (IJ+D • • • OJ+D O+Lj+D • • • (m-2,j+l) • * • • • • • • • Ф • • • • • • • • A, n-2) • • • 0, n-2) 0+1, n-2) • • • fm-2, /2-2; Рис. 4.23 t 5+ составная бикубическая 2?-сплайновая поверхность аффинно- инвариантна; 6+ составная бикубическая 2?-сплайновая поверхность "повторя- "повторяет" опорную многогранную поверхность; 7+ если все вершины массива Р лежат в одной плоскости, то оп- определяемая этим массивом составная бикубическая 2?-сплайновая по- поверхность предсташшет собой плоский криволинейный четырехуголь- четырехугольник, лежащий в этой же плоскости; 8+ изменение одной вершины в массиве приводит к изменению только части поверхности: при изменении вершины Р,у нужно пере- пересчитать параметрические уравнения только 16 элементарных по- поверхностей: 9" составная бикубическая 2?-сплайновая поверхность проектив но-неинвариантна; 10+ поведение составной бикубической ^-сплайновой поверх ности определяется только массивом вершин. 180
Сплайновые поверхности Замечание На взаимное расположение вершин в массиве не накладывается ни- никаких ограничений: некоторые из них могут и совпадать. Однако следует иметь в виду, что в подобных случаях поверхность может потерять свою регулярность. Впрочем, если номера совпадающих вершин сильно разнятся, то никакой потери регулярности не проис- происходит. Простейшие из случаев совпадения вершин рассматриваются ниже. 4.3.4. Кратные и воображаемые вершины В приложениях часто удобно использовать массивы, в которых сов- совпадающие (кратные) вершины являются граничными и угловыми. В этом случае в создании граничных бикубических 2?-сплайновых фрагментов участвуют опорные вершины в числе меньше 16 (без учета кратности), что сказывается на размерах фрагментов, а также позволяет получать априорную информацию о поведении составной поверхности вблизи границы. Составная бикубическая 2?-сплайновая поверхность, как правило, не содержит ни одной из вершин массива, который ее порождает. Однако подбором вспомогательных вершин и построением дополнительных элементарных поверхностей можно добиться того, чтобы граничные кривые новой составной поверхности располагались ближе к граничным и угловым вершинам. Обычно это проводится путем использования кратных или воображаемых вершин. А. Двойные вершины Зададим 2т + 2п + 8 новых вершин, положив -1,7 = *0у J = ' > •"' W> m+lj ~ *mj> ./ = ^, 1, ..., #, . Р/,-1 = Р/о> / = 0,1,..., /и, P/fll+1 = Pinу / = 0,1,..., /и, Р -РР -РР -РР = Р г-1,-1 ~ г0,0> г-1,/М ~ г0«> rm+l,-l ~ rm0> £ «+l^i+l L тп' Эти вершины как бы "окаймляют" заданный массив Р и вместе с ним образуют новый ■Р*={Р.., / = -1,...,/и + 1, у = -1,...,/! + 1} из (т + Ъ){п + 3) вершин. Замечание Как множества точек массивы Р и Р* неразличимы, так как все добавленные вершины отличаются от заданных только номерами - геометрически новых вершин не появилось. 181
Сплайны Составная бикубическая 2?-сплайновая поверхность S*, опреде- определяемая массивом Р*, состоит из тп фрагментов Stj, радиусы-векторы которых вычисляются по формулам 3 3 ZZ  £=0 /=0 О < и,v < 1, / = -1,..., т - 1, j = -1, ...,/7 -' 1. Только 2т + 2л - 4 из этих элементарных поверхностей являются новыми (ясно, что в по- построении каждого из новых фрагмен- фрагментов принимает участие хотя бы одна новая вершина). Взаимное расположение состав- составных бикубических 2?-сплайновых по- поверхностей - старой S и новой S* - хорошо видно на рис. 4.24. Новые фрагменты схематически представле- представлены на рис. 4.25. /^с. 4.24 Значения вектора скручивания в угловых вершинах четырех угло вых фрагментов Л ,о > Ъ >^ поверхности S R(O,«-1) uv . тг (ш-1,л-1) /-• t\ /p — P 4- P — P ^ uv V > / V то—1,и-1 тп-\,п тп т,п-\'^ 4 с точностью до множителя равны значениям векторов скручивания билинейных поверхностей, определяемых соответственно четверками вершин 182
Сплаймовые поверхности P™ p P0« P РОя> p p ТО-1.Л-Р 7W-l,/7* p p • Г1Р M0> P P P P m«' m, я-1> IW-1.P (oj) @J+D (О, п-1) A, п-1) (I, п-1) A+1, п-1) (т-2, 0) (т-1, 0) (т-1, 1) (т-1, п-2) (т-2, п-1) (т-1, п-1) Рис. 4.25 Б. Тройные вершины В дополнение к уже взятым 2т + 2/2 + 8 вершинам зададим еще 2т + 2/2 + 16 новых вершин, положив р/,-2 = Р/,-р 7* = -Ь •-» -2,-2 = Р Р = Р 1,и+Р Р = Р т+2,п+2 P ~ P fe, и с учетом добавленных вершин построим 2т + 2/2 + 4 новых элемен- | тарных поверхности - \,J ) • 1 ■! > J ~~ ~*9 . .. , /7 — 1, , / = —1, ..., /W — 1, 183
Сплайны сО» J) j — и,..., п , задав их параметрическими уравнениями вида 3 3 (-hi) @, j) (-ij+i) (OJ+l) (-1, @, A, -1) -1) -1) (-1, @, A, 0) 0) 0) (-1, @, 1) 1) Рис. 4.26 JUO /=0 В результате получим новую бикуби- бикубическую 2?-сплайновую поверхность S**, со- состоящую из (т + 2)(/i + 2) фрагментов (рис. 4.26). Некоторое пред- сташгение о взаимном расположении новых фрагментов поверхности S** относительно старой поверхности S* могут дать схематические изо- изображения, приведенные на рис. 4.27. Все 4 угловых фраг- фрагмента о(-1,-1) о(-1,л) o(m,w) о(/п,-1) о «о «о ,о , поверхности S** лежат на билинейных поверх- поверхностях. Поэтому векторы скручивания в точках этих четырех фраг- фрагментов постоянны по направлению и соответственно имеют вид: -Р01+Р„- Riv'n)(u,v) = .2 -р 0„ ij(m, п) 14 wv 2v2 R%--l)(u,v) = 3M2v2(Pm_,!0 - Pm_u + Р„ - Pw0). Кроме того, все 4 угловые вершины лежат в углах составной бикуби- ческой /?-сплайновой поверхности S**, построенной при помощи тройных вершин 184
Сплайновые поверхности В. Воображаемые вершины Выбором дополнительных вершин к массиву Р = {Р.., / = 0,...,/и, у = 0, ..., можно добиться выполнения различных условий на границе состав- составной поверхности. Обычно новые (воображаемые) вершины ищутся в виде линейных комбинаций заданных вершин. Рассмотрим составную бикубическую 2?-сплайновую поверхность S*, порожденную массивом 2т + 2л + 8 вершин которого подобраны посредством следующих формул Р - Р - Р 4- Р -1,-1 ~ Г0,-1 М.-1 ^ г0,-1> р = р - р + р т+1,я+1 m+l,n m+\,n-l w-1,/7' -1,У = М),; "" М,/ + *0,/> ^ = ^' *••' W' Р/,-1 = Р/,-1 ~Р/,-1 +Р/,-Р ' =0, ...,/77, Р = Р - Р + Р Р - Р - Р -4- Р гт+1,-1 ~ гт,-1 rm-l,-l ^ Г1и,л-1» Р = Р -Р +Р / = 0 т Г/,/7-1 Г/,Я Г/,Я-1 ^ Г/,Я> ' U' '••' Ш» Р = Р - Р + Р /■= 0 п Составная бикубическая ^-сплайновая поверхность S*, опреде- определяемая массивом Р*, обладает следующим свойством: кривизна общей кривой соседних фрагментов в точке, лежащей на граничной кривой этой поверхности, равна нулю. В рассматриваемом случае векторы скручивания в угловых точках поверхности S* равны векторам скручивания билинейных поверхнос- поверхностей, построенных на примыкающих к этой вершине ребрах. Например, вектор скручивания в угловой точке фрагмента S ' ) ра- равен * 00 ~ * 01 ~ "ll + * 10 * 4.3.5. Рациональные бикубические В-сплайновые поверхности По заданному массиву 185
Сплайны Р^, / =0, ..., m, У=0, ..., л, (элементарная) рациональная бикубическая В-сплайновая поверхность определяется уравнением вида «,v)= ^з '3 , ч '» 0<м, v< Неотрицательные числа wiJ9 сумма которых положительна, назы- называются весами. В случае, если все веса \vtj равны между собой, полу- получается стандартная элементарная бикубическая 2?-сплайновая поверх- поверхность. Свойства составных рациональных бикубических ^-онлайновых поверхностей Составная рациональная бикубическая /?-сплайновая поверх- поверхность, порожденная массивом Р: 1+ является С2-гладкой поверхностью; 2+ как правило, не проходит ни через одну из опорных вершин массива; 3+ граничные кривые составной рациональной бикубической 2?-сплайновой поверхности суть составные рациональные кубические ^-онлайновые кривые; их опорные ломаные - границы опорной многогранной поверхности (опорного графа), в частности, граничная кривая, описываемая радиусом-вектором R@, v), является составной рациональной кубической /?-сплайновой кривой с опорным массивом вершин Poo,..., POw; 4+ составная рациональная бикубическая В-сплайновая поверх- поверхность лежит в объединении (т - 2)(п - 2) выпуклых оболочек, порож- порожденных наборами {Рк!, к = i - 1, /, / + 1, / + 2, / = j - 1, j\ j + 1, j + 2} (схематическое разбиение составной 5-сплайновой поверхности пока- показано на рис. 4.23); 5+ составная рациональная бикубическая /?-сплайновая поверх- поверхность аффинно-инвариантна; 6+ составная рациональная бикубическая 2?-сплайновая поверх- поверхность "повторяет" опорную многогранную поверхность; 7+ если все вершины массива Р лежат в одной плоскости, то оп- определяемая этим массивом составная рациональная бикубическая 2?-сплайновая поверхность представляет собой плоский криволиней- криволинейный четырехугольник, лежащий в этой же плоскости; 186
Сплайновые поверхности 8+ изменение одной вершины в массиве приводит к изменению только части поверхности: при изменении вершины Ру нужно пере- пересчитать параметрические уравнения только 16 элементарных поверх- поверхностей: 9" составная рациональная бикубическая /?-сплайновая поверх- поверхность проективно-инвариантна; 10+ поведение составной рациональной бикубической /?-сплай- новой поверхности определяется не только массивом вершин, но и набором свободных параметров - весов w,., параметров формы; при заданном наборе вершин рациональной бикубической 2?-сплайновой поверхностью можно управлять, меняя весовые множители. 4.3.6. Программная реализация Описанный алгоритм реализован в виде функции на языке С. Обра- Обращение к ней имеет следующий вид: nurbs_surface■р, weight., uknot, vknot, m# n, div_x# div__y,output; , где Point **p 'in - опорный граф сплайна, его точки Pij, i = 0...(m-1), j=0...(n-1) Fit **.-: -in- - массив весовых коэффициентов точек, его элементы Wij, i = 0 ...(m-1), j =0... ; n-1 • Fit uknot[] in - массив u-узлсв, его элементы uknot[0]...uknct[m+3], Fit vknot [ ] ■'in • - массив и-уз лоз, его элементы vknot [ 0 ] . . . vknot [ n+ 3 ] int m, n -.in-- число точек в опорном графе, int ciiv_x in - число звеньев в и-ломаной, int ciiv_y ■ in • - число звеньев в и-ломаной, Point **oucput out ■■- граф, аппроксимирующий сплайн, его •точки Qi j , i = 0 . . . -:m-3 ; *div_x, j = 0 . . . i.n-3 ; *div_y . Приведем полностью текст этой программы. #i nc1ude "common.h" Fit II int n, int i, Fit u, Fit knot[] > i if; n == 0 •■ return ( knot[i] <= u && u < knot[i + l] • ? 1.0 • i . i . • return i u - knot[i] ) * N. n-1, i, u, knot ) / iknot[i+n] - knot[i]; + •: knot[i+n+l] - u ) * NC n-1, i + 1, u, knot • / •knot[i+n+l] - knot[i+1]) ; 187
Сплайны void nurbs_3_3(- £oint **p, Fit **w, Fit uknot[] , Fit vknot[], int k, int 1, int n. Fit u, Fit v, Point out ) " Point z = { 0, 0, 0 } ; Fit t, s2 = 0 ; int i, j ; for( i = k-3; i< k+1; i++ } ■{ . ' Fit si- 0 ; Point q = { 0, 0, 0 } ; fcr( j = 1-3; j < 1+1; j ++ ) " t = N( 3, j, v, vknot ) * ((Fit *iwi[ i*n + j ] ; si = si + t ; . • . VecAddSi t, pp( p, i, j / n ), q/ q ) ; t >= N ( 3, i, u, uknct ) ; s2 = s2•+ t * si ; VecAddS i t, q, z, z :• ; Vecpiv{ z, s2, out) ; void nurbs—surface»; Point **p, Fit **weightf Fit uknot [j, Fit vknot[],int m, int n, int div_x, int div_y# Point **cutput ) int i, j, dl, d2 ; ■ Fit u, v, du, dv ; int no = in-3./*div_y + 1 ; for' j = 3; j < n; j ++ ) fort i = 3; i < m; i ++ ) v = vknct- [ j ] ; , N dv = ', vknot [ j + 1 ] - v > / div_y' ; for'' d2 = 0; d2 <= div_^*; d2 ++ ) С u = uknot[ i ] ; du = ( uknot [ i + 1 ] '- u ) / div_x ; for' dl = 0; dl <= div_x; dl ++ • nurbs_3_3i p, weight, uknot, vknot, i, j, n,-u, v,ppt output, (i-3>*div_x+dl, M-3;'*div_y+d2, no .:• j ; u += du ; . t v += dv ; . * } " ■' ' " 188
Сплаиновые поверхности Приведем пример использования функции для построения сплайн-поверхности. #include "lib.h" /* описание вызываемой функции */ void nurbs_surfacet Point **p, Fit **weight. Fit uknot[], Fit vknot [. ] , . int m, int n, int div_x, int div_y, Point **output ) ; /* число точек опорного графа */ #define - М E') #define. DIV E) '/* число точек в аппроксимирующем графе */ #define N ((М-3)*DIV+1) /* инициализация спорного графа4 */ Point р[ М ] [ 'М ] ; Point pll = { .25, 1,. -.25 } Point p4 0 = { 1.0, -'.5, 0.0 } Point pG4 ={0.0,2, -1.0} Point рЗЗ =' { .75, 2, -.75 } Fit uknot[ M + 4 ] = { 0, .1, .2, .3, .4, .5, .6, .7, .8 } ; Fit vknot[ M + 4 ] = { 0, .1, .2, .3, .4, .5, .6, .7, .8 } ; Fit weight [ M ] [ M ]. ; . /* промежуточная переменная ■*/ Point ,tt - { 0, 0# 0 } ; ' . Fit beta! = 1.0, beta2 =0.0; /* описание выходного массива */ Point oo[ N ][ N ] ; Point EyePos = { .5, 1, 1 } ; Point LockAt =■{ .5, 0, -1 } ; * Vec Up = { 0, 1, 0 } ; i ■ Fit Alpha = .7 ; void maim void » p ч mt l, i /* заполнение массива */ for( i = и; i < M; i ■ + + ) for( j=O;j<M;j++) ' tt[ 0 ] = (Fit )i / ((Fit )\ M - 1 )) ; tt[ 2 ] = - (Fit i j / -( (Fit i < M - 1 ) ) ,; VecCcpy i tt, p[ i ] [ j ] ) ; weight! i ] [ j ] - 1.0 '; VecCopyi pll, p! 1 ][ 1 ] ) ; VecCopyi p40, p[ 4 3[ 0 3 ) ; VecCopyi pO4, p[ 0 3 [ 4 ] ) ; VecCcpy ( рЗЗ, p[ 3 3 [ 3 ] ' )' ; 189
Сплайны /* вычисление значений сплайна.*/ nurbs_surface( (Point **)p, (Fit **)weight, uknot, vknot, M, M, DIV, DIV, (Point **)oo ) ; /* инициализация графической йоды */ SetVideoModeO ; /* инициализация трехмерной графики */ Init3D( EyePos, LcokAt, Up/ Alpha ) ; /* отображение на дисплее построенного сплайна */ PlotSurfacei (Point **юс1 U, M,. 1 ) .; Текст программы nurbs_surface находится в файле nurbs.c в под- поддиректории SURFACES на дискете, которую можно приобрести в издательстве "Диалог-МИФИ". Подробную информацию об именах файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 190
Сплайновые поверхности 4.4. Бета-сплайновые поверхности 4.4.1 Параметрические уравнения элементарной Ьета-сплайновой поверхности По заданному массиву p 00' p *20» Po? P ^11' P21, P31' *02» p p P32, P03 p p Рэз (элементарная) Бета-сплайновая поверхность определяется при помо- помощи векторного уравнения R(/J4w,v) = ZX>.(wN;.(v)PlV, 0<m,v<1, i=0 у=0 функциональные коэффициенты Ъ.(и) и ^(v) в котором задаются следующими формулами: + 2рх{цг -Зи + 2) + /?2Bи3 - Ъи1 + 1)), (формулы для многочленов bj(v) отличаются от приведенных только тем, что всюду вместо переменной и стоит переменная v), где рх > 0 и р2 > 0 и S = 2/?j* + 4/?2 + 4yffj + Р2 + 2 . Числовые параметры рх и /?2 называются параметрами формы Бета-стайновой поверхности. Замечания: /. При Рх—\ и Р2 = 0 получается элементарная бикубическая В-сплайновая поверхность. 2. Запись параметрического уравнения Бета-сплайновой поверхности в виде 191
Сплайны /=0 \ хорошо подчеркивает тесную связь, существующую между Бета-сплайновыми кривыми и Бета-сплайновыми поверхностями. Матричная запись параметрических уравнений, описывающих элементарную Бета-сцлайновую поверхность, u), bx(u), Ь2(и), \ 00 10 p, p, 01 11 21 31 02 12 22 32 03 13 23 33/ / \ Mv) / 0< и, v< 1 . Последнюю формулу часто записывают так: = UrMrPMV, 0<и, v<l, где \' J 00 10 20 Vr30 и V = \ * 01 *02 P P Г11 Г 21 31 12 22 32 03 13 23 33/ м-i 6/?; ■2/?; ^ 2 0 (здесь /7 = 0 =p\+pl+p1). 3/7 0 у Матрица М называется базисной матрицей Бета-сплайновой по верхности. 192
Сплайновые поверхности 4.4.2. Свойства элементарных Бета-сплайновых поверхностей Свойства элементарных Бета-сплайновых поверхностей являются пря- прямыми следствиями свойств элементарных Бета-сплайновых кривых. Укажем некоторые из них. Свойства элементарных Бета-сплайновых поверхностей Элементарная Бета-сплайновая поверхность, порожденная мас- массивом Р: ■•■ 1+ является гладкой поверхностью; 2+ как правило, не проходит ни через одну из шестнадцати опор- опорных вершин массива; 3+ граничные кривые элементарной Бета-сплайновой поверх- поверхности суть элементарные Бета-сплайновые кривые; их опорные ломаные - границы опорной многогранной поверхности (опорного графа), в частности, граничная кривая, описываемая радиусом-векто- радиусом-вектором R@, v), является элементарной Бета-сплайновой кривой с опор- опорным массивом вершин Р^, Р01, Р02, Роз; 4+ элементарная Бета-сплайновая поверхность лежит в выпуклой оболочке, порожденной заданным массивом Р из 16 вершин; это свойство является следствием того, что неотрицательные функци- функциональные коэффициенты bt(u) и bj(v), /,у = 0, 1, 2, 3, разбивают единицу, 3 3 i=0 j=0 5+ элементарная Бета-сплайновая поверхность аффинно-инва- риантна; 6+ элементарная Бета-сплайновая поверхность "повторяет" опорную многогранную поверхность; 7+ если все вершины заданного массива Р лежат в одной плос- плоскости, то определяемая этим массивом элементарная Бета-сплайновая поверхность представляет собой плоский криволинейный четырех- четырехугольник, лежащий в этой же плоскости; 8" изменение хотя бы одной вершины в массиве приводит к замет- заметному изменению всей элементарной Бета-сплайновой поверхности; 9" априорные сведения о расположении элементарной Бета- сплайновой поверхности (принадлежность выпуклой оболочке задан- заданного массива вершин) являются достаточно грубыми; 10+ в уравнениях, описывающих элементарную Бета-сплайновую поверхность, есть два свободных параметра - параметры формы J3X 193
Сплайны и р2, меняя которые можно управлять формой элементарной Бета-сплайновой поверхности; 11- элементарная Бета-сплайновая поверхность проективно не- неинвариантна. 4.4.3. Составные Бета-сплайновые поверхности Составной Бета-сплайновой поверхностью, определяемой массивом из (т + 1)(л ■+ 1) вершин Р = {Р.. / = 01... т / = 01.. п) т> 3 п> 3 называется поверхность S, которую можно представить в виде объеди- объединения (т - 2)(п - 2) элементарных Бета-сплайновых поверхностей оA,1) г*(т-2,я-2) <3 у . . . ) kj , s = -2 (/,у)-я поверхность S(lx/) описывается параметрическими уравнениями вида к=0 1=0 0<w,v<l, l</<w-2, или в матричной форме: Р , , , Р 1<у </?-2 , U- Р/-1,м p,.+lj. р;+1., р р р I р MV, 0 < w, v < 1; 1 < / < w - 2, 1 < у < п - 2 , где М - базисная матрица Бета-сплайна. Некоторое представление о взаимном расположении элементар- элементарных фрагментов составной поверхности может дать схематическое изображение на рис. 4.22. Свойства Бета-сплайновых поверхностей Составная Бета-сплайновая поверхность, порожденная массивом Р: 1+ является G2 -непрерывной; 2+ как правило, не проходит ни через одну из опорных вершин массива; 194
Сплайновые поверхности 3+ граничные кривые составной Бета-сплайновой поверхности суть составные Бета-сплайновые кривые; их опорные ломаные - гра- границы опорной многогранной поверхности (опорного графа), в част- частности граничная кривая, описываемая радиусом-вектором R@, v), яв- является составной Бета-сплайновой кривой с опорным массивом вер- вершин Р Р " 00 > *# * > Оя > 4+ составная Бета-сплайновая поверхность лежит в объединении (т - 2)(п - 2) выпуклых оболочек, порожденных наборами /-1 %+U-l "/+1J+2 1 (схематическое разбиение составной Бета-сплайновой поверхности показано на рис. 4.23); 5+ составная Бета-сплайновая поверхность аффинно-инвари- аффинно-инвариантна; 6+ составная Бета-сплайновая поверхность "повторяет" опорную многогранную поверхность; 7+ если все вершины массива Р лежат в одной плоскости, то оп- определяемая этим массивом составная Бета-сплайновая поверхность представляет собой плоский криволинейный четырехугольник, лежа- лежащий в этой же плоскости; 8+ изменение одной вершины в массиве приводит к изменению только части поверхности: при изменении вершины Pf. . нужно пере- пересчитать параметрические уравнения только 16 элементарных по- поверхностей: gUJ-2) 9" составная Бета-сплайновая поверхность проективно-не инва- инвариантна; 10+ поведение составной Бета-сплайновой поверхности опреде- определяется не только массивом вершин, но и набором свободных парамет- параметров рх и J32: при заданном наборе вершин формой составной Бета-сплайновой поверхности можно управлять, меняя параметры формы. 195
Сплайны Замечания: 1. Параметры формы J3X и J32 не обязательно должны быть одинаковыми для всех элементарных фрагментов. С учетом взаимно- взаимного расположения вершин массива их можно выбирать так, чтобы 1) пара значений J3[o) и J3Bij) для каждого элементарного фрагмента была своя, 2) на каждом единичном квадрате [0,1] х [О,1] функции J3{(u, v) и J3-,(u9 v) линейно зависели от параметров и и v или 3) функции /?j (и, v) и J31(w, v) быт разными д.гя разных эле- элементарных фрагментов (г = 1, ..., m-2yj = 1, ..., п-2). Как правило, выбор параметров формы f3x и /32 определяется вза- взаимным расположением вершин в массиве. Если размеры четырех- четырехугольников Р Р Р Р 0 < у £л-1, различаются не слишком cwibHO, то выбор параметров, одинаковых д.гя всех частичных поверхностей, дает достаточно хорошее прибли- приближение. Если же этого не наблюдается и разница в размерах этих четырехугольников весьма велика, то хороших результатов можно добиться подбором переменных параметров формы. 2. На взаимное расположение вершин в массиве не накладывается никаких ограничений: некоторые из них могут и совпадать. Однако следует иметь в виду, что в подобных случаях поверхность может потерять свою регулярность. Впрочем, если номера совпадающих вершин cwibHO разнятся, то никакой потери регулярности не проис- происходит. Простейшие из случаев совпадения вершин рассматриваются ниже. 4.4.4. Кратные и воображаемые вершины В приложениях часто удобно использовать массивы, в которых сов- совпадающие (кратные) вершины являются граничными и угловыми. В этом случае в создании граничных Бета-сплайновых фрагментов участвуют опорные вершины в числе меньше 16 (без учета кратности), что сказывается на размерах фрагментов, а также позволяет получать априорную информацию о поведении составной поверхности вблизи границы. Составная Бета-сплайновая поверхность, как правило, не содержит ни одной из вершин массива, который ее порождает. 196
Сплайновые поверхности Однако подбором вспомогательных вершин и построением допол- дополнительных элементарных поверхностей можно добиться того, чтобы граничные кривые новой составной поверхности располагались ближе к граничным и угловым вершинам. Обычно это проводится путем использования кратных или воображаемых вершин. А. Двойные вершины Зададим 2т + 2п 4- 8 новых вершин, положив *-1 j = "о,У > J ~ ^> ^> * * • > П)> "да+1,/ = "m,j > ^ = "» 1> • • •> П •> */,-1 = * /0> / = U, I, ..., /77, *1,я+1 = */,«> / = U, 1, ..., /77, Р =Р Р =Р Р =Р Р -Р -1,-1 00' ж -1,и+1 * On » ж от+1,-1 жот0' Ж m+-l,n+l ~ Ж тп ' Эти вершины как бы "окаймляют" заданный массив Р и вместе с ним образуют новый Р* = {Р^> / = -1,..., /77 + 1, j = -1, ...,/7 + 1} из (т + 3)(/7 + 3) вершин. Замечание Как множества точек массивы Р w P* неразличимы, так как все до- добавленные вершины отличаются от заданных только номерами - геометрически новых вершин не появилось. Составная Бета-сплайновая поверхность 5*, определяемая масси- массивом Р*, состоит из тп фрагментов S(lj), радиусы-векторы которых вычисляются по формулам А:=0 /=0 0 < W, V < 1, / = -1, ..., /77 - 1, j = -1, ..., П - 1. Только 2/71 4- 2/7 - 4 из этих элементарных поверхностей 5@'У), у = 0,...,/1-2, 5(/>'1), / = 0,...,/и-2, являются новыми (ясно, что в построении каждого из новых фрагмен тов принимает участие хотя бы одна новая вершина). Взаимное расположение составных Бета-сплайновых поверхнос тей - старой S и новой 5* - хорошо видно на рис. 4.24. Новые фраг менты схематически представлены на рис. 4.25. Векторы скручивания в угловых вершинах четырех угловых фраг с@,0) р@,л-1) с(да-1,я-1) с(да-1,0) с* ментов о , о , о , о поверхности S 197
Сплайны о (О, О) ' 0)@, 0) = Д (Poo - On i\ _ » 4 — ' A» 0) = —5 с точностью до множителя равны векторам скручивания билинейных поверхностей, построенных соответственно на четверках вершин Р Р Р Р • А00> ■ ж01» 11 > 10' р р р р р р р р Р Р Р Р жте-1,0> жт,0> жт1' ж. т-1,1* Б. Тройные вершины В дополнение к уже взятым 2т + 2п + 8 вершинам зададим еще 2/я + 2я + 16 новых вершин, положив *_2,/ = ж-1,у> ./ = ~"м •••> Л + 1> ж«+2,у = ж«+1,/> ^ = "~ж>'•■•> Л + ж> Р =Р / = -1 «4-1 Р = Р / = -1 Я Р - Р Р -Р Р - Р Р - Р rm+22 ~~rm+l-l' ^т+г^+г "" г и с учетом добаатенных вершин построим 2т + 2л + 4 новых элемен- элементарных поверхности ' у = U /7 Л ' = U, ..., /7, Л ' , / =: U, ..., /77, задав их параметрическими уравнениями вида R<''>, v) = It At(«)A;(v)Pt.UM.I+;, 0 < и, v < 1. ik=0 /=0 В результате получим4 новую Бета-сплайновую поверхность 5**, состоящую из (т + 2)(л + 2) фрагментов. 198
Сплайновые поверхности Некоторое представление о взаимном расположении новых фраг- фрагментов поверхности У* относительно старой поверхности 5* могут дать схематические изображения, приведенные на рис. 4.26. г» л л, с(-1»-1) о(-1>л) о(ю,я) р(/и,-1) Все 4 угловых фрагмента Л , о * , Л , о поверхнос- поверхности 5** лежат на билинейных поверхностях. Векторы скручивания в точках этих четырех фрагментов постоянны по направлению и име- имеют соответственно вид: ) Щ^ (Р Pi + - Ро„ + Р1п - v m-\,n-\ V P 4-P P Кроме того, все 4 угловые вершины лежат в углах составной Бета-сплайновой поверхности 5**, построенной при помощи тройных вершин (см. рис. 4.27). В. Воображаемые вершины Выбором дополнительных вершин к массиву Р = {Р^, / = 0,...,/и, у = 0,..., л можно добиться выполнения различных условий на границе состав- составной поверхности. Обычно новые (воображаемые) вершины ищутся в виде линейных комбинаций заданных вершин. Рассмотрим составную Бета-сплайновую поверхность 5", порож- порожденную массивом Р* ={Р.., / = -1, ...,m + l, j = -1,..., /i + l}, 2/W + 2/I + 8 вершин которого подобраны посредством следующих .формул: fh^1fP P \ L Р 199
Сплайны р E±JLJlL(p _р ч.р r-i,y " 9 ^з vro,y ri,y/ + r 2pl 2 t Щ f A 2A 3 V + Pi + 02,- Я1+1,я ж+1,я-1/ жт+1 o,y> /p _p ч,р т-\ /,«» / = 0,..., m Составная Бета-сплайновая поверхность Л*, определяемая масси- массивом Р*, обладает след>тощим свойством: кривизна общей кривой со- соседних фрагментов в точке, лежащей на граничной кривой этой по- поверхности, равна нулю. В рассматриваемом случае векторы скручивания в угловых точках поверхности S* с точностью до множителя равны векторам скручива- скручивания билинейных поверхностей, построенных на определяемых этими точками четверках вершин. Например, вектор скручивания в угловой точке фрагмента равен а(Р00-Р01+Рп-Р10), где 4.4.5. Программная реализация Описанный алгоритм реализован в виде функции на языке С. Обра щение к ней имеет следующий вид: beta_surface (Ы, Ь2, р, m, n, div__x, div_y, output ), 200
Сплаиновые поверхности где Fit Ы, Ь2 (in) - параметры betal H.beta2 Point **р (in) - опорный граф сплайна , его вершины Pij, i = 0...(m-1), j = 0... (n-1) int m, n (in) - число точек опорного графа, int div_x (in) - число звеньев в и-ломаной, int div_y (.in) - число звеньев в v-ломаной, Point **output (out)- граф, аппроксимирующий сплайн, его вершины Qij, i = 0...(m-3)*div_x, j = 0...(n-3)*div_y Приведем полностью текст этой программы. #include "common.h" » static Fit betal, beta2 ; static Fit Ь12, Ь13, Ь22, Ь23 ; static Fit delta, d ; Fit b( int i, Fit t ) { Fit s = 1.0 - t ; Fit t2 = t * t ; Fit t3 = t2 * t ; switchi i ) { case 0: return 2 * bl3 *d*s*s*s; case 1: return d* •2*bl3*t* i.t2-3*t+3 ) +2*bl2* (t3- 3*t2+2!+2*betal*Ct3-3*t+2) +beta2*B*t3-3*t2+l)) ; case 2: return d* i 2*bl2*t2* (-t + 3") + 2*betal*t*( t2+3/+beta2*t2*i-2*t+3)+2*(- case 3: return 2 * t3 * d ; void beta_3_3 ■: Point **p, int n, Fit u, Fit v, int i, int j, Point cut * { int k, 1 ; Fit yy ; Point t = { 0, 0, 0 } ; fori k = 0; k < 4; k ++ ) { Point s = { 0, 0, 0 } ; for; 1 = 0; 1 < 4; 1 ++ ) { Fit tt = bi 1, v ) ; VecAddS •: tt, pp ( p, i+k, j+1, n ":■ , s, s ) ; yy y k, u > ; ) ; VecAddS •■' у у, s, t, t } VecCcpy'. t, cut :■ ; } void beta_surfacei Fit bl, Fit b2, Point **p, int m, int n, int div_x, int div_y,Point **output ) { int i, j, dl, d2 ; 201
Сплайны Fit u, v, du = 1.0 / div_x, dv = 1.0 / int no, = (n-3)*div_y + 1 ; betal = Ы ; beta2 = b2 ; Ы2 = betal * betal ; bl3 = bl2 * betal ; b22 = beta2 * beta2 ; b23 = b22 *' beta2 ; delta =■ 2 * ЫЗ + 4 * Ы2 + 4 * betal + beta2 + 2 ; d = 1.0 / delta ; f or ( j = 0; j < n - 3; j ++ ) for( i=0;i<m-3;i++) { v = 0 * for( d2 = 0; d2 <= div_y; d2 ++ ) { . u = 0 ; for( dl = 0; dl <= div_x;. dl ++ ) { beta_3_3( p, n, u, v, i, j, pp( output, i*div_x+dl, j*div_y+d2, no )) ; u += du ; } v += dv ; ■ Приведем пример использования функции для построения Бета- сплайн-поверхности. Ш #include "lib.h" /* описание вызываемой функции */ , void beta^surface; Fit bl, Fit Ь2, Point **p, int m, int n, int div_x, int div_y, Point **output ) ; /* число точек спорного графа */ #define M ,5) ' #define DIV i5) /* число точек в аппроксимирующем графе */ #define N («М-З)*DIV+1) /* инициализация оперного графа */ Point р[ Ы ][ И ] ; Point pll = { .25, 1, -.25 } ; Point p40 ={1.0, -.5, 0.0}; Point pO4 ={0.0,2, -1.0}; Point рЗЗ = { .75, 2, -..75 } ; /* вспомогательная переменная */ Point tt = { 0,. 0, 0 } ; Fit betal = 1.0, beta2 = 0.0 ; /* описание выходных массивов */ Point оо[ N ][ N ] ; ' . 202
Сплайновые поверхности Point Eye'Pos ="{.5,1,1}; ' Point LookAt = { .5, 0, .5 } ; Vec Up = { Q, 1, 0 } ; Fit Alpha = .7 ; i void main(. void ) int i, j ; /* заполнение массива */ for( i = 0; i < M; i ++ ) f or ( j = 0; j < M; j + + .) tt[ 0 ] = (Fit )i / ((Fit j ( M - 1 )) ; ' tt[ 2 ] = - iFlt 'j / («:Flt )■( M - 1 )) ; VecCopy i. tt, p [ i ][ j ] ) ; VecCopy( pll, p[ 1 ][ 1 ] ) ; VecCopy! p4.G, p[ 4 ] [ G ] ) ; ■ VecCopy \ pG4, p.[ 0 ].[ 4 ] .■ ; • . VecCopyi p33, p[ 3 ] Г 3 ] } ; ' /* вычисление значений сплайна */ beta_surfacei betal, beta2., (Point **)p, M, M, DIV, DIV, (Point **'ico i ; /* инициачлизацця графической моды */ SetVideoMcde() ; /* инициализация трехмерной графики */ Init3D( EyePcs, LcckAt, Up, Alpha > ; /* отображение на дисплее построенного сплайна */ PlotSurfacei iPoint **iOG, N, N, 1 > ; Текст программы beta_surface находится в файле beta.c в под- поддиректории SURFACES на дискете, которую можно приобрести в издательстве "Диалог-МИФИ". Подробную информацию об именах файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 203
Сплайны 4.5. Другие сплайновые поверхности 4.5.1. Интерполяционные бикубические поверхности Эрмита По заданным вершинам Р Р Р Р r00> *01> Ml» МО и набору векторов Y Y Y Y VVVV 7 7 7 7 лоо> л01> л10' лп> хоо> х01> Мо> жп> ^оо'^ор ^ю; ^п (элементарная) бикубическая эрмитова поверхность определяется при помощи матричного уравнения где \ z(w,v), u = <л и V = V V W3, G = 00 10 00 p Pll X N 01 11 00 10 '00 01 '01 \ 1 0 0 0 0 0 1 0 J ■"> _2 л V Матрица М называется базисной матрицей бикубической эрмито- эрмитовой поверхности, а матрица G - ее геометрической матрицей. Геометрический смысл векторов, определяющих элементарную би- бикубическую эрмитову поверхность Вершины Р,у (/ =0, 1, у = 0, 1) являются угловыми точками эле- элементарной бикубической эрмитовой поверхности (рис. 4.28). В точке Р,у вектор Х,у касается w-линии эрмитовой поверхности, а вектор Yy- касается ее v-линии в этой вершине (для того чтобы по- построенная поверхность была регулярной, естественно потребовать, чтобы каждая пара векторов Х,у и Yy- была неколлинеарна). Что касает- касается вектора Zy-, то это вектор скручивания в вершине Ру-. 204
Сплайновые поверхности В частности, в вершине Род элемен- элементарной эрмитовой по- поверхности (при и = О и v = 0) имеем R@, O)=Poo, Rw@, O)=Xoo, Rv@, O)=Yoo, Rwv@, O)=Zoo. При линейной за- замене параметров и ь-> £ = (I - и)а + иЪ, и ь-> т] = A - и)с + ud , преобразующей еди- единичный квадрат [ОД] х [ОД] в прямоугольник [a,b] x [c,d], форма элементарной поверхности Эрмита изменяется. Для ее сохранения необходимо заменить векторы Х,у и Y,y и Z,/ (/ = 0, ..., m, j = 0, ..., п) соответственно на Рис. 4.28 -1-х Ь-а »' 1 d-c (b-a)(c-d) Составные бикубические поверхности Эрмита (Составной) бикубической поверхностью Эрмита, определяемой массивом Pi mO и векторами /и, j = 0, ...,я; Yf/, / = 0,..., 7 7 7 7 ^00' ^0п' ^т0> ^т« > называется поверхность S, которую можно представить в виде объеди- объединения элементарных бикубических поверхностей Эрмита и 205
Сплайны (рис. 4.29); (/,./)-я поверхность S('J) описывается параметри- параметрическим уравнением следующе- следующего вида: R(iJ\u, v) = UrMrG(lJ)MV, где М - базисная матрица би- бикубической эрмитовой поверх- поверхности, а геометрическая мат- матрица G(i^ имеет следующий вид: тп \ \ij_ Векторы X,y,, / 1, ..., /и-1, у 0, ..., п, i —0, ..., m, j— 1, ..., Л-1, , / ^ 0, w, / ^ 0,.... n, 7 7 7 •/ 7 7 7 можно выбрать так, чтобы составная поверхность Эрмита бьша С2 - гладкой. Вся исходная информация, необходимая для их определения, может быть записана в виде табл. 4.1. Таблица 4.1. Zoo Yoo Yio • • • Y«-i, о Ywo ZmO Xoo Poo Pio • • ■ Pw-1, 0 PwO Xwo Xoi Poi Pll • • • • • P/w-1,1 * ml Xo, w-i Po, n-\ Pi, w-1 • • • • p * m-\, n-\ * /И, W-l Л-/И, W-l Хоя Pow PlW • • • p ^/w-l, w * mn Y Yo« Yi« • • • */w-l, w 7 Опишем формулы, посредством которых вычисляются эти векто- векторы. Начнем с матричных формул для вычисления векторов во внутренних вершинах массива Р. Имеем: и 206
Онлайновые поверхности '\ 4 1 1 4 1 1 4 1 1 4 1 оо \ Xm-l,0 Xm0 X /и-1,0 /n,0 -3 О 3 -3 0 3 -3 0 -3 -3 0 -З у 'р, 00 ь. /и-1,0 /и-1,0 Vo ) (прямоугольные скалярные матрицы имеют одинаковые размеры (/7/ - 1) х (/77 +1), элементы первой и последней строк матрицы X из- известны, матричное уравнение однозначно разрешимо), 14 1 Л 1 4 1 1 4 1 1 4 1 '-3 0 3 -3 0 3 V -3 0 -3 -3 0 -3. 00 mn s (прямо>тольные скалярные матрицы имеют одинаковые размеры (п - 1) х (п + 1), элементы первой и последней строк матрицы Y из- известны, матричное уравнение однозначно разрешимо). Если векторы Х,у и Y,y найдены, то векторы скручивания Ъц во всех внутренних и граничных вершинах массива Р (за исключением четырех уже заданных угловых Zoo, Zo«, ZiTO, Zmn) можно вычислить так: 207
Сплайны сначала по формулам а 4 1 Л 4 1 \ 1 4 1 1 4 V \ -3 0 3 -3 0 3 \ -3 О -3 -3 0 -Ъ) \ / X X X кО к\ к,п-\ kn J к = 0, т, вычисляются векторы скручивания в граничных вершинах Р# (/ = 1, ..., п-\) (прямоугольные скалярные матрицы имеют одинаковые размеры (я-1)х (п+\), первый и последний элементы столбца Z из- известны, матричное уравнение однозначно разрешимо), а затем по формулам -3 0 3 3 0 4 1 3 1 4 • • • 1 • • 1 -3 0 -3 4 1 _з 0 1 4 1 -3> J 1-W */я/ вычисляются векторы скручивания в граничных вершинах (/ = 1, ..., т-\) (прямоугольные скалярные матрицы имеют одинаковые размеры (т - 1) х (т + I), первый и последний элементы столбца Z известны, матричное уравнение однозначно разрешимо). Тем самым полностью построены массивы 208
Онлайновые поверхности производных радиуса-вектора вдоль it-линий хоо Х01 ••• Х10 Х11 ••* •••• Х/п-1,0 Хт-1,1 •■" Х/и-1,л-1 Хт-1,л Х/л0 Х/и1 "* Хт,л-1 Х производных радиуса-вектора вдоль v-линий "• \n-l векторов скручивания Завершающим шагом в построении составной эрмитовой поверх- поверхности является вычисление радиусов-векторов R^(w, v) элементар- элементарных фрагментов S^l'J) по формуле 0 < W, V < 1, / = 1, ...,/И, У = 1, ...,А7. Свойства составной бикубической поверхности Эрмита Составная бикубическая поверхность Эрмита, порожденная мас- массивом и векторами Y/7, 7 209
Сплайны 1+ является С2 -гладкой поверхностью (имеет непрерывную кри- кривизну); 2+ проходит через все вершины массива Р; 3+ касательные векторы Ху и \у к координатным линиям и—const и v = const составной поверхности S во внутренней вершине Р,у (/' = 1, ..., /и-1, 7= h •••> л-1), а также векторы скручивания Zy однозначно определяются через вершины массива Р и векторы Ху, \у и Zy, заданные в граничных вершинах; 4" не лежит в выпуклой оболочке, порожденной заданным мас- массивом; 5" изменение одной вершины в массиве или одного из заданных векторов приводит к изменению всей поверхности; 6" при добавлении в массив одной вершины возникает необходи- необходимость пересчета всех параметрических уравнений; 7+ составная бикубическая поверхность Эрмита аффинно-инва- риантна; 8" заданные векторы однозначно определяют составную бикуби- бикубическую поверхность Эрмита, не давая возможности хоть как-то влиять на ее форму; 9" бикубическая поверхность Эрмита проективно-неинвариантна. 4.5.2. Программная реализация Описанный алгоритм реализован в виде функции на языке С. Обращение к ней имеет следующий вид: hermite_surf асе •:. р, х, у, z, m, n, div_x, div__y, output • , где Point' **p (in:- - спорный граф сплайна, его точки Pij , i = 0. . . -.m-l :■ , j = 0. . . (n-1) , Point **x -in! - массив производных по и, его элементы Xij , i = 0. . . ''m-l.; , j = 0 . . . ■: n -1 ) , элементам Xkj , k = G-, m-l, j = 0 ... n-1, следует присвоить граничные значения, Point **y iin1 - массив производных по v, его элементы .Yi j , i = 0 ... '.'m-l ■ , j = G . . . . n -1 ' , элементам Xkj, i = 0, m-l, j = 0, n-1, следует присвоить граничные значения, Point **z -in* - массив векторов кручения, его элементы Zi j , i = 0 . . . ■: m-l ■ , j =0 . . . •: n-1 '• , элементам Z[0][C], Z[G][n-l], ■. Z[m-1] [0-], Z[m-1] [n-1] следует присвоить граничные значения, ■ int m, n iin) - число точек в опорном графе, int' div_x ('in.1 - число звеньев в и-ломаной, int div_y fin) - число звеньев в v-ломаной, Point **output i.out) - граф, аппроксимирующий сплайн, его элементы Qi j , i = 0 . . . -'m-l '■ *div_x, j = 0 ...'■'n-1 ! 210
Сплайновые поверхности Приведем полностью текст этой программы. #include "common.h"- . • void Progonka( Point y[], Point F[], int n ) {. static Fit alpha[ 30 ]; static Point beta[ 30 ]; ' ■ int i ; alpha[ 1 ] = 0.0 ; VecCopy( y[0], betafl] ) ; for( i = 1; i < n; i ++ ) { " ■ ' ■ alpha[ i+1 ] =1.0/ (-4.0- alpha[ i ] ) ; VecSubi beta[i], F[i], beta[i+1] ) ; VecMul ■: beta[ i + 1 ]# alpha [ i + 1 ], beta [ i + 1 ] ) ; } . . for* i = n-1; i > 0; i -- ) VecAddS'. alpha[ i+1 ], y[ i+1 ], beta[ i+1 ], y[ i ] ) void SolveForX- Point **x, Point **p, int m, int n ) I { I static Point y[ 30], F[ 30 ] ; I' int i, j ; f for-; j=0;j<n;j++) for( i = 1; i < m-1; i ++ ) . VecSub' pp( p, i + 1, j, n) , pp( p, i-1, j, n), F.[ i VecMul-. F[i], 3.0, F[i] ) ,\ VecCopyi pp\X,0,j,n), y[0] ) ; VecCopy ■: pp :. x, m-1, j , n) , у [m-1 ] ) ; Progonka. y, F, m-1 ) ; for: i = 1; i < m-1," i'++ ) ■ VecCopy: у[i] , pp(x, i, j , n) ) ; void SolveForY ; Point **y, Point **p, int m, int n •) static Point yy[ 30], F[ 30 ] ; int i, j ; i for> i = 0; i < m; i ++ ) for= j = 1; j < n-1; j ++ ) VecSubi pp( p, i, j+1, n), pp( p, i, j-1, n•, F[ j VecMul( F[j], 3.0, F[j] ) ; } ■ VecCopy v pp;у,i,0,n), yy [ 0] ) ; VecCcpyi pp(y,i,n-l,n), yy[n-l] ) ; Progonka( yy, F, n-1 ) ; for1 j=l;j<n-l;j++)
Сплайнь} VecCopy( уу [j] , рр(у, i# j , n) .) void SolveForZ( Point **x, Point **y# Point **z, int m, int n ) { static Point zl[ 30 ] , z2 [ 30 ] ; static Point Fl[ 30], F2[ 30 ] ; int i# j ; for( j = 1; j < n-1; j ++ » { " VecSubi' pp ( x, 0, j + 1, n>, pp ( x, 0, j-1, n) , Fl [ j ] j ] VecMuli. Fl[j] , 3.0, Fl [j] i ; VecSubi pp ( x, m-1, .j + 1, n's , ppi. x, m-1', j-1, n) , F2 [ у ; VecMul t . F2 [ j ] , 3.0, F2 [ j ] )• ; VecCopy ( ppi z, 0, 0, n ') , zl[0] ) ; VecCopy i pp ( z, 0, n-1, n :• , zl [n-1] j ; VecCcpy( pp( z( m-1, 0, ri"), z2[0] ) ; VecCopy i' pp ( z, m-1, n-1, n -, z2[n-l] ) ; Progonka;. zl, Fl, n-1 ) ; Progonka? z2, F2,. n-1 ) ; for' j = 1; j < n-1; j ++ i VecCopy^ zl [j] , pp\Z, 0, j , n.) ) ; VecCcpy; z2[j], pp'.z, m-1, j, n; •} ; for? j=0;j<n;j++) { ■ VecCopy ■; pp z, 0, j , n', zl [0 ] ■ ;• VecCopy ( pp'.z, m-1, j, n.1 , zl[m-l] ) ; for' i = 1; i' < m-1; i ++ '» VecSubi pp'; y, l + l, j, n :■ , ' pp • y, i-1, j, n :• , Fl [ • '- VecMuli Fl[i], 3.0, Fl[i] :■ ; . Progonka' zl, Fl, m-1 ) ; for; i = 1; i < m-1; i ++ ) VecCopy ■: zl [i ] , pp ; z , i , j , n- :> :• ;. Fit mm •: int n, Fit v { Fit у2 Fit v3 sv:itch = v*v ; = v2*v ; n ':• case С: return 1 - 3*v2+2*v3 ; case 1: return 3*v2 -• 2*v3 ; case 2: return v - 2*v2 + v3 ; case 3: return -v2 + v3 ; 212
Сплайновые поверхности void hermite_3_34( Point **p, Point **x,, Point **y,' Point **z, int n, Fit u, Fit v, int i, int j, Point out ) {, Fit mu[4] = { mirnO, u ), mm( 1, u) , mmB, u) , mm (' 3, u) } Fit mv[4] = { mm@, v ), mm( 1, v), mmB,•v), mm( 3, v) } Point GV[4], zzz = { 0, 0, 0 } ; int к ; VecCcmb! mv[0], pp ( p, i-1, j-1, n ), mv[l], pp( p, i-1, j, n), GV[0] ) ; VecAddSi mv[2]# pp ( y, i-1, j-1, n ), GV[0], GV[0] ) ; VecAddS( mv[3]# pp ( y, i-1, j, n ), GV[0] , GV[0] ) ; YecCombi mv[0]-, pp ( p, i, j-l, n ), mv[l], pp ( p, i, j, n), GV[1] ) ; VecAddSi mv[2], pp( y, i, j-1, n ), GV[1], GV[1] ) ; ■VecAddSC mv[3], pp( y# i, j, n ), GV[1], GV[1] ) ; VecCombi mv[0], pp( x, i-1, j-1, n ), mv[l], pp( x, i-1, j , n) , GV[2] ) ; VecAddSi. mv[2], pp ( z, i-1, j-1, n ) , GV[2]., GV[2] ;• ; VecAddSi mv[3], pp ( z, i-1, j, n ), GV[2], GV[2] • ; VecComb ■. mv [ G ] , pp ( x, i , j -1, n ) , mv [ 1 ] , pp i x, i , j , n1, GV[3] ) ; VecAddS( mv[2], pp ( z, i, j-1, n ), GV[.3] , GV[3] ;, ; VecAddS( mv[3], pp( z, i, j, n ), GV[3], GV[3] ) ; for*. k = G;k<4;k++) VecAddSi mu[k], GV[k], zzz, zzz ) ; VecCopy!' zzz, cut ) ; } void hermite_surface;. Point **p, Point **x, Point **y# Point **z, int m, int n, int div_x, int div^y, Point **output { int i, i, dl, d2 ; .Fit u, v, du = 1.0 / div_x, dv = 1.0 / div__y ; int no = 'n-l'*div—у + 1 ; SolveForX1 x, p, m, n ) ; Solv.eForY- y, p, m, n ) ; SclveForZ' x, y, z, m, n ) ; for1, j=l;j<n;j++1) for* i = 1; i < m; i ++ ) v = 0 for; d2 = 0; d2 <= div_y; d2 ++ ) u = G ; for' dl =- 0; dl <= div_x; dl ++ ) ' { hermite_3_3{ p, x, y, z, n, u, v, i, j, pp ( output,. (i-l)-*div_x + dl, i j -1 j *div^y + d2 , no ;■ ) ; u += du ; 213
Сплайны v += dv Приведем пример использования функции для построения сплайн-поверхности. ^ #include "lib.h" /* списание вызываемой функции */ void hermite_sur.f асе i' Point **р, Point **х, Point **у, Point **z, int m, int n,int div_x, int div^y. Point **output ') ; /* число точек в опорном.графе */ # define M ■:. 5) #define DIV E") ' • /* число точек в аппроксимирующем графе */ #define N ( ■:.Н-1,; *0Г7+Г» ' • /* инициализация спорного графа */ . Point р[ М ][ М ] ; Point pll = { .25, 1, -.25 } Point p40 = { 1.0, -.5, 0.0 } Point pO4 = ■{ 0.0, 2, -1.0 } Point p33 = { .75, 2, -.75 } Point x[ M ][ M ] ; Point у[ M ][ M ] ; Point z[ M ][ M ] ; /* впомогательнные переменные */ Point tt = { 0, 0, 0 } ; Point xx = { 1, 0, 0 } ; Point yy ={0,0,-1}; Point zz = { 0, 0, 0 } ; /* описание выходного массива */ Point oc[ N ][ N ] ; Point EyePcs = { .5, 3, 3 } ; Point LockAt = { .5, 0, -5 } ; Vec Up = { 0, 1, -1 } ; Fit Alpha = .7 ; void main' void :• int i, j ; /* заполнение массива */ • fori i = 0; i < H; i ++ : for ■•■ j = 0; j < M; j ++ ) { ■ ■ • ' tt[ 0 ] = (Fit )i / i «Fit } « M - 1 )) ; tt[ 2 ] = - (Fit ij / «(Fit :• ■:' H - 1 )) VecCopy( tt, p[ i ][ у ] } VecCcpyi pll, p[ 1 ][ 1 ] ) ; VecCcpy: p40, p [ 4 ] [ 0 ] •) ; 214
Сплайновые поверхности VecCopyi pO4, p[ 0 ] [ 4 ] ) ; VecCopy( рЗЗ, p[ 3 ][ 3 ] ) ; for( j = 0; j < M; j ++ ) VecCopyi xx, x[ 0 ] [ j ] ) ; VecCopy ( xx, x[ M-l ] [ j ] )■ ; for(.\i = 0; i < M; i ++ ) ■ VecCopyС у[ i ][ . 0 ], yy ) ; VecCcpy( y[ i ][ M-l ], yy ) ; VecCopy( zz, z[ 0 ] [ 0 ] ) VecCopyi zz, z[ 0 ][ M-l ] ) VecCopy( zz, z[ M-l ][ 0 ] ) VecCopy( zz, z[ M-l ][ M-l ] ) /* вычисление значений сплайна */ hermite_surfасе((Point **)p, 'Point **)x, •Point **)y, (Point **)z, M, M, DIV, DIV, (Poirxt **)оо ) /* инициализащ-Lq графической моды */ SetVideoMcdef ) ; /* инициализация трехмерной'графики */ Init3D('EyePos, LookAt, Up, Alpha ) ; /* отображение на дисплее построенного сплайна */ PlotSurface! (Point **)oo, N, N, 1 ) ; ' Текст программы hemiite_surface находится в файле hermite.c в поддиректории SURPACES на дискете, которую можно приобрести в издательстве "Диалог-МИФИ". Подробную информацию об именах файлов из этой директории и их содержании можно найти в файле readme.txt из директории SPLINES этой дискеты и в приложении В нашей книги. 215
Сплайны 4.5.3. Составные неявно заданные кубические поверхности В последнее время появилось значительное число работ, посвящен- посвященных построению составных поверхностей, элементарные фрагменты которых описываются неявными алгебраическими уравнениями вида F(xr У у Z) = 0, где F(x, y> z) - алгебраический многочлен 2-й или 3-й степени. Интерес к таким поверхностям связан с их активным ис- использованием в задачах компьютерной графики. Дело в том, что ука- указанный способ задания оказывается очень удобным при построении реалистических изображений сложных сцен методом трассировки лу- лучей. Задача построения составных поверхностей указанного типа весь- весьма интересна, но совсем не проста. Не имея возможности останавли- останавливаться на этом подробно, мы отсылаем читателя к специальной лите- литературе (несколько последних журнальных публикаций указано в кон- конце книги). 216
Приложение А. Программы метода прогонки для трёх-и пятидиагональных матриц subroutine РгодопЗ (a,b,c,d,u,v,w,s,t,х,п) с*********************************************************** с Программа РгодопЗ решает систему линейных * 'С уравмений вида * с ■ • * с аA)*хA) ■+ ЬA)*хB) + сA)*х(п) * d(l) ■ . . * с * с .c(i)*x(i-l) +'a(i)*x(i) + b(i)*x(i+l) * dU) * с * с ' b(n)-*x(l) ■+ а(п)*х(п-1) + b(n)*x(n)= d(n) * с с трехдиагональнои матрицей методом прогонки * с п - число уравнений . . ' ■ * с а,Ь, * с c,d,~ массивы (длины п), содержащие элементы диагоналей * с х матрицы и правых частей * С W, S , t, • . ' , * с u,v - рабочие' массивы (длины п+1) . * с Результат: * с х - массив (длины п), содержащий решение системы * с • - '■ ' ■ ■ ■ ' * ■ dimension a(l),b(l),c(l),d(l),u(l), * v,U),xU),w(l),s(l),t(l) с u(l) = 0. v(l) = 0. • w(l) = 1. 'С ' do i = l,n il = i + 1 z = l./ia(i) + c(i)*v(i)) viilj = -b(i)*z u(il) = (-e(i)*ii(i) + d(i))*z ... • w(il) = - c(i)*w(i)*z ■ enddo с ' •' S { П ) = 1 . * t(n) * 0. do i = n-1,1, -1 s<i) = v(i+l)*s(i+l) + w(i+l) t(i) - v(l + lj'*t(i + l) + u(i + l) ; enddo с ' • xin) = (din) - b(n)*t(l) - c(n) *t.(n-l))/ * • (a(n) + b(n)*s'(l) + -c(n) *s(n-l) ) do i = 1, n-1 x(i) = s(i)*x(n) ♦ t(i) enddo с , ., ■ ' return end 218
Приложение А Программы метода прогонки для трёх- и пяти- диагональных матриц subroutine Progon5(n,a,b,c,d,e,g,u,v,w, ' * ■' p,q,r,s,t,aa,dd,z) С ' , . с*********************************************************** с Программа. Progon5 решает линейную систему с уравнений вида с + ' + + + + + Ы . cl 0 .. а2 Ь2 с2 0 d3 аЗ ЬЗ сЗ е4 d4 а4 Ь4 0 О 0 ... с4 el О О dl е2 О О О en dn an !zl !z2 !,z3 !z4 zn !g2! !g3! =! g4! с jal с |d2 с |еЗ с \О с ! с j с }bn en с - + , + + + + с с пятидиагональной матрицей методом прогонки с п - число уравнений с a,b,c,d,e - массивы (длины П), содержащие элементы с диагоналей матрицы с g - массив (длины nV, содержащий элементы правых частей * с, уравнений * с u,v,w,P,q, с r,s,t,aa,dd - рабочие массивы (длины п+2 ;• с • с * * * * * * * * * * * * * * * Результат: с z - массив (длины п; , содержащий решение системы * * * * * с .,-'• * с************************************ * ********************** с • real аA) ,b(l) ,c(l) ,d(-l) ,e(l). ,g(l) ,u(l) ,аач1) ,г A) real, v A) , w A) , p A) , q A> , t Aj , s A) , z A) , dd A j с • v \ 1) = 0 . ' - l ■ . vB) = 0.' v; A) = 0 / ... wB) = 0. ■ u i 1) = 0. ' j uB.) =0. ' dd(i) = d(i) aa(i) = 'a(i) + dd (i) *vi'i +e (i i *wi.i) - e (i) *ui i /aa(i) /aa (.i V enddo /aati) с p A) = 0 .■ . q i2 ) ~ 0 . pi2) = 1. q(l) = 1. do i = l,n p'i + 2) = -(ddii1! *p(i + q(i + 2) = -<.dd(i)*q(i + enddo ^ t(n-l) =0. s(n-l)" =0. tin) = 0. *p< i) ) /aa i i *q(i ) )/(i 219
Сплайны r(n) =0. . r(n-l) = 1. s(n) = 1. .. , . do i = n-2,1,-1 t(i) = v(i + 2)*t(i + l) +w(i + 2)'*t(i+2)- •+ u(i + 2) s(i) = v(i + 2)*s(i + l) +w(i+2)*s-(i+2) + p-(i + 2) r(i) = v(i + 2.)*r(i + l) +w(i+2)*r(i+2) + q(i + 2) enddo all'ч 1. - q(n+l) - w(n+l)*r(l) al2 = -(p(n+l) + v(n+l) + w(n+lj*s(l)) a21 = - (v(n+2) *r(l) + w(n+2)*r.B) + q(n+2)) a22 = 1. - p(n+2) - y(n+2)*s(l) - w(n+2)*sB) bl = v;(n+lo *t A) + u(n+l) b2 = vin+2.!*t(l) + w(n+2)*tB) + u(n+2) zi'n-1) = ( bl-*a22 - Ь2*а12)/(а11*а22-а12*а21) ' zinj = (>bl*a21 + Ь2*а11)/(а11*а22-а12*а21) do i = 1,n-2 z(i) = t(i) + s(i)*z(n) •+■ r(i)*z(nrl) enddc . ' return end 220
Приложение Б. Библиотеки текстов на языке С / ***************************************************************** COMMON.H ■ ********** * * ***************************** * * **********************/ typedef double Fit ; typedef Fit Vec[3] ; . typedef Fit Point[3] ; /* Макросы для операций с векторами */ /* длина вектора */ #define VecLeni. V ) (sqrti sqr<'V[0] ) + sqr(V[l]') +-sqr',V[2] • )) /* скалярное произведение */ #define VecDot ( VI, V2 ) СV1.[G] *V2 [0] + V1[.1]*V2[1] + V1[2]*V2[2]) /* С = t * A + В */ . ' ^define VecAddS(t,А,В,С> { C[0] -= A[0]*t+B[0]; C[1] = A[l]*t+B[l]; C[2] = A[2]*t + B[2]; } ■ ' • .. • /* С = t * A ■*/ ■ ■ - ^define VecMul ( A, t, С > { C[0] = A[0] * t; C[l] ,= A[l] * t; Z[2] = A[2] * t; } ■ ■ ■ /* нормирование вектора */ # define VecUnit < V ) { Fit 1 = 1.0 / VecLenC V i ; VecMul'. V, 1 , V. ) ; } ■ ' r /* С = A - В */-.." #define VecSub' А, В, С ) { C[0] = A[C]-B[0]; . С[1] = A[l]-B[l]; C[2] =^A[2]-B[2]; } idefine^VecAdd'. А, В, С > { C[0] = A[0]+B[0]; C[1] = A[l]+B[l]V C[2] = A[2]+B[2];. } ... ' * В = A * ' ' ''■ - ^define VecCopy i A, B. ) { B[u]=A[0]; B[1]=A[1]; B[2]=A[2T; } /* С = a * A + b *' В V #define VecCcmbsa^^b^.C> { C[0] = A[0]*a + B[C]*b; C[1] = A[l]*a + B[l]*b; C[2] = A[2]*a +. B[2]*b; } / * В = A / t * / idefine VecDiv' A, t, В ) { B[0] = A[0] / t; B[l]= A[1J / t; B[2] = A[2] '/. t; } • . " ■ . - /* макросы для доступа к элементам двумерных массивов ; •** р - массив ** i; j - индексы ** . п - вторая размерность массива */ . #define рр( . р, i, j, n ) ((('Point *) pi [ (i) * (n) + (j ) ] ) 221
Сплайны /б**************************************************************** LIB.H л****************************************************************/ #include <math.h> #include "common.h" void DrawPolygon( Fit x[], Fit y[], int n, int color ) ; void Init3D( Point eyepos, Point lockat, Vec up, Fit alpha ) ; . void PlotSurface( Point **p, int m, int n, int color ) ; voi'd SetVideoMode ( void ) ; /********•******•**•************•********************************* LIB. С л****************************************************************/ ** 1.'Инициализировать SetVideoMode() перед первым обращением * * к DrawPolygon ( ) '** 2. Инициализировать SetVideoMode () и Init3D() перед первым ** обращением к PlotSurface() Hindef BORLANDC #include <graph.h> #else #include <alloc.h> #include <graphics.h> #include <stdlib.h> #endif ■ #include "lib.h" #define XMIM #define XI-iAX #define YMIN #define YMAX .0 1.0 0.0 1.0 /* Для моды 640x430 */ , #define SXMIN 0 #define SXMAX 639 #define SYMIN 0 • #define SYMAX 479 Fit dx = XIAAX - XMIN, dy = YMAX - YMIN ; int sdx = SXMAX - SXMIN, sdy = SYMAX - SYMIN ; static Point eyepos static Point F ; static Vec up ; static Vec T ; static Vec n ; static Fit dd ; static Fit D1 ; Fit sqr( Fit t ) { return t*t ; } /* Векторное произведение: С = A x В */ void Cross-product ( Vec A, Vec B, Vec С ) /* точка наблюдения */ /* левый нижний угол экрана */ 222
Приложение Б Библиотеки текстов на языке С С[0] = А[1]*В[2] - А[2]*В[1] С[1] = А[2]*В[0] - А[0]*В[2] С[2] = А[0]*В[1] - А[1]*ВЮ] /* преобразование к экранным координатам */ int MakeXf Fit x ) { ' return ( SXMIN + (sdx * .«x - XMINi)/dx ) ; ■} int MakeY( Fit у ) { ' return SYMAX - { SYMIN + ■: sdy * iy - YMIN) )/dy ) ; /*- ** Инициализация всех трехмерных переменных и функций * i void Init3D( Point ep, Point lockat, Vec Up, Fit alpha ) Vec AB ;■ • Point Dl ; VecCopy i ep, eyepcs > ; ' Vec Copy •:. Up, up ) ; VecSub'. lcokat, ep, AB ;> ; dd = VecLeru AB ") * tan( alpha i ; VecAddSi -dd, up, lockat, Dl ) ; CrossPrcduct( AB, up, T ) ; VecUriitC T ) ; VecAddSi. -dd, T, Dl, F ; ; CrossPrcduct'' T, up, n ':• ; D = -VecDoti n, lookat • ; /* Проекция точки р на экран; */ /* 'X, у) - экранные Координаты точки void Project' Point p, Fit *x, Fit *y Vec PA, FP ; Fit tl ; Vec Sub', p, eyepcs, PA ; ; tl = - • VecDoti n, eyepcs :• + D'; / Vec Dot ■ .n, PA VecAddSi tl, PA, eyepos, FP ; ; VecSubi. FP, F, FP ) ; *x = .5 * VecDof FP, T ■ / dd ; . *y = .5 * Vec Dot •. FP, up ■ / dd ; • ** Рисовать поверхность, определенную массивом р (.размерности п на m) ** цветом "color" • Void PlotSurfacei Point **p, int m, int n, int color ! Fit *x - vFlt *)malice ( sizeofi Fit ) * -m ) ; . .. Fit *y = (Fit *)mal.loc( sizeofi Fit ) * m ) '; 223
Сплайны int i, j ; for( j = n-1; j >= 0; j -- ) { , for( l = 0; i < m; i ++ ) Project( pp( p, i, j , n), &x[ i ], &y [ i ] ) ; .DrawPclygon( x, y, m, color ) ; } free( x ) ; free ( у ) ; ** Рисовать ломаную, определенную массивами х[] и у[] (размерности п) ** цветом "color" void DrawPolygon ( Fit x[], Fit y[], int n, int color ) int i '; #ifndef BORLANDC _setcolori color ) ; „rncveto ( MakeX ( x [ 0 ] • , MakeY ( у [ 0 ] ) ) ; for с i=l;i<n;i++) _linetc: MakeX' x[i] .•,MakeY ( y[i] ) ) ; setcolcr ■: color ':• ; ■movetof. MakeX'' x[0] >., MakeY ( y[0] ) fori i=l;i<n;i++) linetoi MakeXC x[i] ),MakeY( y[i] ) ) ; #endif ** Инициализация графической моды-: 640 x 4 80 , 16 цветов void SetVidecMcde ■:' void ':- { #ifndef BCRLANDC _set vide сто de ■: _VR ESI 6 COLOR ) ; #else int grDriver, grMcde; grDriver = VGA; grMcde = VGAHI; initgraph •, SgrDriver, &grMode, "" ) ; .■ != grOk ) if ■; graphresult exit •, 1 ; ; #endif 224
Приложение В. Описание дискеты Описание дискеты "Руководство для пользователей по сплайнам" Программы на Фортране и С: для построения интерполяционного кубического сплайна одной пере- переменной, построения сглаживающего кубического сплайна одной перемен- переменной, построения интерполяционного бикубического сплайна двух пе- переменных, построения сглаживающего бикубического сплайна двух перемен- переменных, построения кубических кривых Безье, построения В-сплайновых кривых, построения Бета-сплайновых кривых, построения кубических кривых Эрмита, построения Catmull-Rom кривых, построения бикубических поверхностей Безье, построения бикубических В-сплайновых поверхностей, построения Бета-сплайновых поверхностей, построения бикубических эрмитовых поверхностей. Для каждой программы приведены один или несколько примеров ее использования. Для использования приведенных здесь программ необходимы: • IBM PC XT/AT или совместимый с ним компьютер, • цветной или хмонохромный EGA/VGA монитор. Программы могут размещаться на дискете 5.25м. Дополнительная память или сопроцессор не требуются. Список файлов на дискете \SPLINES\readme.t*t APPENDIX\progon3.for progon5.for \FUNCTION\ONEVARIA\INTERPOL\spiine.for 225
Сплайны exmpli.for exmpO.for exmpl3.for exmpH.for resl.dat res2.dat res3.dat res4.dat \SMOOTH\smspiine.for exmpli.for exmpO.for exmpB.for resl.dat res2.dat res3.dat inputl.dat input2.dat input3.dat \TWOVARlA\INTERPOL\splint2.for exmpli.for exmpi2.for exmpB.for exmpl4.for resl.dat res2.dat res3.dat res4.dat \SMOOTH\smspi2.for exmpll.for exmpO.for exmpB.for resl.dat res2.dat res3.dat \SPLINES\GEOMETRY\CURVES\BETA\beta.c test.c test.doc \BEZIER\bezier.c test.c test.doc \BSPLINE\bspline.c 226
Приложение В Описание дискеты test.c test.doc \CATMULL\catmuli.c test.c test.doc \HERMITE\hermite.c test.c test.doc \NURBS\nurbs.c test.c test.doc \global.doc \FINDCl\findcl.c \LIB\comon.h \lib.c \iib.h \SURFACES\BETA\beta.c test.c test.doc \BEZIER\bezier.c test.c test.doc \HERMITE\hermite.c test.c test.doc \NURBS\nurbs.c test.c test.doc \global.doc Описание файлов 1. Файлы lib.hr lib.c. common.hT test.c, test.doc Файл lib.h содержит описание вспомогательных функций: DrawPolygon() - отображение многоугольника на экране, Init3D() - инициализация параметров и массивов, требуемых для трехмерной графики, PlotSurface() - отображение на экране поверхности по заданному двумерному массиву, 227
Сплайны Set Video Mode () - инициализация графической моды с разрешени- разрешением 640 на 480 и с 16 цветами. Файл lib.c содержит описание внутренних процедур для всех вспомогательных функций из файла lib.h. С компиляторами Microsoft С или BORLAND С этот файл можно использовать не внося в него никаких изменений. При использование других компиляторов воз- возможно потребуется модификация этого файла. В файле common.h определены все необходимые типы данных, макросы для для работы с векторами и двумерными массивами. Каждый файл test.c предназначен для запуска примера, демонст- демонстрирующего построение сплайна того или иного типа (см. ниже разд. 2). В файлах test.doc описаны правила обращения к программам по- построения сплайнов и приведены соответствующие примеры. 2. Файлы с программами построения сплайнов. Директория FUNCTION Все файлы вида *.for содержат исходные тексты программ на Фортране и могут компилироваться как в системе Microsoft Fortran 5.1, так и в Microsoft Fortran Power Station. Файл spline.for (из поддиректории ONEVARIA\INTERPOL) со- содержит исходный текст программы Spline для построения интерполя- интерполяционного кубического сплайна. Файл exmpll.for содержит головную программу, иллюстрирующую применение программы Spline для построения интерполяционного ку- кубического сплайна, удовлетворяющего граничным условиям 1-го типа. Результаты вычислений находятся в файле resl.dat. Файл exmpl2.for содержит головную программу, иллюстрирующую применение программы Spline для построения интерполяционного ку- кубического сплайна, удовлетворяющего граничным условиям 2-го типа. Результаты вычислений находятся в файле res2.dat. Файл exmpB.for содержит головную программу, иллюстрирующую применение программы Spline для построения интерполяционного ку- кубического сплайна, удовлетворяющего граничным условиям 3-го типа. Результаты вычислений находятся в файле res3.dat. Файл exmpH.for содержит головную программу, иллюстрирующую применение программы Spline для построения интерполяционного ку- кубического сплайна, удовлетворяющего граничным условиям 4-го типа. Результаты вычислений находятся в файле res4.dat. 228
Приложение В Описание дискеты Файл smspline.for (из поддиректории ONEVARIA\SMOOTH) со- содержит исходный текст программы Smsplirie ддя построения сглажи- сглаживающего кубического сплайна. Файл exmpll.for содержит головную программу, иллюстрирующую применение программы Smspline для построения сглаживающего ку- кубического сплайна, удовлетворяющего граничным условиям 1-го типа. Исходные данные для этого примера размещены в файле inputl.dat. Результаты вычислений находятся в файле resl.dat. Файл exmpO.for содержит головную программу, иллюстрирующую применение программы Smspline для построения сглаживающего ку- кубического сплайна, удовлетворяющего граничным условиям 2-го типа. Исходные данные для этого примера размещены в файле input2.dat. Результаты вычислений находятся в файле res2.dat. Файл exmpB.for содержит головную программу, иллюстрирующую применение программы Smspline ддя построения сглаживающего ку- кубического сплайна, удовлетворяющего граничным условиям 3-го типа. Исходные 'данные для этого примера размещены в файле input3.dat. Результаты вычислений находятся в файле res3.dat. Файл splint2.for (из поддиректории TWOVARIA\INTERPOL) со- содержит исходный текст программы Splint2 ддя построения интерполя- интерполяционного бикубического сплайна. Файл exmpll.for содержит головную программу, иллюстрирующую применение программы Splint2 ддя построения интерполяционного бикубического сплайна, удовлетворяющего граничным условиям 1-го типа. Результаты вычислений находятся в файле resl.dat. Файл exmpl2.for содержит головную программу, иллюстрирующую применение программы Splint2 ддя построения интерполяционного бикубического сплайна, удовлетворяющего граничным условиям 2-го типа. Результаты вычислений находятся в файле res2.dat. Файл exmpB.for содержит головную программу, иллюстрирующую применение программы Splint2 ддя построения интерполяционного бикубического сплайна, удовлетворяющего граничным условиям 3-го типа. Результаты вычислений находятся в файле res3.dat. Файл exmpM.for содержит головную программу, иллюстрирующую применение программы Splint2 для построения интерполяционного бикубического сплайна, удовлетворяющего граничным условиям 4-го типа. Результаты вычислений находятся в файле res4.dat. 229
Сплайны Файл smspi2.for (из поддиректории TWOVARIA\SMOOTH) содер- содержит исходный текст программы Smspi2 для построения сглаживающе- сглаживающего бикубического сплайна. Файл exmpll.for содержит головную программу, иллюстрирующую применение программы Smspi2 для построения сглаживающего бику- бикубического сплайна, удовлетворяющего граничным условиям 1-го типа. Результаты вычислений находятся в файле resl.dat. Файл exmpi2.for содержит головную программу, иллюстрирующую применение программы Smspi2 для построения сглаживающего бику- бикубического сплайна, удовлетворяющего граничным условиям 2-го типа. Результаты вычислений находятся в файле res2.dat. Файл exmpB.for содержит головную программу, иллюстрирующую применение программы Smspi2 для построения сглаживающего бику- бикубического сплайна, удовлетворяющего граничным условиям 3-го типа. Результаты вычислений находятся в файле res3.dat. 3. Файлы с программами построения сплайнов. Директория GEOMETRY Файл beta.c (из поддиректории CURVES\BETA) содержит про- программу на языке С для построения Бета-сплайновой кривой по задан- заданному двумерному массиву. Файл beta.c (из поддиректории SURFACE\BETA) содержит про- программу на языке С для построения Бета-сплайновой поверхности по заданному трехмерному массиву 3D data set. Файл bezier.c (из поддиректории CURVES\BEZIER) содержит программу на языке С для построения кубической кривой Безье по заданному двумерному массиву. Файл bezier.c (из поддиректории SURFACES\BEZIER) содержит программу на языке С для построения бикубической поверхности Бе- Безье по заданному трехмерному массиву. Файл bspiine.c (из поддиректории CURVES\BSPLINE) содержит программу, на языке С для построения кубической В-сплайновой кри- кривой по заданному двумерному массиву. Файл bspiine.c (из поддиректории SURFACES\BSPLINE) содер- содержит программу на языке С для построения бикубической В-сплайно- В-сплайновой поверхности по заданному трехмерному массиву. Файл catmull.c (из поддиректории CURVES\CATMULL) содержит программу на языке С для построения Catmull-Rom кривой по задан- заданному двумерному массиву. 230
Приложение В Описание дискеты Файл hermite.c (из поддиректории CURVES\HERMITE) содержит программу на языке С для построения кубической эрмитовой кривой по заданному двумерному массиву. Файл hermite.c (из поддиректории SURFACES\HERMITE) содер- содержит программу на языке С для построения бикубической эрмитовой поверхности по заданному трехмерному массиву. Файл nurbs.c (из поддиректории CURVES\NURBS) содержит про- программу на языке С для построения неоднородной рациональной ку- кубической В-сплайновой кривой по заданному двумерному массиву. Файл nurbs.c (из поддиректории SURFACES\NURBS) содержит программу на языке С для построения неоднородной рациональной бикубической В-сплайновой поверхности по заданному трехмерному массиву. Файл global.doc (из поддиректорий CURVES и SURFACES) со- содержит общую информацию о представленных сплайнах. Файл findcl.doc (из поддиректории FINDC1}) содержит програм- программу на языке С для построения С7-гладкой составной трехмерной ку- кубической кривой Безье. Файл progon3.for (из поддиректории APPENDIX) содержит про- программу на Фортране для решения системы линейных уравнений с трехдиагональной матрицей методом прогонки. Файл progonS.for (из поддиректории APPENDIX) содержит про- программу на Фортране для решения системы линейных уравнений с пя- тидиагональной матрицей методом прогонки. Файл readme.txt содержит описание приложенной дискеты. 231
ЛИТЕРАТУРА Классические работы Weierstrass К., Sitzungsber. Acad. Berlin 1885 S.633—639, 789—805. Runge С. Ueber empirishe Funktionen und die Interpolation zwischen aequidistanten Ordinaten. ZAMM. 46:224 — 243, 1901. Bernstein S. Demonstration du theoreme de Weierstrass Tondee sur le calcul des probabilites. Harkov Soobs. Matem. ob-va, 13:1 — 2, 1912. Теоретические работы по сплайнам Альберг Дж., Нилсон Э., Уолш Дж. Теория сплайнов и их приложения. М.: Наука, 1972 (Ahiberg J., Niison E., Walsh J. The theory of splines and their applications. Academic Press. 1967). Стечкин С. Б., Субботин Ю. Н. Сплайны в вычислительной математике. М.: Наука, 1976. Завьялов Ю. С, Квасов Б. И., Мирошниченко В. Л. Методы сплайн-функций. М.: Наука, 1980. Сплайны в компьтерной графике Barsky В. Computer Graphics and Geometric Modeling using Beta- splines. Springer Verlag. 1988. Bartles R., Beatty J., Barsky B. An introduction to splines for use in computer graphics and geometric modeling. Morgan Kaufmann. 1987. Farm G. Curves and surfaces for computer aided geometric design. A practical guide. Academic Press. 1990. Foley J. D., van Dam A., Feiner S. K., Hugues J. F. Computer graphics. Principles and practice. Addison-Wesley Pub. Com. 1991. 232
Сплайны Сплайны и проектирование Фокс Ф., Пратт М. Вычислительная геометрия. Применение в проектировании и на производстве. М.: Мир, 1982 (Faux I. D., Pratt М. J. Computational geometry for design and manufacture. Ellis Horwood. 1979). Mathematique et CAO (in four volumes). Hermes Publishing 1986, 1987. Завьялов Ю. С, Леус В. А., Скороспелое Б. А. Сплайны в инже- инженерной геометрии. М.: Машиностроение, 1985. Yamaguchi F. Curves and surfaces in computer aided geometric design. Springer Verlag. 1988. Практические руководства Де Бор К. Практическое руководство по сплайнам. М.: Наука, 1983 (de Boor С. A practical guide to splines. Springer, 1978). Недавние публикации по неявным кубическим сплайнам Sederberg T. W. Techniques for cubic algebraic surfaces. IEEE Computer Graphics and Applications, 4 A990), 14—25 Sederberg T. W. Techniques for cubic algebraic surfaces. IEEE Computer Graphics and Applications, 5 A990), 12—21 Bajaj C. L. Surface fitting using implicit algebraic surface partches. In Topics in Surface Modeling. H. Hagen, Ed., SIAM. 1992. Paluszny M., Patterson R. R. A family of tangent continuous cubic algebraic splines. Transactions on Graphics, volume 12, N 3 A993), 209— 232 Dahmen W., Thamm-Schaar T.-M. Cubicoids: modeling and visualization, Computer Aided Geometric Design, 10 A993), 89—108 Guo В., Nonsplitting macro patches for implicit cubic spline surfaces, EUROGRAPHCS'93, volume 12, N 3 A993), C-433 - C-445 233
Сплайны ОГЛАВЛЕНИЕ ПРЕДИСЛОВИЕ 3 О структуре пособия 4 Несколько общих советов пользователю 4 Почему сплайны? 7 ЧАСТЬ I. СПЛАЙН-ФУНКЦИИ 11 ЙНФУНКЦИИ ОДНОЙ ПЕРЕМЕННОЙ ГЛАВА 1. СПЛАЙН-ФУНКЦИИ ОДНОЙ ПЕРЕМЕННОЙ. 12 1.1 Интерполяционные кубические сплайны 13 1.1.1. Постановка задачи интерполяции 13 1.1.2. Определение интерполяционного кубического сплайна. 14 1.1.3. Граничные (краевые) условия 15 1.1.4. Построение интерполяционного кубического сплайна.. 16 1.1.5. Советы пользователю 18 А. Выбор граничных (краевых) условий 18 Б. Выбор узлов интерполяции 19 1.1.6. Выбор интерполяционной функции (плюсы и минусы) ..20 A. Интерполяционный многочлен Лагранжа 20 Б. Кусочно-линейная интерполяция 22 B. Сплайн-интерполяция. 23 1.1.7. Свойства интерполяционного кубического сплайна 25 A. Аппроксимационные свойства кубического сплайна 25 Б. Экстремальное свойство кубического сплайна 25 B. Построение интерполяционных онлайновых кривых при помощи сплайн-функций 26 1.1.8. Программная реализация 28 1.2. Сглаживающие кубические сплайны 36 1.2.1. О постановке задачи сглаживания 36 1.2.2. Определение сглаживающего кубического сплайна 37 1.2.3. Граничные (краевые) условия 37 1.2.4. Построение сглаживающего кубического сплайна 38 1.2.5. Выбор весовых коэффициентов 41 1.2.6. Построение сглаживающих онлайновых кривых при помощи сплайн-функций 42 1.2.7. Программная реализация 43 1.3. Другие сплайны 50 1.3.1. Линейное пространство кубических сплайн-функций 50 1.3.2. Кубические 8-сплайны 50 234
Содержание ГЛАВА 2. СПЛАЙН-ФУНКЦИИ ДВУХ ПЕРЕМЕННЫХ ....53 2.1. Интерполяционные бикубические сплайны 56 2.1.1. Постановка задачи интерполяции 56 2.1.2. Определение интерполяционного бикубического сплайна 56 2.1.3. Граничные (краевые) условия 57 2.1.4. Построение интерполяционного бикубического сплайна59 2.1.5. Свойства интерполяционного бикубического сплайна ..62 А. Аппроксимационное свойство 62 Б. Экстремальное свойство 63 2.1.6. Построение сплайновых поверхностей при помощи сплайн-функций 65 2.1.7. Программная реализация 66 2.2. Сглаживающие бикубические сплайны 75 2.2.1. О постановке задачи сглаживания 75 2.2.2. Определение сглаживающего бикубического сплайна..75 2.2.3. Граничные (краевые) условия 76 2.2.4. Построение сглаживающего бикубического сплайна 78 2.2.5. Построение сплайновых поверхностей при помощи сплайн-функций 79 2.2.6. Программная реализация 81 ЧАСТЬ II. ГЕОМЕТРИЧЕСКИЕ СПЛАЙНЫ 89 ГЛАВА 3. ОНЛАЙНОВЫЕ КРИВЫЕ 90 3.1. Элементарные сведения из дифференциальной геометрии кривых 93 3.1.1. Параметризованные кривые 93 3.1.2. Гладкие и регулярные кривые 93 3.1.3. Замена параметра 94 3.1.4. Трехгранник Френе 95 3.1.5. Кривизна и кручение кривой 96 3.1.6. Плоские кривые 97 А. Параметрическое задание 97 Б. Неявное задание 98 3.1.7. Составные кривые 98 3.1.8. Геометрическая непрерывность 102 3.2. Кривые Безье 104 3.2.1. Параметрические уравнения кривой Безье 104 3.2.2. Свойства кривых Безье 105 3.2.3. Составные кривые Безье 107 3.2.4. Рациональные кривые Безье 110 3.2.5. Программная реализация алгоритма 113 235
Сплайны 3.3. Б-сплайновые кривые 115 3.3.1. Параметрические уравнения элементарной кубической Б-сплайновой кривой 115 3.3.2. Составные кубические Б-сплайновые кривые 116 3.3.3. Кратные и воображаемые вершины 119 A. Двойные вершины , 120 Б. Тройные вершины 120 B. Воображаемые вершины 121 3.3.4. Рациональные кубические Б-сплайновые кривые 123 3.3.5. Форма Безье составных кубических Б-сплайновых кривых 125 3.3.6. Программная реализация алгоритма 126 3.4. Бета-сплайновые кривые 130 3.4.1. Параметрические уравнения элементарной Бета-сплайновой кривой 130 3.4.2. Составные Бета-сплайновые кривые 132 3.4.3. Кратные и воображаемые вершины 135 A. Двойные вершины 135 Б. Тройные вершины 136 B. Воображаемые вершины 136 3.4.4. Программная реализация алгоритма 137 3.5. Другие сплайновые кривые 140 3.5.1*. Интерполяционные кубические кривые Эрмита 140 Программная реализация 144 3.5.2. Сплайновые кривые Catmull-Rom 146 Программная реализация 148 3.5.3. Составные плоские кубические кривые, заданные в неявной форме : 150 ГЛАВА 4 СПЛАЙНОВЫЕ ПОВЕРХНОСТИ ...." 152 4.1. Элементарные сведения из геометрии поверхностей 156 4.1.1. Параметризованные поверхности 156 4.1.2. Гладкие и регулярные поверхности 157 4.1.3. Первая квадратичная форма поверхности 157 4.1.4. Кривая на поверхности 158 4.1.5. Угол между кривыми на поверхности 158 4.1.6. Площадь поверхности 159 4.1.7. Вторая квадратичная форма поверхности 159 4.1.8. Линии кривизны 159 4.1.9. Гауссова и средняя кривизны 160 4.1.10. Геометрическая непрерывность 160 4.1.11. Вектор скручивания и билинейная поверхность 163 236
Содержание 4.2. Поверхности Безье 165 4.2.1. Параметрические уравнения поверхности Безье 165 4.2.2. Свойства элементарных поверхностей Безье 166 4.2.3. Составные поверхности Безье 169 4.2.4. Рациональные поверхности Безье 170 4.2.5. Программная реализация 173 4.3. В-сплайновые поверхности 176 4.3.1. Параметрические уравнения элементарной бикубической Б-сплайновой поверхности 176 4.3.2. Свойства элементарных бикубических 8-сплайновых поверхностей 177 4.3.3. Составные бикубические 8-сплайновые поверхности.. 178 4.3.4. Кратные и воображаемые вершины 181 A. Двойные вершины 181 Б. Тройные вершины 183 B. Воображаемые вершины 185 4.3.5. Рациональные бикубические 8-сплайновые поверхности 186 4.3.6. Программная реализация 187 4.4. В-сплайновые поверхности 191 4.4.1. Параметрические уравнения элементарной Бета-сплайновой поверхности 191 4.4.2. Свойства элементарных Бета-сплайновых поверхностей 193 4.4.3. Составные Бета-сплайновая поверхности 194 4.4.4. Кратные и воображаемые вершины 196 A. Двойные вершины 197 Б. Тройные вершины; *..198 B. Воображаемые вершины 199 4.4.5. Программная реализация 201 4.5. Другие сплаиновые поверхности 204 4.5.1. Интерполяционные бикубические поверхности Эрмита 204 4.5.2. Программная реализация 210 4.5.3. Составные неявно заданные кубические поверхности. 216 ПРИЛОЖЕНИЯ 217 Приложение А. Программы метода прогонки для трёх- и пятидиагональных матриц 218 Приложение Б. Библиотеки текстов на языке С 221 Приложение В. Описание дискеты 225 ЛИТЕРАТУРА 232 237
320-43-77, 320-43-55 факс: 324-30-55 предлагает литературу по программированию и вычислительной технике, расчитапную па широкий круг пользователей персональных компьютеров Ю. А. Кречко, В. В. Полищук КУРС ПРАКТИЧЕСКОЙ РАБОТЫ С СИСТЕМОЙ АВТОКАД 12 Ю. А. Кречко AUTOCAD: программирование и адаптация. В. Н. Пильщиков ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ АССЕМБЛЕРА А. Епанешников, В. Епанешников ПРОГРАММИРОВАНИЕ В СРЕДЕ TURBO PASCAL 7.0. А. Епанешников, В. Епанешников TURBO VISION 2.0. Основы практического использования Е. В. Полковникова, А. В. Полковников ПЛАНИРОВАНИЕ И УПРАВЛЕНИЕ ПРОЕКТОМ С ИСПОЛЬЗОВАНИЕМ TIME LINE Сергей ДУНАЕВ. UNIX SYSTEM V. RELEASE 4.2. (Общее руководство) Е. В. Шикин, А. В. Боресков КОМПЬЮТЕРНАЯ ГРАФИКА. Динамика, реалистические изображе И. Ю. Баженова SQLWINDOWS. SAL - язык разработки приложений баз данных с архитектурой клиент/сервер А. И. Гусева Работа в локальных сетях NETWARE 3.12-4.1 М. Врой ИНФОРМАТИКА. Основополагающее введение. Перевод с нем., в 4-х частях Б. И. Березин, С. Б. Березин НАЧАЛЬНЫЙ КУРС С и C++ Л. Б. Романова, В. Ю. Романов КОМПЬЮТЕРНЫЕ ПРИКЛЮЧЕНИЯ. Для младшего школьного возраста
Из серии: А. В. Фролов, Г. В. Фролов ( 1 щ иблиотека истемного рограммиста Том 11. ОПЕРАЦИОННАЯ СИСТЕМА MICROSOFT WINDOWS 3.1. Введение для программиста. Часть 1 Том 12. ОПЕРАЦИОННАЯ СИСТЕМА MICROSOFT WINDOWS 3.1. Для программиста. Часть 2 Том 13. ОПЕРАЦИОННАЯ СИСТЕМА MICROSOFT WINDOWS 3.1. Для программиста. Часть 3 Том 14. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС GDI В MICROSOFT WINDOWS. Том 15. МУЛЬТИМЕДИА ДЛЯ WINDOWS. Руководство программиста Том 16, МОДЕМЫ И ФАКС-МОДЕМЫ. Программирование для MS-DOS и Windows Том 17. MICROSOFT WINDOWS 3.1 Для программиста. Дополнительные главы Том 18. MS-DOS ДЛЯ ПРО ГРАММ И СТА. Часть 1 Том 19. MS-DOS ДЛЯ ПРОГРАММИСТА.Часть 2 Том 20. ОПЕРАЦИОННАЯ СИСТЕМА IBM OS/2 WARP Том 21, ПРОГРАММИРОВАНИЕ ВИДЕОАДАПТЕРОВ EGA,VGA и SVGA Том 22. ОПЕРАЦИОННАЯ СИСТЕМА WINDOWS 95. Для программиста Том 23. ГЛОБАЛЬНЫЕ СЕТИ КОМПЬЮТЕРОВ. Практическое ведение в Internet, работа E-Mal и WWW П шаг шагом Серия книг для самостоятельно постигающих тайны компьютерного мира. Авторы А. В. Фролов и Г. В. Фролов Том 1. ВВЕДЕНИЕ В MS-DOS, MS Windows, MS Word for Windows. Tom 2. ОПЕРАЦИОННАЯ СИСТЕМА Microsoft Windows. Руководство пользователя Том 3. СЕТИ КОМПЬЮТЕРОВ В ВАШЕМ ОФИСЕ Том 4. ЧТО ВЫ ДОЛЖНЫ ЗНАТЬ О СВОЕМ КОМПЬЮТЕРЕ Том 5. ОСТОРОЖНО: КОМПЬЮТЕРНЫЕ ВИРУСЫ!
320-43-77, 320-43-55 ™(lHUpyem факс: 324-30-55 вЫПуСТПиТПЪ в 1996 году следующие книги И. Ю. Баженова Visual FoxPro 3.0 А. В. Фролов, Г. В. Фролов БСП 24 том. MS VISUAL C++ и MFC. Программирование для Windows 95 и Windows NT. БСП 25 том. ПРОГРАММИРОВАНИЕ ДЛЯ IBM OS/2 WARP (часть первая) Ю. А. Крепко, В. В. Полищук АВТОКАД 13: НОВЫЕ ВОЗМОЖНОСТИ. В 2-х частях Сергей Дунаев Borland-Технологии. InterBase. Paradox for MS-Windows. Delphi Л. Б. Романова, В. Ю. Романов. ПУТЕШЕСТВИЕ РЕБЯТ В КОМПЬЮТЕРНУЮ СКАЗКУ.
Книги издательства "Диалог - МИФИ" можно купить по адресам: Владивосток Салон деловой, профессиональной и образовательной информации "Оферта-Дело". 690002, Океанский пр-т, 104. 25-85-11 Кемерово Магазин "Книжный мир", Советсткий пр-т. 43 Киев > ТОО "ВЕК", тел. @44) 510-93-65, тел./факс 483-29-85. Киоск "Техническая книга", пр. Победы, 37, КПИ, уч. корп. N 7 > ТОО "Над!а - 7 ЛТД". Тел.: @44) 261-92-86, факс: 268-60-27 Краснодар "Краснодарский дом книги", ул. Красная, 43 Минск МНВЦ "КЕЙ". 220040, ул. М. Богдановича, 153, к.609. Тел.: 32-64-16 Москва > "Московский дом книги", ул. Новый Арбат, дом 26. > "Дом технической книги", Ленинский пр-т., дом 40. > ТОО ТД "Библио-глобус", 101861, ул. Мясницкая, 6 > ТОО "КНОРУС". Тел.: 928-17-25, 928-62-69 > АОЗТ "МИДИКС". Т/ф: 955-41-01 > Книжная база из-ва "РИС". Т/ф 313-83-45, 314-31-34, 925-02-10 > ТОО "Принт". Т/ф 909-57-45 > ЗАО "РИДАС". Тел.: @95) 919-62-10, 919-62-11, факс: 919-87-03 > ТОО "ЭНТА" (рассылка по почте), ул. Каргапольская, 17. Тел.: 903-04 Новосибирск ТОО "ГПНТБ - ПОИСК". Тел.: 66-85-67, факс: 66-33-65 Рязань ТОО "Лексикон". Тел.: @912) 72-22-82 ТОО "Книги - 7". Ул. Циолковского, 1/7 Самара ТОО "Чакона", ул. Урицкого, 1. Тел.: (8462) 36-14-87, факс: 32-02-87 Санкт-Петербург > ТОО "Диалект ". Тел.: (812) 534-45-78, факс (812) 535-56-83 > "Дом книги", 191186, Невский пр-т, 28 отдел Книга-почтой Сургут АОЗТ "Скейлинг - Сургут". Т/ф C462) 77-83-51 Челябинск ЧРЦ высшей школы, пр-т Ленина, 87, тел.: C512) 65-49-77, 65-59-53. Приглашаем распространителей по регионам