Задание №1
Построение линии пересечения объёмных геометрических объектов
1.1 Цель работы
Выработка практических навыков в разработке и отладке программ для построения линий пересечения объёмных геометрических объектов.
1.2 Индивидуальное задание
Построить поверхности второго порядка
и их линию пересечения.
Вариант | a | b | c | d | E | R |
9 | 140 | 30 | 1 | 1 | 1 | 90 |
1.3 Решение задания
Представим систему в численном виде:
Из неё легко проверить, что получается такая система
Первое уравнение является уравнением окружности с радиусом
, расположенной параллельно плоскости XY на уровне . Эта окружность и является линией пересечения конуса и эллипсоида.1.4 Текст программы
;Conus
(defun conus()
(setq zmax 140.0)
(setq z 0.0)
(setq dz 5)
(while (<= z zmax)
(setq r (sqrt ( * (* z z) (/ (* 140 140) (* 30 30)))))
(if (= r 0)
(command "point" (list 0 0 0))
(command "circle" (list 0 0 z) r)
)
(setq z (+ z dz))
)
(setq dphi (/ (* 10 pi) 180))
(setq phi 0)
(while (<= phi (* 2.0 pi))
(command "line" (list 0 0 0) (list (* r (cos phi)) (* r (sin phi)) z))
(command)
(setq phi (+ phi dphi))
)
)
; Ellipse in YZ
(defun ell_Y(fy fz)
(setq xmax 90.0)
(setq dx 10.0)
(setq dy 10.0)
(setq x -90.0)
(while (<= x xmax)
(setq ya 0.0)
(setq yk (sqrt (- (* 90.0 90.0) (* x x))))
(setq z (* fz (sqrt (- 8100.0 (* x x)))))
(setq p1 (list x ya z))
(while (> (- yk ya) dy)
(setq ya (+ ya dy))
(setq y (* fy ya))
(setq z (* fz (sqrt (- 8100.0 (* x x) (* y y)))))
(setq p2 (list x y z))
(command "line" p1 p2 "")
(setq p1 p2)
)
(setq y (* fy yk))
(setq p2 (list x y 0.0))
(command "line" p1 p2 "")
(setq x (+ x dx))
)
)
;
; Ellipse in XZ
(defun ell_X (fx fz)
(setq ymax 90.0)
(setq y -90.0)
(while (<= y ymax)
(setq xa 0.0)
(setq xk (sqrt (- (* 90.0 90.0) (* y y))))
(setq z (* fz (sqrt (- 8100.0 (* y y)))))
(setq p1 (list xa y z))
(while (> (- xk xa) dx)
(setq xa (+ xa dx))
(setq x (* fx xa))
(setq z (* fz (sqrt (- 8100.0 (* x x) (* y y)))))
(setq p2 (list x y z))
(command "line" p1 p2 "")
(setq p1 p2)
)
(setq x (* fx xk))
(setq p2 (list x y 0.0))
(command "line" p1 p2 "")
(setq y (+ y dy))
)
)
;
; line cross
(defun lc(fl)
(setq x -88)
(setq dx 2)
(setq x (* fl x))
(setq y (sqrt (- 7744.3902 (* x x))))
(setq z 18.86)
(setq y (* fl y))
(setq p1 (list x y z))
(setq x (* fl x))
(while (> (- 88 x) dx)
(setq x (+ x dx))
(setq x (* fl x))
(setq y (sqrt (- 7744.3902 (* x x))))
(setq y (* fl y))
(setq z 18.86)
(setq p2 (list x y z))
(command "line" p1 p2 "")
(setq x (* fl x))
(setq p1 p2)
)
(setq x 88)
(setq x (* fl x))
(setq y (sqrt (- 7744.3902 (* x x))))
(setq z 18.86)
(setq p2 (list x y z))
(setq x (* fl x))
(command "line" p1 p2 "")
)
;
; control
(Defun gr()
(setq sb (getvar "blipmode"))
(setq sc (getvar "cmdecho"))
(command "erase" "all" "")
(setvar "blipmode" 0)
(setvar "cmdecho" 0)
(command "color" 5)
(ell_Y 1 1)
(ell_Y 1 -1)
(ell_Y -1 1)
(ell_Y -1 -1)
(ell_X 1 1)
(ell_X 1 -1)
(ell_X -1 1)
(ell_X -1 -1)
(command "color" 3)
(conus)
(command "color" 2)
(lc 1)
(lc -1)
(setvar "blipmode" sb)
(setvar "cmdecho" sc)
)
1.5 Результат выполнения программы
Задание № 2
Методы конструирования кривых.
2.1 Цель работы
Выработка практических навыков конструирования кривых.
2.2 Индивидуальное задание
Сконструировать кривую по заданным точкам методом Фергюсона. Создать функцию рисующую кривую в плоскости XY, исходные точки отметить маркерами. Оформить таблицу значений функции и отклонений от заданных значений в опорных точках.
Вариант | 0,0 | 0,2 | 0,4 | 0,6 | 0,8 | 1 |
09 | 49,0 | 105,3 | 172,3 | 211,1 | 183,0 | 49,0 |
28,0 | -31,5 | -78,6 | -95,8 | -66,1 | 28,0 |
2.3 Аппроксимация кривой методом Фергюсона
Сегмент кривой может быть описан векторным уравнением:
r(u)=a3u3+a2u2+a1u+a0 , (1)
где r(u)- радиус-вектор текущей точки кривой :
u – параметр, 0<=u<=1;
a1 – векторы коэффициентов i=0..3.
уравнение (1) – представляет собой векторную форму записи системы:
x(u)=a13u3+a12u2+a11u+a10;
y(u)=a23u3+a22u2+a21u+a20; (2)
z(u)=a33u3+a32u2+a31u+a30;
Таким образом, для определения сегмента кривой необходимо знать 4 вектора или 12 коэффициентов. Обычно задаются значения r(u) и r’(u) на концах сегмента:
r(0)=a0;
r(1)=a3+a2+a1+a0; (3)
r’(0)=a1;
r’(1)=3a3+2a2+a1;
Решив систему, уравнений относительно (3) a0 ,a1 , a2 , a3и подставив полученные значения в уравнение сегмента кривой в форме Фергюсона:
r(u)=r(0)(1-3u2+2u3)+r(1)(3u2-2u3)+r’(0)(u-2u2+u3)+r’(1)(u3-u2).
Однако в индивидуальном задании дано 6 точек и не указаны значения производных на концах отрезка – делаю вывод, что аппроксимацию необходимо проводить для сплайна степени 5 – так, как для построения сплайна степени nнеобходимо знать n+1 радиус-вектор.
Итак, уравнение сегмента проходящего через заданные точки в векторной форме:
r(u)=a5u5+a4u4+ a3u3+a2u2+a1u+a0 (4)
Система (2) запишется в следующем виде для плоского сплайна:
x(u)=a15u5+a14u4+a13u3+a12u2+a11u+a10;
y(u)=a25u5+a24u4+a23u3+a22u2+a21u+a20; (5)
Подставляя значения из заданной таблицы в систему (5) и решая её относительно коэффициентов a, получим шесть векторов входящих в уравнение кривой (4), которая проходит через шесть точек.
(6) (7)В результате решения системы (6) методом Гаусса получим:
a15=117,1875; a14=-255,208(3); a13=-621,3541(6); a12=563,958(3); a11=195,41(6); a10=49,0.
В результате решения системы (7) методом Гаусса получим:
a25=156,25; a14=-351,5625; a13=-630,208(3); a12=-143,4375; a11=-291,458(3); a10=28,0.
Итак, имеется 6 векторов и параметрический сплайн 5 степени – это есть необходимое и достаточное условие построения сегмента кривой проходящего через 6 точек.
2.4 Текст программы, реализующей метод Фергюсона.
(defun task2()
(command "erase" "all" "")
(setq a15 117.1875)
(setq a14 -255.2083333)
(setq a13 -621.3541666)
(setq a12 563.9583333)
(setq a11 195.4166666)
(setq a10 49.0)
(setq a25 156.25)
(setq a24 -351.5625)
(setq a23 630.2083333)
(setq a22 -143.4375)
(setq a21 -291.4583333)
(setq a20 28.0)
(setvar "pdmode" 2)
(command "point" (list 49.0 28.0))
(command "point" (list 105.3 -31.5))
(command "point" (list 172.3 -78.6))
(command "point" (list 211.1 -95.8))
(command "point" (list 183.0 -66.1))
(command "point" (list 49.0 28.0))
(setq u 0)
(setq du 0.01)
(setq file1 (open "c:\mydata1.txt" "w"))
(while (<= u 1.0)
(setq x1 (+ (* (expt u 5) a15) (* (expt u 4) a14) (* (expt u 3) a13) (* (expt u 2) a12) (* u a11) a10))
(setq y1 (+ (* (expt u 5) a25) (* (expt u 4) a24) (* (expt u 3) a23) (* (expt u 2) a22) (* u a21) a20))
(if (or (<= (abs (- u 0)) 0.00001) (<= (abs (- u 0.2)) 0.00001) (<= (abs (- u 0.4)) 0.00001) (<= (abs (- u 0.6)) 0.00001) (<= (abs (- u 0.8)) 0.00001) (<= (abs (- u 1.0)) 0.00001))
(print (list x1 y1) file1)
)
(setq u (+ u du))
(setq x2 (+ (* (expt u 5) a15) (* (expt u 4) a14) (* (expt u 3) a13) (* (expt u 2) a12) (* u a11) a10))
(setq y2 (+ (* (expt u 5) a25) (* (expt u 4) a24) (* (expt u 3) a23) (* (expt u 2) a22) (* u a21) a20))
(command "line" (list x1 y1) (list x2 y2))
(command)
)
(print (list x2 y2) file1)
(closefile1)
)
2.5 Таблица, получаемая в результате выполнения задания:
(49.0 28.0) вектор отклоненией– (0,0)
(105.3 -31.5) вектор отклоненией– (0,0)
(172.3 -78.6) вектор отклоненией– (0,0)
(211.1 -95.8) вектор отклоненией– (0,0)
(182.0 -67.1) вектор отклоненией– (1,1)
(49.0 28.0) вектор отклоненией– (0,0)
2.6 Рисунок с экрана
2.7 Вывод
Из таблицы делаю вывод, что из-за аппаратного представления действительных чисел возможны небольшие погрешности на больших расстояниях, проходимых точкой по кривой.
Задание № 3
Методы конструирования кривых.
3.1 Цель работы
Выработка практических навыков конструирования кривых.
3.2 Индивидуальное задание
Сконструировать кривую по заданным точкам методом Безье. Создать функцию рисующую кривую и характеристическую ломанную. Оформить таблицу значений функции и отклонений от заданных значений в опорных точках.
Вариант | 0,0 | 0,2 | 0,4 | 0,6 | 0,8 | 1 |
09 | 49,0 | 105,3 | 172,3 | 211,1 | 183,0 | 49,0 |
28,0 | -31,5 | -78,6 | -95,8 | -66,1 | 28,0 |
В системах автоматизации проектирования и производства для конструирования кривых и поверхностей применяется аппроксимация методом Безье. Сущность метода заключается в следующем.
Пусть задана совокупность из (n+1) точек
которую будем называть ломаной Безье. Кривая Безье, соответствующая этой ломаной, описывается в виде функции параметра t следующим полиномом: