2012-07-16 3 views
3

임의의 수의 세그먼트로 구성된 호에 눈금을 그려야합니다. 호는 GeneralPath 개체입니다.라인 서브 디비전을위한 알고리즘

호를 따라 n 눈금을 그려야합니다 (여기서 n은 알고리즘에 대한 입력 임). 호의 시작과 끝 부분에 진드기를 그려야합니다.

누군가 이러한 알고리즘을 찾을 수있는 포인터가 있습니까?

+1

라인이 수평선에 불과하거나 기울어 질 수 있습니까? 어떤 좌표 시스템을 사용하고 있습니까? 진드기는 선에 수직이어야합니까? 아니면 그것을 등 등 교차? ... –

답변

1

음, 선은 2D 벡터입니다. 방향을 잡고 길이를 구한 다음 n으로 나눈 다음 시작점, 방향 벡터 및 시작점과 틱 간의 거리를 사용하여 틱의 위치를 ​​계산합니다.

편집 :

뿐만 아니라 일부 의사 코드 : 이것은 당신에게 줄에 틱의 위치를 ​​제공해야

double unnormalizedDir.x = end.x - start.x; 
double unnormalizedDir.y = end.y - start.y; 

double length = sqrt(unnormalizedDir.x * unnormalizedDir.x + unnormalizedDir.y * unnormalizedDir.y); 

double dir.x = unnormalizedDir.x/length; 
double dir.y = unnormalizedDir.y/length; 

double tickLength = length/n; 

for(int i = 1; i <= n; i++) { 
    double tick.x = start.x + dir.x * i * ticklength; 
    double tick.y = start.y + dir.y * i * ticklength;  
} 

. 2D 벡터를 나타내는 클래스에 계산을 넣어야합니다. 기존의 형상 라이브러리를 사용하는 것이 좋습니다.

UPDATE는 :

당신이 GeneralPath이 방법을 사용하고 있기 때문에 부분적으로 만 적용됩니다. 현재 저는 현명한 알고리즘을 생각해 낼 수 없지만 경로 세그먼트를 선이나 호로 간주하여 반복 할 수는 있습니다. 틱 사이의 거리는 경로 길이를 n으로 나눈 값이고 경로 길이는 개별 세그먼트의 길이 합입니다.

그런 다음 세그먼트를 반복하고 두 진드기 사이에 정점 (시작점/끝점)이있는 경우 마지막 정점까지의 정점 거리를 계산하고 해당 정점 거리를 사용하여 위 알고리즘을 시작합니다 다음 진드기로. 그런

뭔가 :

double distToNextTick = pathLength/n; 
double distLastTickToNextVertex = ... ; //calculate 
while(distToNextTick > distLastTickToNextVertex) { 
    Point2D nextVertex = ... // get the vertex 
    distToNextTick -= distLastTickToNextVertex; 

    distLastTickToNextVertex = ...;// calculate again 
} 

if(distToNextTick == 0.0) { 
    //the tick is exactly on a vertex 
} 
else { 
    //the tick is on the segment starting at the last vertex 
    //for straight lines calculate as above 
    //for curves use an appropriate algorithm (depending on the type of curve) 
} 
+0

'length' calc에'x' 대신'y'가 있다고 생각하십시오.) ... –

+0

당신은 맞습니다. 바로 고칠 것입니다. – Thomas

1

당신은 정말 사용하려는 PathIterator (를 통해 GeneralPath의 getPath.)를 당신의 호를 구성하는 (약간 평평) 세그먼트를 따라 걷는. 두 개의 패스를 만들 수 있습니다. 하나는이 세그먼트의 총 길이를 계산하고 다른 하나는 실제로 틱을 그립니다. 두 패스 사이에서 시작과 끝에서 틱을 보장하면서 원하는 틱 길이에 가장 가까운 틱 번호를 계산할 수 있습니다 (시작 또는 끝 틱이 다른 것과 너무 가까워 지도록 허용 할 수 있음). 그럼 당신은 단 하나의 패스가 필요합니다).

실제 드로잉 코드는 Thomas '와 유사하지만 반복기가 병합 경로를 통해 진행함에 따라 세그먼트 점프가 발생합니다.