4 점이 사각형을 형성하는지 확인하는 방법?


36

서로 다른 4 점 (2 차원)이 있다고 가정하고 정사각형을 형성하는지 알고 싶습니다. 어떻게합니까? (프로세스를 가능한 한 간단하게하십시오.)


3
회전 된 사각형을 고려해야한다고 생각합니까?
Martijn Pieters

포인트의 순서에 대한 정보가 있습니까? 즉, 두 점이 인접 해 있는지 또는 대각선을 형성하는지 알 수 있습니까? (이 정보는 프로세스를 단순화하는 데 사용될 수 있습니다)
Daniel B

1
@DanielB 다른 정보가 없습니다. 마치 백서가 있고 무작위로 4 점을 그립니다. 그런 다음 그들이 사각형을 형성하는지 알고 싶습니다.
MarshalSHI

5
특히, 포인트가 부동 소수점 숫자로 표시되는 경우, 아래 제안 된 비교에서 "허용 오차"감각을 포함시키는 것이 유용합니다. 인간이 "충분히 근접한"것으로 간주하더라도 부동 소수점 연산의 결과에 대해 정확한 동등 검사가 실패 할 수 있습니다.
Stephan A. Terre

이것은 숙제 질문처럼 냄새가납니다. 그것에 문제가있는 것은 아닙니다. : / whathaveyoutried.com
Jim G.

답변:


64

어떤 좌표계를 사용하든 사각형이 회전한다고 가정하면 네 점에 X 및 Y 값이 반복되는 것에 의존 할 수 없습니다.

당신이 할 수있는 일은 네 점 각각 사이의 거리를 계산하는 것입니다. 다음과 같은 사실을 발견하면 사각형이 나타납니다.

  1. 거리에있는 두 지점 A와 C를 말하고 있습니다 X 서로, 다른 두 점, 또한 거리이다 B 및 D라고 X 서로 가입일.

  2. 각 점 {A, B, C, D}는 x 가 아닌 두 점과 같은 거리입니다 . 즉, A가 C에서 x 떨어져 있으면 B와 D에서 z 떨어져 있습니다.

또한 거리 z 는 SQRT (( x ^ 2) / 2) 여야 하지만이를 확인할 필요는 없습니다. 조건 1과 2가 참이면 정사각형입니다. 참고 : 일부 사람들은 제곱근의 비효율에 대해 우려하고 있습니다. 나는 당신 이이 계산 을 해야 한다고 말하지 않았으며 , 만약 당신이 그렇게한다면 예측 가능한 결과를 얻을 것이라고 말했다.

제곱 규칙의 예

당신이해야 할 최소한의 작업은 점을 선택하고 A라고 말하고 다른 세 점 각각까지의 거리를 계산하는 것입니다. A가 한 점에서 x 이고 다른 두 점에서 z 라는 것을 알 수 있으면 다른 두 점을 서로 비교하면됩니다. 그것들이 서로 x 인 경우 사각형이 있습니다. 즉 :

  • AB = z
  • AC = x
  • 광고 = z

AB = AD이므로 BD를 확인하십시오.

  • BD = x

BC와 CD의 다른면을 확인해야합니다.

  • BC = z
  • CD = z

AC = BD이고 AB = AD = BC = CD이므로 이것은 정사각형입니다.

길을 따라, 두 개 이상의 뚜렷한 가장자리 거리를 찾으면 그림은 사각형이 될 수 없으므로 더 이상 볼 수 없습니다.


실무 예제 구현

jsfiddle에 대한 실제 예제를 만들었습니다 ( here 참조 ). 알고리즘에 대한 설명에서는 임의의 점 A, B, C 및 D를 사용합니다. 이러한 임의의 점은 예제를 살펴보기 위해 특정 순서로 발생합니다. 알고리즘은 포인트가, 다른 순서로 있습니다 그러나, 경우에도 작동 예는 그 점의 순서가 다른 경우 반드시 작동하지 않습니다.


이 답변을 개선하는 데 유용한 의견을 주신 meshuai, Blrfl, MSalters 및 Bart van Ingen Schenau에게 감사드립니다 .


17
이 프로세스를 단락시킬 수 있으며 점 사이의 거리를 측정하고 찾은 고유 거리의 수를 추적하여 점이 어떻게 정렬되는지 걱정할 필요가 없습니다. 2를 초과하면 (Joel 's xz ) 숫자는 제곱이 아닙니다.
Blrfl

1
맨손으로, 나는 그것이 효과가 있다고 생각하지 않습니다. 마지막으로 "BC 또는 CD 중 어느 것이 중요하지 않습니다"라고 말합니다. 그러나 그중 하나만 확인하면 그림이 특별한 평행 사변형입니다.
MarshalSHI

2
다른 최적화는 거리 대신 제곱 거리를 비교하는 것입니다.
vaughandroid

3
@Blrfl : 테스트가 작동하지 않습니다. ABCD를 AB = BC = CD = DA = 1, AC = 1 (짧은 대각선), AD ~ 1.7 (긴 대각선)의 다이아몬드로 설정합니다. x와 z의 길이는 두 개 뿐이지 만 숫자는 정사각형이 아닙니다. .
MSalters

2
@JoelBrown : 대각선 AC = BD = x, 측면 AB = BC = AD = z 및 마지막 측면 CD = y! = z로 사다리꼴 모양을 만들 수 있습니다.
바트 반 Ingen Schenau

23

네 점 중 세 점을 선택하십시오.

점 사이의 세 벡터 중 하나가 90도 회전 한 다른 벡터와 같은지 확인하여 직교 이등변 ​​삼각형인지 알아냅니다.

그렇다면 벡터 덧셈으로 네 번째 점을 계산하고 주어진 네 번째 점과 비교하십시오.

값 비싼 제곱근이 필요하지 않으며 곱셈조차 필요하지 않습니다.


두 가지 좋은 답변 중 하나입니다. sqrt중요 하지 않으면 사용 하지 마십시오 ! 정수 계산을 FP로 분해 할 필요는 없습니다 ... FP 계산의 정밀도를 떨어 뜨리는 것은 말할 것도 없습니다.
K.Steff

고마워. 좋은 것.
MarshalSHI

이제 이것이 올바른 방법입니다. 여기서 곱셈은 실제로 필요하지 않습니다.
COME에서 온

곱셈을 포함하는 내적을 갖지 않고 두 벡터가 서로 직각인지 어떻게 알 수 있습니까?
Pavan Manjunath

직각으로 회전 된 (x, y)는 각각 양의 방향 또는 음의 방향으로 회전하는지에 따라 (-y, x) 또는 (y, -x)입니다.
starblue

15

가장 쉬운 해결책은 다음과 같습니다.

  • 먼저 4 점의 중심을 계산하십시오. center = (A + B + C + D)/4

  • 그런 다음 벡터를 계산하십시오 A - center. 이게하자v := (x,y)

  • 하자 v2벡터 수 v90도 회전 :v2 := (-y, x)

  • 이제 다른 점은해야한다 center - v, center + v2center - v2.

이 솔루션의 장점은 제곱근을 전혀 사용할 필요가 없다는 것입니다.


2
네. 이것은 가장 이해하기 쉽고 아마도 구현하기가 가장 쉽습니다.
Eric G

세그먼트의 벡터 평등처럼 보입니다. 누구나 왜 그것이 작동하는지 자세히 설명하거나 증명할 수 있습니까?
vCillusion

사례 (0,0), (2,1), (3, -1), (1, -2)-축에 정렬되지 않은 사각형
vCillusion

1
이 경우에 효과적입니다. 중심점은 (1.5, -0.5)이고 첫 번째 점은 (0, 0)이고 다른 세 점은 (1.5, -0.5) + (1.5, -0.5) = (3, -1)입니다. (1.5, -0.5) + (0.5, 1.5) = (2, 1) 및 (1.5, -0.5)-(0.5, 1.5) = (1, -2)는 제곱임을 의미합니다. 증거는 ... 대칭?
aragaer

5

죄송 합니다만 일부 답변이 적용되지 않습니다.

이 경우 3 개의 모서리 (AB, AC 및 AD라고 함)를 측정하여 두 개의 크기가 같고 (AC 및 AD라고 함) 하나가 더 큽니다 (AB라고 함). 그런 다음 CD를 측정하여 동일한 크기의 AB인지 확인합니다. 정사각형 대신 아래 그림을 볼 수 있으며 이는 잘못된 해결책입니다.

사각형이 아닙니다 ...

그런 다음 다른 해결책을 시도하십시오. AB, AC, AD, BC, BD, CD : 모든 거리를 한 번 이상 측정하십시오. 그런 다음 4 중 4가 같고 다른 2도 동일하다는 것을 알 수 있습니다. 그러나 다음과 같은 그림을 가질 수 있습니다.

그리고 그것은 사각형도 아닙니다.

따라서 높은 답변을 받았음에도 불구하고 이러한 답변은 정확하지 않습니다.

하나의 가능한 해결책 : 두 개의 동일한 측정 값이 동일한 지점을 연결하지 않는 경우. 따라서 AB와 CD의 길이가 같으면 다른 모든 조합 (AC, AD, BC, BD)도 동일하면 사각형이됩니다. 동일한 길이로 가장 큰 길이를 만드는 경우 (AB와 AC가 가장 크고 다른 모든 것이 동일 함) 위의 그림 중 하나입니다.


아니, 그의 알고리즘은 거리의 두 가장자리 x는 점을 공유하지 않는다고 말했다. AC 만 x라고 가정하면 BD는 BC 대신 다른 x가되어야합니다.
MarshalSHI

3

네 점이 좌표 벡터 a, b, c, d를 갖도록하십시오.

그런 다음 차이점을 w = (ad), x = (ba), y = (cb), z = (dc)라고합니다.

그런 다음 w는 90도 회전하여 w를 만들 수 있다면 a와 직교합니다. 수학적으로 2 공간의 90도 회전 행렬은 ((0, -1), (1, 0))입니다. 따라서, w가 90도 회전 된 상태인지 여부는

(w_1 == -x_2 및 w_2 == x_1)

이것이 유지되면 w == -y 및 x == -z인지 확인해야합니다. 또는

((w_1 == -y_1 및 w_2 == -y_2) 및 (x_1 == -z_1 및 x_2 == -z_2))

이 세 관계가 유지되면 a, b, c, d는 방향이 정사각형이됩니다.


1
직사각형도 귀하의 조건을 만족시킬 수 있다고 생각합니다.
MarshalSHI

아니요, 첫 번째 조건은 직교이지만 길이가 같은 벡터에는 해당되지 않습니다.
Mark Salzer

1
네, 첫 번째보고 싶어요. 그러나 4 점은 주문되지 않았습니다. 따라서 확인을 위해 더 많은 단계가 필요하다고 생각합니다.
MarshalSHI

그렇다 ... 영리한 아이디어가 없다면, 누군가는 반복해야한다. 나는 가능한 한 a, b, c, d 순서에서 w, x, y, z를 계산하기 위해 외부 루프가 필요하고 w, x, y, z 튜플의 가능한 순서마다 하나의 내부 루프가 필요하다고 생각합니다.
Mark Salzer

2

starblue 의 답변과 유사

네 점 중 세 점을 선택하십시오.

그들 사이에서 직각 정점을 찾으십시오 . 찾을 수 없으면 정사각형이 아닙니다.

이 각도에 인접한 꼭지점이 직각인지 확인하십시오. 그렇지 않으면 사각형이 아닙니다.

대각선이 직각인지 확인 : 첫 번째와 네 번째 정점과 다른 두 정점 (대각선) 사이의 벡터의 내적이 0이면 정사각형입니다.


좋은 생각이지만, 여전히 4 번째 정점이 다른 점과 적절한 거리에 있는지 확인해야합니다. 대각선에 있는지 확인하십시오.
starblue

@starblue 맞아! 그렇지 않으면 연을 형성 할 수 있습니다. 업데이트되었습니다.
Max

2

여기에 이미지 설명을 입력하십시오

여기에는 좋은 답변이 있지만 가장 간단한 방법이 질문이었습니다. 나는 이것을 몇 가지 빠른 생각을했고 이것이 내가하는 방법입니다.

네 점이 정사각형 (회전하더라도)을 나타내는 지 알 수 있지만 네 점의 평균을 찾습니다.

R = (A+B+C+D)/4

평균을 얻은 후에는 각 점과 평균 사이의 거리가 네 점 모두에서 동일해야합니다.

if(dist(R,A) == dist(R,B) == dist(R,C) == dist(R,D) then
   print "Is Square"
else
   print "Is Not Square"

편집하다:

내 실수. 폼 포인트가 원 위에 있는지 여부 만 알려줍니다. 점 사이의 거리도 확인하면 정사각형이어야합니다.

if(dist(R,A) == dist(R,B) == dist(R,C) == dist(R,D) AND
  (dist(A,B) == dist(B,C) == dist(C,D) == dist(A,D) then
   print "Is Square"
else
   print "Is Not Square"

이는 점 A, B, C, D가 교차하지 않는 것으로 가정합니다 (유효한 권선 순서에서와 같이).


1

이것은 표준 세트에 따른 답변이 아니지만 이것이 도움이되기를 바랍니다.

[아래 링크에서 복사 했으므로 링크를 열 필요가 없습니다] Python 76 자

def S(A):c=sum(A)/4.0;return set(A)==set((A[0]-c)*1j**i+c for i in range(4))

함수 S는 복소수 목록을 입력으로 사용합니다 (A). 정사각형의 중심과 한쪽 모서리를 모두 알고 있으면 중심점 (c)을 중심으로 모서리를 90,180 및 270도 회전하여 정사각형을 재구성 할 수 있습니다. 복소 평면에서 원점을 기준으로 90도 회전하면 점에 i를 곱하여 수행됩니다. 원래 모양과 재구성 된 정사각형의 점이 동일한 경우 정사각형이어야합니다.

이것은에서 찍은 : 4 점은 사각형을 형성 여부를 결정

대답이 마음에 든다면 잠시 시간을내어 그 사람에게 감사를 표하거나 해당 페이지에서 그의 대답을 투표하십시오.


1
여기서 알고리즘을 요약 할 수 있습니다. 다른 사이트를 가리키는 것보다 약간 더 나은 다른 SE 사이트에 연결하고 있지만 질문이있는 페이지 에 대한 답변을 원합니다 . 이제 사람들은 답이 무엇인지 배우기 위해 다시 클릭해야합니다.
Martijn Pieters

1

나는 당신이 간단한 덧셈과 뺄셈과 min / max를 찾는 것으로 이것을 할 수 있다고 생각합니다. 용어 (다른 사람의 다이어그램과 일치) :

  • y 값이 가장 높은 점 => A
  • 가장 높은 x => B
  • 가장 낮은 y => C
  • 가장 낮은 x => D

4 포인트가 2 x 값과 2 y 값만 공유하면 레벨 제곱이됩니다.

그렇지 않으면 포인트가 다음을 충족하면 사각형이 나타납니다.

  • 도끼 + Cx = Bx + Dx
  • Ay + Cy = By + Dy
  • Ay-Cy = Bx-Dx

설명 : 선분 AC와 BD는 중간 점에서 만나야합니다. 따라서 (Ax + Cx) / 2는 AC의 중간 점이고 (Bx + Dx) / 2는 BD의 중간 점입니다. 이 방정식의 각 변에 2를 곱하여 첫 번째 방정식을 얻습니다. 두 번째 방정식은 Y- 값에 대해서도 동일합니다. 다이아몬드 모양 (사방형)은 이러한 특성을 만족하므로 너비가 높이와 같은지 확인하십시오. 이것이 세 번째 방정식입니다.


-3

해결책은 사고 미디어와 유사합니다.

첫 번째 단계:

x = (A+B+C+D)/4
f=0
if(dist(x,A) == dist(x,B) == dist(x,C) == dist(x,D) 
   f=1
else
   f=0

이 속성은 주기적이므로 정사각형이 뒤 따릅니다. 이제이 속성을 따르는 서클입니다. 이제 확인하세요

if(A.B==B.C==C.D==D.A==0)
  f=1
else 
  f=0

if (f==1)
  square
else 
  not square

여기서 AB는 A와 B의 내적을 의미합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.