ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)
ДИСЦИПЛИНА: «Логическое и функциональное программирование»
Лабораторная работа №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.