2017-11-26 19 views
1

こんにちは私はポイントがPrologを使って矩形上にあるかどうかを調べようとしています。ここで(ULX、ULY)は矩形の左上の点であり、(LRX、LRY)は矩形の右下の点であり、(X、Y)は形状上にあるかどうかを確認するための点です。ポイントが矩形上にあるかどうかを調べる

enter image description here

私はこれを試してみましたが、私はエラーを取得保管ケースにそれらを分離するので、私は疲れて

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. 

(=:引数が十分にインスタンス化されていない:=/2)。しかし、点が四角形上にある場合、私は真の値に続いて偽を得ます。それが偽であれば、私はちょうど1つの偽の価値を得る。どんな助けでも大歓迎です。ありがとうございました。

%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. 

答えて

1

あなたの四角形が任意に回転されず、ポイントがすべて必須である場合は、すべてのディメンションの変数を使用することで自分の生活を少し難しくしています。私は、第1の側面のためにこれを起動します:

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

私はその辺の上に「ロック」の並べ替えに右上の点のYをポイントにYを同一視してきました。私はポイントのX値の間にちょうど間を使用しています。これは、整数とbetween/3を使わないほんの少しだけ仕事です。他の3つの節は同じように見え、矩形の他の各次元にロックして、他の次元をテストします。したがって、左右の場合は、ポイントのX値を左上または右下のX値と一致させ、上下のY値の間でY値をテストします。

on([email protected], rectangle([email protected], [email protected])) :- 

あなたも空想取得し、op/3を使用して独自のonオペレータを定義することができます:ところで

、これはあなたが@演算子を使用する場合のポイントのために従来のように、読むために少しよりよい次のようになります。

[email protected] on rectangle([email protected], [email protected]) :- 

Prologは非常にきれいです。

+0

こんにちは@DanielLyonsありがとうございました。正方形が上の点と長さしか持たないという点を考慮すると、点が正方形にあるかどうかを調べるのを助けてください。 on(point2d(X、Y)、square(point2d(ULX、ULY)、L))のように。ありがとうございました – HGI

関連する問題