Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / Сем 1 / 3 / Лабораторная работа №3

.docx
Скачиваний:
8
Добавлен:
15.08.2023
Размер:
79.71 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)

КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)

ДИСЦИПЛИНА: «Логическое и функциональное программирование»

Лабораторная работа №2.

«Поиск точек прямой и эллипсоида»

Выполнил:

Козлов Н.С

Подпись____________

Принял:

Ерофеев С.А.

Подпись____________

«_____»________ 2021

Постановка задачи и исходные данные

В данной лабораторной требуется найти точки пересечения прямой и эллипсоида с помощью средств логического языка программирования «Prolog»

Уравнение эллипсоида:

Алгоритм решения

[1] Решение коэффициентов прямой осуществляется выражением соответствующих коэффициентов из следующей системы уравнений:

Далее совершим преобразование для каждого уравнения системы:

[2] Для того чтобы решить уравнение эллипсоида, подставим данный, полученные в пункте [1] в уравнение:

Преобразуем уравнение следующим образом:

Вычислим корни полученного уравнения:

[3] Для получение окончательного результата, подставим полученные корни в пункте [2] в уравнение прямой:

Код программы

domains

point3d = p3d(real, real, real)

stack3d = s3d(real, real, real)

intPair = pair(real, real)

predicates

% Reads user input to point3d structure %

readPoint3d(point3d)

% Reads ellipsoid user input for half-shafts %

readEllipsoidParams(integer, integer, integer)

% Solves line equation %

% point3d - input | intPair - output %

solveLineEq(point3d, point3d, intPair, intPair, intPair)

% Solves quadratic equation %

% 3 intPairs for input | 1 intPair for output %

solveQuadraticEq(stack3d, intPair, intPair, intPair, intPair)

writePoints(intPair, intPair, intPair, intPair)

clauses

readPoint3d(p3d(X, Y, Z)):-

nl,

write("-> X: "), readreal(X),

write("-> Y: "), readreal(Y),

write("-> Z: "), readreal(Z).

readEllipsoidParams(A, B, C):-

nl,

write("-> A: "), readreal(A),

write("-> B: "), readreal(B),

write("-> C: "), readreal(C).

solveLineEq(p3d(X1, Y1, Z1), p3d(X2, Y2, Z2), pair(X0, L), pair(Y0, M), pair(Z0, N)):-

X0 = X1, L = X2 - X1,

Y0 = Y1, M = Y2 - Y1,

Z0 = Z1, N = Z2 - Z1.

solveQuadraticEq(s3d(G, F, Q),pair(X0, L), pair(Y0, M), pair(Z0, N), pair(T1, T2)):-

%N1 = X0 - X0, % First numerator %

%N2 = Y0 - Y0, % Second numerator %

%N3 = Z0 - Z0, % Third numerator %

A = G*G, B = F*F, C = Q*Q,

T1 = sqrt( (A*B*C)/( B*C*(L*L) + A*C*(M*M) + A*B*(N*N) ) ),

T2 = -sqrt( (A*B*C)/( B*C*(L*L) + A*C*(M*M) + A*B*(N*N) ) ).

writePoints(pair(T1, T2), pair(X0, L), pair(Y0, M), pair(Z0, N)):-

P1X = X0+L*T1, P1Y = Y0+M*T1, P1Z = Z0+N*T1,

P2X = X0+L*T2, P2Y = Y0+M*T2, P2Z = Z0+N*T2,

write("Point 1:"), nl,

write("(", P1X, " ", P1Y, " ", P1Z, ")"),

write("Point 2:"), nl,

write("(", P2X, " ", P2Y, " ", P2Z, ")").

goal

write("Enter values for the radii of the ellipsoid:"),

readEllipsoidParams(A, B, C),

write("Enter values for first point of the line: "),

readPoint3d(p3d(X1, Y1, Z1)),

write("Enter values for second point of the line: "),

readPoint3d(p3d(X2, Y2, Z2)),

solveLineEq(p3d(X1, Y1, Z1), p3d(X2, Y2, Z2), pair(X0, L), pair(Y0, M), pair(Z0, N)),

solveQuadraticEq(s3d(A, B, C),pair(X0, L), pair(Y0, M), pair(Z0, N), pair(T1, T2)),

writePoints(pair(T1, T2), pair(X0, L), pair(Y0, M), pair(Z0, N)).

Пример работы программы

Вывод

Была создана программа, определяющая точки пересечения эллипсоида и прямой с использованием средств логического языка программирования Prolog в среде разработки TurboProlog 2.0.

Соседние файлы в папке 3