번개를 생성하는 알고리즘이 있습니까?
볼트가 착륙하는 위치를 지정하는 세그먼트 또는 점 객체 목록을 생성하는 알고리즘을 원합니다. 이 방법에는 엔드 포인트와 함께 시작점 매개 변수가 필요합니다. 볼트에는 임의의 가지가 떨어지고 임의의 간격으로 지그재그가 있어야합니다. 결과는 다음과 같은 임의의 번개 효과가됩니다.
(출처 : 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가 완료되면 몇 가지 멋진 속성 :