判断一个点是否在矩形上

Finding if a point is on a rectangle

您好,我正在尝试使用 Prolog 确定一个点是否在矩形上。其中 (ULX,ULY) 是矩形的左上点,(LRX,LRY) 是矩形的右下点,(X,Y) 是我用来检查它是否在形状上的点:

我试过了,但我一直收到错误消息(=:=/2:参数没有充分实例化)

on(point2d(X,Y), rectangle(point2d(ULX, ULY), point2d(LRX, LRY))):-

URX is LRX,
URY is ULY,

LLX is ULX,
LLY is LRY,

%Checks if point is in area 1
(Y =:= ULY,
  X > ULX,
  X < URX)
;

 %OR Checks if point is in area 2
 (X =:= URX,
  Y < URY,
  Y > LRY)
;

 %OR Checks if point is in area 4
 (X =:= ULX,
  Y < ULY,
  Y > LLY)
;

 %OR Checks if point is in area 3
 (Y =:= LLY,
  X > LLX,
  X < LRX)
;


  (X =:= ULX,
  Y =:= ULY)
;

 (X =:= URX,
  Y =:= URY)
;

 (X =:= LLX,
  Y =:= LLY)
;

 X =:= LRX,
  Y =:= LRY.

所以我厌倦了将它们分成案例。但是如果点在矩形上,我会得到一个真值,然后是一个假值。如果它是假的,我只会得到一个假值。任何帮助是极大的赞赏。谢谢。

 %Checks if point is in area 1
on(point2d(X,Y), rectangle(point2d(ULX, ULY), point2d(LRX, _))):-
URX is LRX,
%URY is ULY,

%LLX is ULX,
%LLY is LRY,

  Y =:= ULY,
  X > ULX,
  X < URX.

 %OR Checks if point is in area 2
on(point2d(X,Y), rectangle(point2d(_, ULY), point2d(LRX, LRY))):-
URX is LRX,
URY is ULY,

%LLX is ULX,
%LLY is LRY,

X =:= URX,
  Y < URY,
  Y > LRY.

 %OR Checks if point is in area 4
on(point2d(X,Y), rectangle(point2d(ULX, ULY), point2d(_, LRY))):-
%URX is LRX,
%URY is ULY,

%LLX is ULX,
LLY is LRY,

 X =:= ULX,
  Y < ULY,
  Y > LLY.

 %OR Checks if point is in area 3
on(point2d(X,Y), rectangle(point2d(ULX, _), point2d(LRX, LRY))):-
%URX is LRX,
%URY is ULY,

LLX is ULX,
LLY is LRY,

 Y =:= LLY,
  X > LLX,
  X < LRX.
on(point2d(X,Y), rectangle(point2d(ULX, ULY), point2d(_, _))):-
% URX is LRX,
%URY is ULY,

 %LLX is ULX,
 %LLY is LRY,

 X =:= ULX,
  Y =:= ULY.

on(point2d(X,Y), rectangle(point2d(_, ULY), point2d(LRX, _))):-
URX is LRX,
URY is ULY,

%LLX is ULX,
%LLY is LRY,

X =:= URX,
  Y =:= URY.

on(point2d(X,Y), rectangle(point2d(ULX, _), point2d(_, LRY))):-
%URX is LRX,
%URY is ULY,

LLX is ULX,
LLY is LRY,

X =:= LLX,
  Y =:= LLY.

on(point2d(X,Y), rectangle(point2d(_, _), point2d(LRX, LRY))):-
% URX is LRX,
% URY is ULY,

% LLX is ULX,
%LLY is LRY,

X =:= LRX,
Y =:= LRY.

如果您的矩形不是任意旋转的,并且您的点都是完整的,那么通过为所有维度设置变量会让您的生活变得更加艰难。我将从第一面开始:

on(point2d(X,Y), rectangle(point2d(ULX,Y), point2d(LRX, LRY))) :-
  between(ULX, LRX, X).

我已经将点上的 Y 等同于右上角点上的 Y,以便将 "lock" 排序到那一侧;然后我只是将 between 用于该点的 X 值。如果没有整数和 between/3,这只是稍微多一些工作。其他三个子句看起来相同,只是锁定到矩形的每个其他维度并测试其他维度。所以对于左右两侧,将点的X值与左上或右下X值匹配,并测试上下Y值之间的Y值。

顺便说一下,如果您使用 @ 运算符,这会更好读一些,这是点的常规做法:

on(X@Y, rectangle(ULX@Y, LRX@LRY)) :-

您甚至可以使用 op/3:

定义您自己的 on 运算符
X@Y on rectangle(ULX@Y, LRX@LRY) :-

Prolog 可以很漂亮。