2014-06-11 2 views
0

제목이 다소 모호하지만 여기서 더 잘 설명하겠습니다.공개 된 공간을 통해 두 몸체의 연결성 확인

나는 많은 게임 LIMBO의 수위처럼, 약간의 물 수준 시뮬레이터를 프로그래밍하기 위해 노력하고있어

설정. 개구부가 만들어져 두 물체 사이에 물이 흐르도록 허용하면 레벨이 동일 해집니다. 내가 지금 가지고있는 설치는 수위를 나타내는 내부에 파란색 블록이있는 두 개의 컨테이너입니다. 내 마우스는 지형의 덩어리를 제거하므로 신체 사이에 개구가 생기면 조정해야하며 Y 값이 일치하도록 이동해야합니다.

이미지 예 :

세미 채워진 탱크 : Tanks

균등화 탱크 : 이제 Equalized

, 나는 약간의 수학이 얼마나을 알아 내기 위해 할 수있는 알고 서로 다른 크기의 탱크 사이의 수위와 비율을 조정하십시오. 내가 생각하는 부분은 꽤 솔직하다. 그러나 나는 두 개의 물이 연결되어 있는지 그리고 언제 연결되는지를 결정하는 좋은 방법을 이해할 수 없다.

모든 알고리즘, 의사 코드 또는 참조 사항을 보내 주시면 감사하겠습니다.

자세한 설명이 필요하면 언제든지 문의하십시오. 모든 의견을 기다리고 구체적인 설명을 위해 내 게시물을 편집합니다.

감사합니다.

~ natebot13

BTW : 나는 C++, SFML 및 Box2D의을 (Box2D의 내가 반드시이 예를 들어 필요하지, 필요한 다른 물리와 관련된 것들입니다) 사용하고 있습니다.

+0

이미지가 변경되면, 즉; 그들이 연결될 때, 그것을하지 마십시오. 네가 묻고있는거야? – ChiefTwoPencils

+1

@ChiefTwoPencils 내가 의미하는 바가 아닙니다. 내 말은, 두 탱크가 거기에 앉아서 지형을 가로 질러 마우스를 끌면 검정색이 제거되고 두 탱크가 아직 연결되었는지 여부를 계산하는 알고리즘을 원합니다. 수위를 올리거나 내림으로써 "물의 흐름". 또한 여러 곳에 탱크가있을 수 있으며 지형이 제거되면 어느 탱크가 연결되었는지 확인할 수 있습니다. 다행히도이 말이 맞았습니다. (내 머리 속에 의미가 있습니다.) : P – natebot13

+0

코드에서 이러한 영역이 어떻게 정의되어 있는지 알지 못해서 어떤 아이디어도 제공하기가 어렵습니다. 질문에 Box2D 태그가 붙어 있기 때문에 먼저 영역이 체인 모양으로 정의 된 것으로 가정합니다.이 영역은 종종 파괴 가능한 지형이 어떻게 수행되는지입니다. 그러나 다른 사람들은 당신이 어떤 유형의 그리드를 다루고 있다고 가정하고있는 것 같고 다이어그램은 어느 한쪽으로 많은 힌트를주지 않습니다. – iforce2d

답변

2

수위를 조정하려면 컨테이너 1의 가장자리가 컨테이너 2에 연결되어 있는지 여부를 확인해야합니다. 나는 당신이 connected components 알고리즘을 사용하여 container1의 가장자리 픽셀 중 하나가 container2의 가장자리 픽셀 중 하나에 연결되어 있는지와 그 위치를 얻는 지 확인하기 위해 이미지 작업을하고 있다고 생각합니다.

알고리즘 : -

  1. 는 더미 상위 1에 연결되어 한 세트의 에지들을 container1을 둔다.
  2. 은 container2의 가장자리를 다른 더미 parent2에 연결된 다른 세트에 넣습니다.
  3. 1 초가 지나면 연결된 구성 요소를 사용하여 세트에 새 추가 된 픽셀을 추가하십시오.
  4. 더미 공용 영역 parent1과 parent2가 연결되는지 여부를 모든 공용 영역의 끝에 확인하십시오.
  5. DFS를 사용하여 set1의 한쪽 가장자리에서 시작하여 다른 쪽 가장자리에 도달하여 정확한 연결 지점을 확인할 수 있습니다. 마지막 픽셀과 가장자리 세트 1의 이전 첫 번째 픽셀 인 은 연결 끝점입니다.

참고 : -

연결된 구성 요소의 구현에 유용 할 수 있습니다 LIB를 밀어 C++로 분리 된 세트의 구현이 있습니다.

+0

나는 이미지 작업을하고 있지는 않지만 연결된 컴포넌트 레퍼런스는 내가 원하는 것에 가깝다. 나는 이미지와 비슷한 것을 가지고있다. 그리하여 그 방법은 잘 풀릴 것이다. 내가 그것에 대해 읽을 것이고, 내가 그것을 이해할 수 있는지 알 것이다. 답변 해주셔서 감사합니다! – natebot13

+0

@ natebot13 픽셀 데이터 그리드는 이미지와 비슷하므로 그리드의 픽셀 근방이 표시되는 것과 유사하면 작동합니다. –

0

왼쪽에서 오른쪽으로 시작할 수 있다고 생각합니다. 예 : 왼쪽 탱크 위치의 오른쪽이 알려져 있습니다. 오른쪽의 파란색 사각형을 찾으십시오. 한 번 발견되면 주변의 정사각형을 검색합니다 (위, 아래, 오른쪽). 은 올바른 탱크의 알려진 왼쪽에 도달 할 때까지 계속 검색합니다.