n 차원의 n 큐브를 나타내는 점 구름의 좌표를 나타내는 데이터를 생성하고 싶습니다. 이 점들은 n- 공간 전체에 고르게 분포되어야하며, 그 사이에 사용자가 정의한 간격으로 생성 할 수 있어야합니다. 이 데이터는 배열에 저장됩니다.C++ n 차원 튜플의 데카르트 곱 집합을 생성하는 방법
답변
나는 cartesian product using Boost.MPL의 구현을 발견했다.
Boost에는 실제 데카르트 제품이 있지만 전처리 지시어입니다.이 제품은 아무 쓸모가 없다고 가정합니다.
칭찬은 제 질문을 완전히 대답하지는 않지만 읽는 데 다소 유용한 예제입니다. – Ben
간단한 것을 유지하려면 여기에 일반 큐브의 예가 있습니다. 즉, 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 차원 배열을 선언하십시오. 그런 다음 컴파일러에서 대신 색인 산술을 작성해야합니다.
나는 이것이 당신이 원하는 것이 아니라고 당신에게 말할 것이라고 기대합니다! 그렇지 않으면 명확히 할 수 있습니다.
당신이 반복적으로 (의사) 할 수이것이 내가 원하는 것입니다.하지만 제가 쫓고있는 것은 특정 문제가 아니라 일반적인 해결책입니다. 이것은 내가 쫓고있는 것입니다. 친구가 나를 위해 질문을 수정했습니다. 3 차원 이상의 기하학에 대한 배경 지식이 없으므로 설명하기가 어려웠습니다. – Ben
@Ben : OK, 일반적인 해결책은 N-D 배열의 '평평한'표현 인 1-D 배열을 만드는 것입니다. –
나는 n 차원의 재귀를 구현하는 방법을 궁금해했다. 그래서 모든 n 차원에 대해 좌표를 생성하는 일반적인 방법이있다. 스스로를 호출하는 함수를 갖는 것은 내가 생각한 한 가지 방법 이었지만 이것은 불필요하고 지저분 해 보입니다. – Ben
:
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, "") 하이퍼 큐브를; 이렇게하면 모든 점의 좌표가 인쇄되지만 구조에 저장할 수도 있습니다.
이 숙제입니까? – Cetra
개인적인 이익이 아닙니다. – Ben