최대 다중도 3을 사용하여 원점에서 가장자리와 꼭지점을 생성하는 알고리즘


11

나는 우주가 극도로 커질 수있는 (기본적으로 무한히 커지는) 웹 사이트를위한 2D 게임을 만들고 있습니다. 처음에 우주는 원점 (0, 0)과 같은 거리에있는 별 6 개로 구성됩니다. 내 임무는 서로 연결되는 "경로"(가장자리)가있는 더 많은 별을 생성하는 것입니다. 이러한 제한을 충족하는 알고리즘을 어떻게 디자인 할 수 있습니까?

  1. 별은 무작위로 바깥쪽으로 생성됩니다. (예를 들어, 새 별에 대한 (x, y) 좌표는 모든 방향으로, 바람직하게는 나선 형식으로 (0, 0)에서 천천히 바깥쪽으로 이동합니다)
  2. 가장자리가 교차하지 않습니다.
  3. 약간의 차이가 있어야하지만 새로운 별은 다른 별과 너무 멀거나 너무 멀어서는 안됩니다. (예 : 최소 반경이 있어야합니다)
  4. 별표 / 점의 배수는 3보다 크지 않아야합니다.
  5. 이 모든 것이 데이터베이스에 저장된다는 것을 감안할 때, 알고리즘은 너무 비쌀 수 없습니다. 즉, 나는 O (n) 복잡성의 무언가를 달성하고 싶습니다 (이것이 실현 가능한지 모르겠습니다).

본질적으로, 제가하고자하는 것은 별이 그래프의 점이고 별들 사이의 이동이 그 별들 사이의 가장자리로 묘사되어있는 나선형으로 보이는 은하입니다.

해결해야 할 특정 단계는 다음과 같습니다.

  1. 아직 3의 배수를 가지지 않은 다른 별들의 주변 부근에 점을 무작위로 생성하십시오.
  2. 가장자리 충돌을 일으키지 않는 다중도 3을 아직 갖지 않은 첫 번째 별을 찾으십시오.
  3. 별이 x 단위의 최소 거리 인 경우 두 점 사이에 모서리를 만듭니다.

나는 해결책을 찾았지만 수학 기술 (그래프 이론에 대한 지식)에는 많은 노력이 필요합니다. 또한이 문제에 대한 모든 리소스 / 링크는 대단히 감사하겠습니다.

여기에 내가 생각했던 의사 코드가 있지만 이것이 작동하는지 확실하지 않으며 몇 10,000 등의 별 후에는 제대로 수행되지 않을 것이라고 확신합니다.

newStar = randomly generated (x, y) within radius of last star from origin
while(newStar has not been connected):
    for (star in the known universe):
        if(distance between newStar and star > x units):
            if(star has < 3 multiplicity):
                if(path from newStar to star does not intersect another path):
                    connect the star to the other star
                    break;

    newStar = new random (x, y) coordinate

또한 누군가 MySQL 데이터베이스에 저장하는 방법에 대한 조언이 있다면 감사하겠습니다.

마지막으로 위의 의미가없는 경우 아래에 달성하고자하는 이미지를 포함 시켰습니다.등 많은 별 ...


1
이 우주의 여행자는 한 방향으로 움직일 것입니다. 즉, 별이 떨어지면 원점에서 모든 방향으로 별을 생성해야합니다. 즉, 지루한 사용자가 데이터베이스를 손상시킬 수 있습니다. 이 가능성을 고려 했습니까 (문제가 있다고 가정)?
Neil

2
또 다른 생각, 별의 배치는 기억할 필요가 없습니다. 재생 가능한 별 생성을 사용하는 경우 사용자가 나중에 별과 동일한 방식으로 생성되는 방식으로 볼 수있는 별을 생성 할 수 있습니다. 즉, 데이터베이스는 별에 대한 정보 만 저장하면됩니다. 그 위치는 정체성입니다.
Neil

1
생성 된 각 별의 배수가 정확히 3 인 경우 어떻게해야하므로 1 단계가 실패합니까? 왜 당신의 그림에서 다중도 4의 한 점이 있습니까? 오류입니까?
Doc Brown

1
아닙니다. 예측 가능한 방식으로 별을 생성 할 수 있다면 떠나고 돌아 오면 별이 항상 있었던 것처럼됩니다. 변경되지 않는 것은 알고리즘과 시드뿐입니다.
Neil

2
@JF No Man 's Sky 참조 . 그 사람은 말 그대로 우주를 생성합니다. 그는 플레이어가 방문한 행성 만 저장하지만 기존 행성은 동일한 지점에 남아 있습니다. 난수 생성에 사용되는 올바른 시드를 사용하는 것입니다.
Neil

답변:


2

제안 : 내부 유니버스 네트워크를 완벽하게 정렬되고 알고리즘 적이며 상대적으로 단순하게 유지하십시오. 사용자 화면에 유니버스가 표시 될 때 임의의 유니버스 만 있으면 됩니다 . 사용자 표시를 위해 별표 위치에 임의의 오프셋 만 적용하십시오.

문제 : 각 별에 대해 임의의 오프셋을 계산하는 가장 확실한 방법은 기본 구조를 숨기는 데 매우 효과적이지 않습니다. 별이 서로 충돌하거나 길을 건너기 전에 소량 만 별을 무작위로 지정할 수 있습니다.

해결 방법 : 조정 된 로컬이 아닌 임의성을 적용하면 큰 임의의 왜곡을 적용하고 훨씬 더 재미 있고 흥미로운 우주를 얻을 수 있습니다. 고무 시트에 별을 배치한다고 가정하고 시트의 다른 부분을 임의로 늘리고 뭉개 놓는 것을 상상해보십시오. 그것은 전체 별 그룹을 먼 거리로 이동시킬 수 있습니다. 근처의 별들이 서로에 대해 뻗고 뭉개지기 때문에 충돌하거나 교차하지 않습니다.

방법 : 프랙탈 지형 생성기를 찾아보십시오. 무료 및 공개 코드가 많이 있습니다. 지도의 각 지점에 대한 높이 값을 생성하는 기본 코드 만 필요합니다. 우리는 그것을 다른 방식으로 사용할 것입니다. 이 코드를 사용하여 2 개의 독립 지형 높이 맵을 생성하십시오. 별의 실제 X, Y 위치로 시작하고, 각지도에서 해당 위치를보고, 하나의지도 값을 사용하여 별의 X 표시 위치를 오프셋하고 다른지도 값을 사용하여 별의 Y 표시 위치를 오프셋하십시오. 스케일링 요소 중 일부를 사용해야하지만 무작위로 뒤틀린 고무 시트 효과를 줄 수 있습니다. 별 위치의 큰 변화는 기본 위치를 완전히 숨겨야합니다. 랜덤의 프랙탈 특성은 매우 자연스럽게 보이는 효과를 제공합니다.

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