최대 다중도 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.