База данных точек. Выбрать точки снаружи параболы

      Комментарии к записи База данных точек. Выбрать точки снаружи параболы отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Работа с базами данных в Prolog База данных точек. Выбрать точки снаружи параболы

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет назад.

  • Автор
    Сообщения
  • #1900

    questioner
    Участник

    Помогите с задачей. Диалект — SWI-Prolog.

    Есть БД, в которой находится информация о множестве точек в декартовой системе координат. По заданной вершине и параметру ‘p’ параболы с вертикальной осью, получить все точки БД, которые находятся во внешней области. БД представить двумя способами: у виде фраз(assert/retract) и запросов(record).

    Параметр p параболы характеризует её форму. Чем больше p — тем шире ветви параболы, чем ближе p к нулю — тем ветви параболы уже.
    Формула параболы x^2=2py, где p - числовой коэффициент.

  • #1901

    Я думаю надо выразить из вашего уравнения координату X для проверки принадлежности точки «внутренней области». Выбираете точку из БД — проверяете ее примерно так:

    parabola_get_x(Y, _P, _X):-
      Y < 0, !, fail.
    parabola_get_x(Y, P, X):-
      X is sqrt(2 * P * Y).
     
    check_internal(X, Y, P):-
      !, parabola_get_x(Y, P, ParabolaX), abs(X) < ParabolaX.

    В твоем уравнении парабола не смещена, поэтому Y точек внутри параболы всегда больше нуля. Это учитывает правило parabola_get_x, возвращающее координату X по координате Y.
    Каждой координате Y у точек, расположенных выше горизонтальной оси, соответствует 2 координаты X, но т.к. твоя парабола не смещена — точки симметричны. Поэтому правило parabola_get_x возвращает только одну точку с положительным значением X.

    Правило check_internal принимает пару координат и вычисляет координаты точки параболы, соответствующие заданному значению Y. Полученный результат сравнивается с исходной точкой, а т.к. мы брали только одну точку (правее вертикальной оси) — то используем модуль значения X исходной координаты.

    В официальной документации по library(record) как раз описан пример с базой точек.

Для ответа в этой теме необходимо авторизоваться.