번개를 생성하는 알고리즘이 있습니까?
볼트가 착륙하는 위치를 지정하는 세그먼트 또는 점 객체 목록을 생성하는 알고리즘을 원합니다. 이 방법에는 엔드 포인트와 함께 시작점 매개 변수가 필요합니다. 볼트에는 임의의 가지가 떨어지고 임의의 간격으로 지그재그가 있어야합니다. 결과는 다음과 같은 임의의 번개 효과가됩니다.

(출처 : wikimedia.org )
누구나 이것이 작동 할 수있는 알고리즘을 알고 있다면 도움을 주시면 감사하겠습니다!
번개를 생성하는 알고리즘이 있습니까?
볼트가 착륙하는 위치를 지정하는 세그먼트 또는 점 객체 목록을 생성하는 알고리즘을 원합니다. 이 방법에는 엔드 포인트와 함께 시작점 매개 변수가 필요합니다. 볼트에는 임의의 가지가 떨어지고 임의의 간격으로 지그재그가 있어야합니다. 결과는 다음과 같은 임의의 번개 효과가됩니다.

(출처 : wikimedia.org )
누구나 이것이 작동 할 수있는 알고리즘을 알고 있다면 도움을 주시면 감사하겠습니다!
답변:
조명 볼트를 생성하는 데 사용할 수있는 매우 간단한 알고리즘이 있습니다.
상기 볼트의 원점 사이의 선분 (시작 O() 및 엔드 포인트 E)
해당 선에서 점 (대략 또는 정확히 중간)을 선택 S하고 선분을 두 선 선분 ( O->S및 S->E) 으로 분할합니다 . 작은 선량으로 S원래 선 세그먼트 (세그먼트의 법선을 따라)에서 멀어지게합니다. 이것은 당신에게 하나의 번개의 굴곡을 제공합니다.
굽힘을 계산 한 후 작은 임의 확률을 기반으로 세 번째 선 세그먼트 (일반적으로 세그먼트의 확장) 를 추가 할 수 있습니다 O->S. 이것이 번개에서 "포크"를 만드는 방법입니다. 포크는 더 어둡게 또는 더 미묘하게 흐리게하기를 원하기 때문에 일반적으로이 생성 과정에서 볼트의 강도에 대한 정보를 추적하려고합니다.

그런 다음 가지고있는 모든 새 선분에 대해 위의 과정을 반복하십시오. 원하는 모양을 생성하는 반복 량을 선택해야합니다.

여기 친구의 블로그 에이 기술에 대한 명확한 설명이 있습니다 ( 여기 에서 나는 사진을 뻔뻔스럽게 훔쳤습니다). 글로우 효과를 추가하는 방법에 대한 깊이도 더해집니다.
마지막으로, 동일한 기본 알고리즘 (자세한 내용도 포함) 을 설명하는 이 NVIDIA 문서 도 있습니다.
다른 방법을 권장합니다. 빠르게 탐색하는 임의 트리 (RRT) . 한 가지 멋진 점은 모서리를 돌거나 모든 방향으로 폭발 할 수 있다는 것입니다.
알고리즘은 정말 기본입니다 :
// Returns a random tree containing the start and the goal.
// Grows the tree for a maximum number of iterations.
Tree RRT(Node start, Node goal, int maxIters)
{
// Initialize a tree with a root as the start node.
Tree t = new Tree();
t.Root = start;
bool reachedGoal = false;
int iter = 0;
// Keep growing the tree until it contains the goal and we've
// grown for the required number of iterations.
while (!reachedGoal || iter < maxIters)
{
// Get a random node somewhere near the goal
Node random = RandomSample(goal);
// Get the closest node in the tree to the sample.
Node closest = t.GetClosestNode(random);
// Create a new node between the closest node and the sample.
Node extension = ExtendToward(closest, random);
// If we managed to create a new node, add it to the tree.
if (extension)
{
closest.AddChild(extension);
// If we haven't yet reached the goal, and the new node
// is very near the goal, add the goal to the tree.
if(!reachedGoal && extension.IsNear(goal))
{
extension.AddChild(goal);
reachedGoal = true;
}
}
iter++;
}
return t;
}
RandomSample및 ExtendToward기능 을 수정하면 매우 다른 트리를 얻을 수 있습니다. 경우 RandomSample단지 균일하게 샘플 모든 곳에서, 나무는 모든 방향으로 균일하게 성장할 것입니다. 목표를 향해 편향되면 나무는 목표를 향해 자라는 경향이 있습니다. 항상 목표를 샘플링하면 시작부터 목표까지 직선이됩니다.
ExtendToward나무에 흥미로운 일을 할 수 있습니다. 우선, 벽과 같은 장애물이있는 경우 벽 과 충돌하는 확장을 거부 하여 나무가 그 주변 에서 자라는 것을 얻을 수 있습니다 .
목표를 향해 샘플링을 바이어스하지 않을 때의 모습입니다.

(출처 : uiuc.edu )
그리고 여기 벽이있는 모습이 있습니다.
RRT가 완료되면 몇 가지 멋진 속성 :