2017-03-20 4 views
0

제 질문은 프로그래밍의 성격이긴하지만, 제가 붙어있는 부분은 약간 수학적이라고 말하는 것으로 시작하겠습니다. 그래서 이것이 이것이 게시 될 수있는 정확한지 확실하지 않지만 다른 곳은 확실하지 않습니다.포인트가 육각형 내부에 있는지 확인하는 함수

포인트 (x, y)가 특정 모양 안에 있으면 true를 반환하고 외부의 경우 false를 반환하려고하는 부울 함수를 정의하려고합니다. 그것을 명확히하기 위해, 다음 코드는 내부 반경 (R1) 및 외부 반경 R2의 고리 (링)을 정의하기위한 작동합니다 :

def ring(pos): 
    (x, y) = pos 
    rsq = x ** 2 + y ** 2 
    return (r1 ** 2 < rsq < r2 ** 2) 

내 질문에 누군가가 나를 도와 정의하는 영리한 방법을 마련 할 수 있다면 것 육각형 영역에 대해 이와 같은 함수. 특히 원점을 중심으로 측면 길이가 s 인 (육각형의 반) 육각형 영역을 정의하고 싶습니다. 이상적으로는 상단과 하단이 측면이고, x 축이 평행하도록 지향 될 수도 있습니다.

+1

검색 엔진에 "육각형 안쪽에 점"을 입력하면 많은 예제가 제공됩니다. (인기있는 접근법은 점이 어떤 볼록한 다각형 안에 있는지 감지하는 데 동일한 알고리즘을 사용하는 것입니다.) – UnholySheep

+0

당신은 완전히 옳았습니다. 어떤 이유로 내가 조금씩 단계적으로 제거하고 적절한 검색 용어를 찾지 못했습니다. 나는 그것들을 들여다 보겠습니다. – user129412

+0

@ UnholySheep 이것은 아주 특별한 경우지만, 더 간단한 해결책을 허용 할 수 있습니다. –

답변

3

요점은 Y가 SQRT (3) ⋅ (들 =하는 갖는다 ( "대각선 아래"모두 여부를 확인하기 위해 - X)) 및 "상단 가장자리 아래" (y = sqrt (3)/2 ⋅ s)입니다.

>>> def hexagon(pos): 
     x, y = map(abs, pos) 
     return y < 3**0.5 * min(s - x, s/2) 

데모 :

>>> s = 13 
>>> for y in range(-s, s+1): 
     print(' '.join('.X'[hexagon((x, y))] for x in range(-s, s+1))) 

. . . . . . . . . . . . . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . . . . . . . 
. . . . . . . X X X X X X X X X X X X X . . . . . . . 
. . . . . . X X X X X X X X X X X X X X X . . . . . . 
. . . . . . X X X X X X X X X X X X X X X . . . . . . 
. . . . . X X X X X X X X X X X X X X X X X . . . . . 
. . . . . X X X X X X X X X X X X X X X X X . . . . . 
. . . . X X X X X X X X X X X X X X X X X X X . . . . 
. . . X X X X X X X X X X X X X X X X X X X X X . . . 
. . . X X X X X X X X X X X X X X X X X X X X X . . . 
. . X X X X X X X X X X X X X X X X X X X X X X X . . 
. . X X X X X X X X X X X X X X X X X X X X X X X . . 
. X X X X X X X X X X X X X X X X X X X X X X X X X . 
. X X X X X X X X X X X X X X X X X X X X X X X X X . 
. X X X X X X X X X X X X X X X X X X X X X X X X X . 
. . X X X X X X X X X X X X X X X X X X X X X X X . . 
. . X X X X X X X X X X X X X X X X X X X X X X X . . 
. . . X X X X X X X X X X X X X X X X X X X X X . . . 
. . . X X X X X X X X X X X X X X X X X X X X X . . . 
. . . . X X X X X X X X X X X X X X X X X X X . . . . 
. . . . . X X X X X X X X X X X X X X X X X . . . . . 
. . . . . X X X X X X X X X X X X X X X X X . . . . . 
. . . . . . X X X X X X X X X X X X X X X . . . . . . 
. . . . . . X X X X X X X X X X X X X X X . . . . . . 
. . . . . . . X X X X X X X X X X X X X . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . . . . . . . 
+0

에 넣으면 인상적인 솔루션이며 매우 멋진 표현입니다. –

+0

@ EricDuminil 사진을 멋지게 보이게하려는 몇 가지 시도를했습니다 :-). 우리는 "진정한"monospace 폰트 (폭과 높이가 같음)를 갖고 싶습니다 ... –

+0

참으로 멋진 솔루션입니다. 아마도 대각선 및 상단 가장자리 부분을 아래에서 자세히 설명 할 수 있지만 다른 한편으로 독자는 자신을 알아낼 수 있어야합니다. – user129412

0

육각형을 중심으로 경계 상자를 만들고, 높이는 가운데 모서리 사이의 거리이며, 폭은 왼쪽면과 오른쪽면 사이의 거리입니다. b라고 말하면됩니다.
육각형에 대해 미리 결정된 크기가있는 경우이를 둘러싸고있는 4 개의 삼각형의 영역을 쉽게 얻을 수 있습니다.
따라서 포인트가 삼각형 중 하나에 있는지 테스트 할 수 있습니다. 그렇지 않으면 포인트가 육각형에 있는지 테스트 할 수 있습니다.

________ 
| /\ | 
|*/\ *| This is an illustration of the above suggestion 
|/ \ | The * are points outside the hexagon. 
|/  \| 
|  | 
|  | 
|\  /| 
| \ /| 
| *\/*| 
|___\/___| 
+1

문제는 삼각형 안에 있는지 테스트하는 방법이됩니다. 삼각형이 더 쉬운 경우 6 개로 육각형을 분해하여 거기에서 수행하십시오 –

+0

삼각형이 더 쉽고 예, 당신도 그것을 할 수 있습니다, 얼마나 많은 테스트를 실행하고, 4는 6보다 더 낫다고 생각합니다. –

+0

5 개의 테스트가 없을까요? 하나는 사각형 내부에 있는지, 그리고 삼각형 당 하나 (여전히 6보다 나은 것)가 있는지 확인하십시오. –

1

귀하의 솔루션은 기본적으로 극좌표를 기반으로합니다. 반지 또는 원이 원점을 중심으로하므로 θ은 신경 쓰지 않아도됩니다. r이 디스크의 경우 [0,r_max], 링의 경우 [r_min,r_max] 안에 있는지 확인하면됩니다.

polar definition of an hexagon을 사용하고 r[0,r_hexagon(θ)] 안에 있는지 확인할 수 있습니다.

import numpy as np 
import matplotlib.pyplot as plt 
import math 


theta = np.arange(0, 2 * math.pi, 0.01) 

sixty_d = math.pi/3 


def hexagon(theta): 
    return math.sqrt(3)/(2 * math.sin(theta + sixty_d - 
             sixty_d * math.floor(theta/sixty_d))) 

hexagon = np.vectorize(hexagon) 

ax = plt.subplot(111, projection='polar') 
ax.plot(theta, hexagon(theta)) 
ax.set_rmax(1.5) 
ax.set_rticks([0.5, 1, 1.5]) 
ax.grid(True) 

ax.set_title("Hexagon in polar coordinates", va='bottom') 
plt.show() 

그것은 표시 : enter image description here

당신은 최대 반경을 얻기 위해 위의 hexagon(theta)을 사용할 수 있습니다

여기 NumPy와 및하기 matplotlib와 예입니다. thetamath.atan2(y, x)으로 계산할 수 있습니다. 제 1 사분면에 들어갈하고 간단한 계산 (피타고라스 충분) 내지 대칭 사용

1

내 두 센트 :

def inside(pos, R): 
    import numpy as np 
    r = R * np.sqrt(3)/2 
    try: # thanks to @stefan-pochmann 
     phi = np.arctan(pos[1]/pos[0]) 
    except ZeroDivisionError: 
     phi = 0.0 
    length = np.sqrt(pos[0] ** 2 + pos[1] ** 2) 
    for i in range(3): 
     rot = 2 * np.pi/3.0 * i 
     new_phi = phi + rot 
     new_pos = (length * np.sin(new_phi), length * np.cos(new_phi)) 
     if abs(new_pos[0]) <= np.sqrt(R ** 2 - r ** 2) and abs(new_pos[1]) <= r: 
      return True 
    return False 

이는 육각형 (0, 0) 중심되고 R가 소정 원 반경 r 내접 하나라고 가정한다.

이것은 링 알고리즘의 구현이 아닙니다. 테두리 상자 사용

+0

@StefanPochmann 실로; 색인은 또한 역이었다. 나는 그것이 지금 잘 작동하기를 바란다. –

+0

육각형이 생기지 않습니다 : http://ideone.com/Kdy6Vu –

+0

@StefanPochmann 회전하기 전에 각도를 라디안으로 변환하는 것을 잊었습니다. 재미있는 모양. 나는 몇 가지 이유 (http://ideone.com/cptiEK)로 2 코너가 없어졌습니다. Hmmm –

관련 문제