Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
M_П_Л_С205_234.doc
Скачиваний:
2
Добавлен:
24.04.2019
Размер:
230.91 Кб
Скачать

I.Функции, строящие в векторном виде кривые Безье

  1. Функция построения плоской кривой Безье (в виде ломаной линии) и отладочная функция

(defun bezie_2d (m n pt) ; функция пострения 2-мерной

; кривой Безье (ломаная включает n точек) по (m+1)

; характеристической точке (координаты – в списке pt)

; Начальные присваивания

213

(setq ptp (nth 0 pt) jj 0 pp (- n 1) pp (/ 1 (float pp)))

; Цикл по параметру кривой р

(repeat (- n 2) (progn

; Вычисление текущего значения параметра р

(setq jj (+ jj 1) p ( * jj pp ) )

; Извлечение координат начальной точки Р0 и засылка их в переменные х,y

(setq ptt (nth 0 pt) x (nth 0 ptt) y (nth 1 ptt))

; Вычисление полинома Бернштейна В(m,p,0) (при i=0)

(setq i 0 b (expt ( - 1 p) m))

; Вычисление первых слагаемых в многочленах Безье по x,y ; (при i=0)

(setq bzx (* x b) bzy (* y b))

; Вычисление последующих слагаемых в многочленах Безье ; по x,y (при i>0)

(repeat m (progn (setq i (+ i 1))

; Пересчет величины полинома Бернштейна B(m,p,i) по

; значению B(m,p,i-1)

(setq b (/ (* b (- (+ m 1 ) i ) p) (- 1 p ) i ))

; Извлечение коорд-т текущей точки Рi засылка их в х,y

(setq ptt (nth i pt) x (nth 0 ptt) y (nth 1 ptt) x (* x b) y (* y b))

; Прибавление текущих слагаемых к многочленам Безье по

; x,y (при текущем i)

(setq bzx (+ x bzx) bzy (+ y bzy))

)) ;Формирование координат точки, соответствующей

; данному значению р

(setq pt3 (list bzx bzy ))

; Вычерчивание очередного участка кривой Безье

(command "pline" ptp pt3 ptp "c") (setq ptp pt3)

)) (setq pt3 (nth m pt))

; Вычерчивание последнего участка кривой Безье

(command "line" ptp pt3 ptp "c") )

214

(defun c:o ()

; Отладочная функция

(setq m ( getint "Введите число характеристических точек,уменьшенное на 1 (величину m-1):"))

(setq n ( getint "Введите число n точек на ломаной, заменяющей кривую Безье: "))

; Формирование списка координат характеристических

; точек sp

(setq j (+ m 2)) (repeat (+ m 1) (progn

(setq j (- j 1) ptj (getpoint “Введите очередную характеристическую точку”) pt (cons ptj pt))

)) (bezie_2d m n pt) )

  1. Функция создания пространственной кривой Безье (в виде ломаной линии) и вычерчивания её проекции на плоскость z=0 . Отладочная функция

(defun bezie_3d (m n pt); ф-ция построения 3-мерной кривой

; Безье (в виде ломаной, включающей n точек) по (m+1)

; характеристической точке (список pt).Точки ломаной

; задаются в списке spt

; Начальные присваивания

(setq ptp (nth 0 pt) spt (cons ptp spt) jj 0 pp (/ 1. (- n 1)))

; Цикл по параметру р

(repeat (- n 2) (progn

; Вычисление текущего значения параметра р

(setq jj (+ jj 1) p ( * jj pp ) )

; Извлечение коорд-т начальной точки Р0 засылка их в х,y,z

(setq ptt (nth 0 pt) x (nth 0 ptt) y (nth 1 ptt) z (nth 2 ptt))

; Вычисление полинома Бернштейна В(m,p,0) (при i=0)

(setq i 0 b (expt ( - 1 p) m))

; Вычисление первых слагаемых в многочленах Безье по

; x,y,z (при i=0)

(setq bzx (* x b) bzy (* y b) bzz (* z b))

215

; Вычисление последующих слагаемых в многочленах Безье

; по x,y,z (при i>0)

(repeat m (progn (setq i (+ i 1))

; Пересчет величины полинома Бернштейна B(m,p,i) по

; значению B(m,p,i-1)

(setq b (/ (* b (- (+ m 1 ) i ) p) (- 1 p ) i ))

; Извлечение коорд-т текущей точки Рi засылка их в х,y,z

(setq ptt (nth i pt) x (* (nth 0 ptt) b) y (* (nth 1 ptt) b) z (* (nth 2 ptt) b))

; Прибавление текущих слагаемых к многочленам Безье по

; x,y,z (при текущем i)

(setq bzx (+ x bzx) bzy (+ y bzy) bzz (+ z bzz))

));Формирование координат точки, соответствующей

; данному значению р

(setq pt3 (list bzx bzy bzz) spt (cons pt3 spt))

; Вычерчивание очередного участка проекции ломаной на

; плоскость z=0

(command "line" ptp pt3 "") (setq ptp pt3) ))

; Вычерчивание очередного участка проекции ломаной на

; плоскость z=0

(setq pt3 (nth m pt)) (command "line" ptp pt3 "") (setq spt (cons pt3 spt))

)

(defun c:o ()

; Отладочная функция для случая 3 характеристических

; точек

(setq m 3 mk(getint "Введите число точек на линиях уровня по параметру: "))

(setq p0 (list 10 10 0) p1 (list 50 140 0) p2 (list 20 290 0) p0v (list p0 p1 p2))

(bezie_3d (- m 1) mk p0v) )

  1. Построение проекций на плоскость z=0 линий уровня поверхности Безье

216

(defun BEZP (m n mk nk pt3d);функция построения линий

; уровня поверхности Безье m,n - числа рядов характких

; точек по 1-й и 2-й переменным (u,v) mk,nk - числа точек на

; линиях уровня по 1-й и 2-й переменным (u,v)

; рt3d - список из координат характеристических точек

; координаты точек на линиях уровня по u - в списке splu

; координаты точек на линиях уровня по v - в списке splv

(setq du (/ 1. (- m 1)) dv (/ 1. (- n 1)) duk (/ 1. (- mk 1)) dvk (/ 1. (- nk 1)))

; I.Постр.линий уровня по параметру u. число линий=nk.

; Значение v фиксируется

(setq v 0); цикл по линиям уровня. Текущие координаты

; точек линий - в списке spt1

(repeat nk (progn; начальное обнуление списка spt1

(repeat mk (setq spt1 (cons (list 0 0 0) spt1)) ) ; начальное

; значение полинома Бернштейна по v

(setq bb (expt (- 1 v) (- m 1)))

; Цикл по характеристическим значениям v

(setq j 0) (repeat n (progn

; Считывание строки j списка рt3d в список stu

(setq stu (nth j pt3d))

; Построение ломаной по 3-мерной кривой Безье по строке j

; списка рt3d (координаты точек кривой - в списке spt)

(bezie_3d_c (- m 1) mk stu)

; Прибавление координат точек на кривой Безье(c весом bb)

; к текущим координатам точек линий ;уровня

(setq i (- mk 1)) (repeat mk (progn

(setq t (nth i spt) t1 (nth i spt1))

(setq x (* bb (nth 0 t)) y (* bb (nth 1 t)) z (* bb (nth 2 t)) x1 (nth 0 t1) y1 (nth 1 t1) z1 (nth 2 t1))

(setq t (list (+ x x1) (+ y y1) (+ z z1)) spt2 (cons t spt2) i (- i 1))

)) (setq spt1 spt2 j (+ j 1))

; Пересчет величины полинома Бернштейна по

; предыдущему значению

217

(if (> (abs (- v 1)) 0.0000000001) (setq bb(/ (* bb (- n j) v) (- 1 v) j))

(if (= j (- n 1)) (setq bb 1.) (setq bb 0.) )) ))

(setq splu (cons spt1 splu) v (+ v dvk)) ))

; Вывод на печать проекций линий уровня по u на пл-ть z=0

(setq i 0) (repeat mk (progn

(setq spt1 (nth i splu) j 0)

(repeat (- nk 1) (progn

(command "line" (nth j spt1) (nth (+ j 1) spt1) "") (setq j (+ j 1))

)) (setq i (+ i 1)) ))

; II.Построение линий уровня по параметру v. число линий

; = mk. Значение u фиксируется

(setq u 0)

; Цикл по линиям уровня. Текущие координаты точек линий

; - в списке spt1

(repeat mk (progn ;начальное обнуление списка spt1

(repeat nk (setq spt1 (cons (list 0 0 0) spt1)) ) ; начальное

; значение полинома Бернштейна по u

(setq bb (expt (- 1 u) (- n 1)))

; Цикл по характеристическим значениям u

(setq j 0) (repeat m (progn

; Считывание столбца j списка рt3d в список stv

(setq jj n) (repeat n (progn

(setq jj (- jj 1)) (setq stvv (nth jj pt3d) elem(nth j stvv)) (setq stv (cons elem stv))

))

; Построение пространственной кривой Безье по столбцу j

; списка рt3d (координаты точек ;кривой-в списке spt)

(bezie_3d_c (- n 1) nk stv)

; Прибавление координат точек на кривой Безье(c весом bb)

; к текущим координатам точек линий ;уровня

(setq i (- nk 1)) (repeat nk (progn

(setq t (nth i spt) t1 (nth i spt1) x (* bb (nth 0 t)) y (* bb (nth

218

1 t)) z (* bb (nth 2 t)))

(setq x1 (nth 0 t1) y1 (nth 1 t1) z1 (nth 2 t1) t (list (+ x x1) (+ y y1) (+ z z1)))

(setq spt2 (cons t spt2) i (- i 1))

)) (setq spt1 spt2 j (+ j 1))

; Пересчет величины полинома Бернштейна по

; предыдущему значению

(if (> (abs (- u 1)) 0.0000000001) (setq bb(/ (* bb (- m j) u) (- 1 u) j))

(if (= j (- m 1)) (setq bb 1.) (setq bb 0.) )) ))

(setq splv (cons spt1 splv) u (+ u duk)) ))

; Вывод на печать проекций линий уровня по v на пл-ть z=0

(setq i 0) (repeat nk (progn

(setq spt1 (nth i splv) j 0)

(repeat (- mk 1) (progn

(command "line" (nth j spt1) (nth (+ j 1) spt1) "") (setq j (+ j 1))

)) (setq i (+ i 1)) ))

)

(defun c:o ();отладочная функция для случая m=3, n=3

(setq m 3 n 3 mk (getint "Введите число точек на кр Безье по U: "))

(setq nk (getint "Введите число точек на кр Безье по V: "))

; Ввод координат характеристических точек

(setq p0 (list 10 10 0) p1 (list 50 140 0) p2 (list 20 290 0) p0v (list p0 p1 p2))

setq p0 (list 190 20 0) p1 (list 220 70 0) p2 (list 180 240 0) p1v (list p0 p1 p2))

(setq p0 (list 340 30 0) p1 (list 310 75 0) p2 (list 360 270 0) p2v (list p0 p1 p2))

(setq pt3d (list p0v p1v p2v)) (BEZP m n mk nk pt3d) )

219

6

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]