2010-06-09 4 views
5

n 차원의 n 큐브를 나타내는 점 구름의 좌표를 나타내는 데이터를 생성하고 싶습니다. 이 점들은 n- 공간 전체에 고르게 분포되어야하며, 그 사이에 사용자가 정의한 간격으로 생성 할 수 있어야합니다. 이 데이터는 배열에 저장됩니다.C++ n 차원 튜플의 데카르트 곱 집합을 생성하는 방법

+0

이 숙제입니까? – Cetra

+0

개인적인 이익이 아닙니다. – Ben

답변

2

나는 cartesian product using Boost.MPL의 구현을 발견했다.

Boost에는 실제 데카르트 제품이 있지만 전처리 지시어입니다.이 제품은 아무 쓸모가 없다고 가정합니다.

+0

칭찬은 제 질문을 완전히 대답하지는 않지만 읽는 데 다소 유용한 예제입니다. – Ben

1

간단한 것을 유지하려면 여기에 일반 큐브의 예가 있습니다. 즉, 3 차원 인 큐브 예입니다. 한 변의 길이를 1로하고 점의 간격을 1/n으로 지정한다고 가정하십시오. (이것은 점의 균일 한 직사각형 분포로 이어지고 있으며 이것이 당신이 원하는 것이라고는 확신 할 수 없습니다.)

이제 일부 의사 코드 :이 아무것도의 데카르트의 제품이 아니라 당신의 기준 (의 특별한 경우)를 만족하는 것 같다

for i=0;i<=n;i++ //NB i<=n because there will be n+1 points along each axis-parallel line 
    for j=0;j<=n;j++ 
     for k=0;k<=n;k++ 
      addPointAt(i/n,j/n,k/n) //float arithmetic required here 

참고. 간격을 다르게하려면 루프 시작 및 끝 인덱스 또는 간격 크기를 조정하십시오.

더 높은 임의의 지정된 차원으로 이것을 일반화하려면 더 많은 루프를 추가하십시오.

런타임까지 알 수없는 더 높은 차원으로 일반화하는 것은 약간 더 어렵습니다. N 차원 배열을 선언하는 대신 동일한 수의 요소로 1 차원 배열을 선언하십시오. 그런 다음 컴파일러에서 대신 색인 산술을 작성해야합니다.

나는 이것이 당신이 원하는 것이 아니라고 당신에게 말할 것이라고 기대합니다! 그렇지 않으면 명확히 할 수 있습니다.

당신이 반복적으로 (의사) 할 수
+0

이것이 내가 원하는 것입니다.하지만 제가 쫓고있는 것은 특정 문제가 아니라 일반적인 해결책입니다. 이것은 내가 쫓고있는 것입니다. 친구가 나를 위해 질문을 수정했습니다. 3 차원 이상의 기하학에 대한 배경 지식이 없으므로 설명하기가 어려웠습니다. – Ben

+0

@Ben : OK, 일반적인 해결책은 N-D 배열의 '평평한'표현 인 1-D 배열을 만드는 것입니다. –

+0

나는 n 차원의 재귀를 구현하는 방법을 궁금해했다. 그래서 모든 n 차원에 대해 좌표를 생성하는 일반적인 방법이있다. 스스로를 호출하는 함수를 갖는 것은 내가 생각한 한 가지 방법 이었지만 이것은 불필요하고 지저분 해 보입니다. – Ben

0

:

Function Hypercube(int dimensions, int current, string partialCoords) 
{ 
    for i=0, i<=steps, i++ 
    { 
    if(current==dimensions) 
     print partialCoords + ", " + i + ")/n"; 
    else if current==0 
     Hypercube(dimensions, current+1, "("+i); 
    else 
     Hypercube(dimensions, current+1, partialCoords+", "+i); 
    } 

} 

당신은 그것을 전화 : (N, 0, "") 하이퍼 큐브를; 이렇게하면 모든 점의 좌표가 인쇄되지만 구조에 저장할 수도 있습니다.

관련 문제