判断一个点是否在矩形上
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 可以很漂亮。
您好,我正在尝试使用 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 可以很漂亮。