2012-05-24 1 views
0

현재 포인트 그리드를 생성하는 알고리즘이 있습니다. x (lx) 길이와 y (ly) 길이의 형식으로 사용자로부터 입력을받으며 점을 간격을 두어 증가 또는 증가하는 값은 (dxdy)입니다. 나는 에 점이 필요하고 lxly에 의해 정의 된 경계 사각형의 가장자리 인을 항상 시작하고 끝내야합니다. 나는 몇 가지 방법을 시도했다 :균일 한 간격의 포인트 그리드 생성

int numintervalx = round(lx/dx), numintervaly = round(ly/dy); 
:

double startx = lx/-2.0, starty = ly/-2.0; 

내 첫 번째 방법은 점과 라운드의 수를 결정

경계 사각형의 시작 가장자리는 다음과 같이 정의된다


두 번째 방법은 점의 수를 결정하고 점의 수보다 큰 가장 가까운 정수를 사용합니다.

int numintervalx = ceil(lx/dx), numintervaly = ceil(ly/dy); 

내 세 번째 방법은 포인트의 수를 결정하고, 점들의 수보다 가까운 정수 덜 사용 델타가 다시 계산된다

int numintervalx = floor(lx/dx), numintervaly = floor(ly/dy); 

는 바운딩 박스에 맞게 :

dx = lx/double(numintervalx); 
dy = ly/double(numintervaly); 

이 그 다음 포인트 스스로 생성하는 for 루프에 공급하는 경우 :


for (int i = 0; i <= numintervaly; i++) 
    for (int j = 0; j <= numintervalx; j++) 
    { 
    double point[3] = {startx + dx * j, starty + dy * i, 0}; 
    } 
가까이 사용자 지정 그리드의 실제 격자를 만들 것 또 다른, 더 정확한 방법은 거기를 그 여전히 항상 가장자리에서 시작하고 끝나는가?

답변

1

생각해 걸릴 가이드에만 상기 사용자 입력을 처리 할 수있다. 이 경우 정수로 변환 할 때 추가되는 오류를 최소화하는 방법은 반올림입니다.최악의 경우는 사용자가 lx/dx가 0.5 인 값을 입력하면 반올림 오류 0.5를 의미합니다. 당신의 문제를 감안할 때, 이것이 당신이 할 수있는 최선의 방법입니다.

numpoints를 numintervals 또는 다른 것으로 이름을 바꾸는 것이 이상합니다. 실제로 numpoint보다 하나 더 많은 포인트를 만들면 좋습니다.

+0

이름 지정에 대한 좋은 지적. 또한 사용자가 최적이 아닌 생성 값을 사용하기로 결정하면 오류를 받아 들여야한다는 점을 분명히했습니다. – Drise

0

사용자가 lxly의 값을 각각 dxdy의 배수가되도록 요구합니다. 이것은 물론 기본적인 입력 검증이 필요하지만 실제 그리드가 항상 사용자 지정 그리드와 동일하고 가장자리가 항상 시작되고 끝나는 점을 보장합니다.

0

귀하의 의견은 lx이 (가) dx의 정수 배가되는 것이므로 분명히 문제가 될 수 있습니다. 따라서 이어야하며 입력에 nx을 입력하고 dx 또는 lx을 입력하는 것이 가장 이상적입니다.

또는, 즉 에러를 추가로 정수 변환

nx = int(ceil(lx/dx)); // get suitable number of points 
dx = lx/nx;    // set suitable spacing to fit range exactly 
+0

포인트의 수는 부적합합니다. 밀도가 중요합니다. – Drise

+0

@Drise 잘, 내 편집을 참조하십시오 --- 이것은 실제로 당신 만의 옵션 중 하나임을 깨달았습니다 ... – Walter

+0

그건 방법 # 2입니다. – Drise