2017-11-26 3 views
1

안녕하세요 점이 프롤로그를 사용하여 사각형에 있는지 확인하려고합니다. 여기서 (ULX, ULY)는 직사각형의 왼쪽 위 지점이고 (LRX, LRY)는 직사각형의 오른쪽 아래 지점이며 (X, Y)는 모양에 있는지 확인하기 위해 사용하는 지점입니다.점이 사각형에 있는지 찾기

enter image description here

나는이 시도하지만 오류지고 유지 (= =/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. 

그래서 내가 피곤 경우로 구분 할 수 있습니다. 그러나 점이 직사각형에 있으면 참 값 뒤에 false가옵니다. 거짓이라면 나는 단지 하나의 잘못된 값을 얻습니다. 어떤 도움이라도 대단히 감사합니다. 고맙습니다.

%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

사각형이 임의로 회전하지 않고 점이 모두 필수적이면 모든 치수에 대한 변수를 사용하면 자신의 삶이 조금 더 어려워집니다. 나는 첫 번째면이 시작 것 : 그면에 "잠금"의 정렬 오른쪽 지점에서 Y에 지점에 Y를 동일시 한

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

; 그때 나는 그 점의 X 값을 위해 사이를 사용하고있다. 이것은 정수 및 between/3 없이는 약간 더 많은 작업입니다. 다른 세 개의 절은 똑같이 보이며 사각형의 다른 차원 각각에 고정되고 다른 차원을 테스트합니다. 따라서 오른쪽과 왼쪽면에 대해 점의 X 값을 왼쪽 위 또는 오른쪽 아래 X 값과 일치시키고 위 Y 값과 위 Y 값 사이에서 Y 값을 테스트합니다.

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

당신도 멋진 얻을 op/3를 사용하여 자신의 on 연산자를 정의 할 수 있습니다 : 그런데

, 이것은 당신이 @ 연산자를 사용하는 경우 지점에 대한 기존대로 읽고, 조금 더 좋은 것 :

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

프롤로그는 매우 유사 할 수 있습니다.

+0

안녕하세요 @ DanielLyons 대단히 감사합니다. 사각형에 위의 점과 길이 만있는 경우 점이 사각형에 있는지 알아내는 데 도움을 줄 수 있습니까? on (point2d (X, Y), square (point2d (ULX, ULY), L))과 같이. 고맙습니다 – HGI

관련 문제