Смекни!
smekni.com

Построение линии пересечения объёмных геометрических объектов (стр. 1 из 2)

Задание №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:&bsol;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

3.3 Аппроксимация методом Безье

В системах автоматизации проектирования и производства для конструирования кривых и поверхностей применяется аппроксимация методом Безье. Сущность метода заключается в следующем.

Пусть задана совокупность из (n+1) точек

которую будем называть ломаной Безье. Кривая Безье, соответствующая этой ломаной, описывается в виде функции параметра t следующим полиномом: