서로 다른 4 점 (2 차원)이 있다고 가정하고 정사각형을 형성하는지 알고 싶습니다. 어떻게합니까? (프로세스를 가능한 한 간단하게하십시오.)
서로 다른 4 점 (2 차원)이 있다고 가정하고 정사각형을 형성하는지 알고 싶습니다. 어떻게합니까? (프로세스를 가능한 한 간단하게하십시오.)
답변:
어떤 좌표계를 사용하든 사각형이 회전한다고 가정하면 네 점에 X 및 Y 값이 반복되는 것에 의존 할 수 없습니다.
당신이 할 수있는 일은 네 점 각각 사이의 거리를 계산하는 것입니다. 다음과 같은 사실을 발견하면 사각형이 나타납니다.
거리에있는 두 지점 A와 C를 말하고 있습니다 X 서로, 다른 두 점, 또한 거리이다 B 및 D라고 X 서로 가입일.
각 점 {A, B, C, D}는 x 가 아닌 두 점과 같은 거리입니다 . 즉, A가 C에서 x 떨어져 있으면 B와 D에서 z 떨어져 있습니다.
또한 거리 z 는 SQRT (( x ^ 2) / 2) 여야 하지만이를 확인할 필요는 없습니다. 조건 1과 2가 참이면 정사각형입니다. 참고 : 일부 사람들은 제곱근의 비효율에 대해 우려하고 있습니다. 나는 당신 이이 계산 을 해야 한다고 말하지 않았으며 , 만약 당신이 그렇게한다면 예측 가능한 결과를 얻을 것이라고 말했다.
당신이해야 할 최소한의 작업은 점을 선택하고 A라고 말하고 다른 세 점 각각까지의 거리를 계산하는 것입니다. A가 한 점에서 x 이고 다른 두 점에서 z 라는 것을 알 수 있으면 다른 두 점을 서로 비교하면됩니다. 그것들이 서로 x 인 경우 사각형이 있습니다. 즉 :
AB = AD이므로 BD를 확인하십시오.
BC와 CD의 다른면을 확인해야합니다.
AC = BD이고 AB = AD = BC = CD이므로 이것은 정사각형입니다.
길을 따라, 두 개 이상의 뚜렷한 가장자리 거리를 찾으면 그림은 사각형이 될 수 없으므로 더 이상 볼 수 없습니다.
실무 예제 구현
jsfiddle에 대한 실제 예제를 만들었습니다 ( here 참조 ). 알고리즘에 대한 설명에서는 임의의 점 A, B, C 및 D를 사용합니다. 이러한 임의의 점은 예제를 살펴보기 위해 특정 순서로 발생합니다. 알고리즘은 포인트가, 다른 순서로 있습니다 그러나, 경우에도 작동 예는 그 점의 순서가 다른 경우 반드시 작동하지 않습니다.
이 답변을 개선하는 데 유용한 의견을 주신 meshuai, Blrfl, MSalters 및 Bart van Ingen Schenau에게 감사드립니다 .
네 점 중 세 점을 선택하십시오.
점 사이의 세 벡터 중 하나가 90도 회전 한 다른 벡터와 같은지 확인하여 직교 이등변 삼각형인지 알아냅니다.
그렇다면 벡터 덧셈으로 네 번째 점을 계산하고 주어진 네 번째 점과 비교하십시오.
값 비싼 제곱근이 필요하지 않으며 곱셈조차 필요하지 않습니다.
sqrt
중요 하지 않으면 사용 하지 마십시오 ! 정수 계산을 FP로 분해 할 필요는 없습니다 ... FP 계산의 정밀도를 떨어 뜨리는 것은 말할 것도 없습니다.
가장 쉬운 해결책은 다음과 같습니다.
먼저 4 점의 중심을 계산하십시오. center = (A + B + C + D)/4
그런 다음 벡터를 계산하십시오 A - center
. 이게하자v := (x,y)
하자 v2
벡터 수 v
90도 회전 :v2 := (-y, x)
이제 다른 점은해야한다 center - v
, center + v2
와 center - v2
.
이 솔루션의 장점은 제곱근을 전혀 사용할 필요가 없다는 것입니다.
죄송 합니다만 일부 답변이 적용되지 않습니다.
이 경우 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가 가장 크고 다른 모든 것이 동일 함) 위의 그림 중 하나입니다.
네 점이 좌표 벡터 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는 방향이 정사각형이됩니다.
starblue 의 답변과 유사
네 점 중 세 점을 선택하십시오.
그들 사이에서 직각 정점을 찾으십시오 . 찾을 수 없으면 정사각형이 아닙니다.
이 각도에 인접한 꼭지점이 직각인지 확인하십시오. 그렇지 않으면 사각형이 아닙니다.
대각선이 직각인지 확인 : 첫 번째와 네 번째 정점과 다른 두 정점 (대각선) 사이의 벡터의 내적이 0이면 정사각형입니다.
여기에는 좋은 답변이 있지만 가장 간단한 방법이 질문이었습니다. 나는 이것을 몇 가지 빠른 생각을했고 이것이 내가하는 방법입니다.
네 점이 정사각형 (회전하더라도)을 나타내는 지 알 수 있지만 네 점의 평균을 찾습니다.
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가 교차하지 않는 것으로 가정합니다 (유효한 권선 순서에서와 같이).
이것은 표준 세트에 따른 답변이 아니지만 이것이 도움이되기를 바랍니다.
[아래 링크에서 복사 했으므로 링크를 열 필요가 없습니다] 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 점은 사각형을 형성 여부를 결정
대답이 마음에 든다면 잠시 시간을내어 그 사람에게 감사를 표하거나 해당 페이지에서 그의 대답을 투표하십시오.
나는 당신이 간단한 덧셈과 뺄셈과 min / max를 찾는 것으로 이것을 할 수 있다고 생각합니다. 용어 (다른 사람의 다이어그램과 일치) :
4 포인트가 2 x 값과 2 y 값만 공유하면 레벨 제곱이됩니다.
그렇지 않으면 포인트가 다음을 충족하면 사각형이 나타납니다.
설명 : 선분 AC와 BD는 중간 점에서 만나야합니다. 따라서 (Ax + Cx) / 2는 AC의 중간 점이고 (Bx + Dx) / 2는 BD의 중간 점입니다. 이 방정식의 각 변에 2를 곱하여 첫 번째 방정식을 얻습니다. 두 번째 방정식은 Y- 값에 대해서도 동일합니다. 다이아몬드 모양 (사방형)은 이러한 특성을 만족하므로 너비가 높이와 같은지 확인하십시오. 이것이 세 번째 방정식입니다.