커브 선분의 진 직도 측정 (폴리 라인으로 표시)


11

자동 고도 등고선 라벨링 알고리즘을 사용하고 있으며 라벨의 위치를 ​​결정할 때 고려해야 할 요소 중 하나는 등고선의 특정 세그먼트가 "직선"인 방법입니다. 직선 일수록 해당 세그먼트에 레이블을 배치하는 데 사용될 가능성이 높습니다.

각 윤곽선은 폴리 라인으로 표시됩니다 (점은 육안으로 곡선처럼 보이도록 서로 가깝습니다). 그런 다음 고정 길이 (라벨 너비), 예를 들어 100 픽셀이 있습니다. 너비가 100 픽셀 인 등고선을 무작위로 (또는 그렇지 않으면) 선택하면 직선 성의 수치 정량적 값을 얻을 수 있기를 원합니다. 직선 세그먼트,이 값은 구부러짐이 증가함에 따라 증가합니다).

답변을 검색했지만 실제로 유용한 것을 찾을 수 없었습니다. 나는 어떤 포인터에 대해서도 감사 할 것입니다.

답변:


9

답은 상황에 따라 다릅니다 . 적은 수의 세그먼트 만 조사하는 경우 계산 비용이 많이 드는 솔루션을 제공 할 수 있습니다. 그러나이 계산을 좋은 라벨 포인트 검색에 포함시키는 것이 좋습니다. 그렇다면, 후보 라인 세그먼트가 약간 변할 때 계산 속도가 빠르거나 솔루션을 신속하게 업데이트 할 수있는 솔루션을 갖는 것이 큰 이점이다.

예를 들어 체계적인 검색을 수행한다고 가정합니다.점 P (0), P (1), ..., P (n)의 시퀀스로 표시되는 등고선의 전체 연결된 구성 요소를 가로지 릅니다. 이것은 하나의 포인터 (시퀀스로의 색인) s = 0 ( "시작"의 경우 "s")을 초기화하고 다른 포인터 f ( "종료"의 경우)는 거리 (P (f), P (s))> = 100, 그런 다음 거리 (P (f), P (s + 1))> = 100 동안 s를 진행합니다. 그러면 후보 폴리 라인 (P (s), P (s +)이 생성됩니다. 1) ..., P (f-1), P (f)) 평가. 레이블을 지원하기 위해 "적합성"을 평가 한 후에는 s를 1 씩 증가시키고 (s = s + 1) 후보 폴리 라인이 최소값을 다시 초과 할 때까지 f를 f (예) f '및 s (s)를 s'로 증가시킵니다. 100의 범위는 (P (s '), ... P (f), P (f + 1), ..., P (f'))로 표시됩니다. 그렇게하면 정점 P (s) ... P (s ' 삭제되고 추가 된 정점에 대한 지식만으로도 체력을 빠르게 업데이트 할 수 있어야합니다. (이 스캔 절차는 s = n까지 계속됩니다. 평소와 같이 f는 프로세스에서 n을 다시 0으로 "랩핑"해야합니다.)

이 고려 사항 은 그렇지 않을 수도있는 많은 가능한 체력 측정 ( 신성 , 비틀림 등)을 배제 합니다. 기본 데이터가 약간 변경 될 때 일반적으로 빠르게 업데이트 될 수 있기 때문에 L2 기반 측정 을 선호 합니다. Principal Components Analysis 와 비유 하면 다음과 같은 측정법을 사용할 수 있습니다 (요청에 따라 작을수록 좋습니다). 공분산 행렬 의 두 고유 값 중 작은 을 사용하십시오점 좌표의. 기하학적으로, 이것은 폴리 라인의 후보 섹션 내에서 꼭짓점의 "일반적인"좌우 편차의 한 가지 척도입니다. (한 해석은 제곱근이 타원의 작은 반축으로 폴리 라인 정점 의 두 번째 관성 모멘트를 나타냅니다 .) 공선 정점 세트의 경우에만 0이됩니다. 그렇지 않으면 0을 초과합니다. 폴리 라인의 시작과 끝으로 생성 된 100 픽셀 기준선에 대한 평균 좌우 편차를 측정하므로 간단한 해석이 가능합니다.

공분산 행렬은 2x2에 불과하므로 단일 이차 방정식을 풀면 고유 값을 빠르게 찾을 수 있습니다. 또한 공분산 행렬은 폴리 라인에서 각 정점의 기여도의 합입니다. 따라서 점이 누락되거나 추가 될 때 빠르게 업데이트 되어 n- 포인트 윤곽선에 대한 O (n) 알고리즘으로 이어집니다. 이것은 응용 프로그램에서 구상 한 매우 상세한 윤곽선으로 확장됩니다.

이 알고리즘의 결과에 대한 예는 다음과 같습니다. 검은 점은 윤곽의 꼭짓점입니다. 빨간색 실선은 해당 컨투어 내에서 종단 간 길이가 100보다 큰 후보 폴리 라인 선분입니다. (오른쪽 상단의 시각적으로 명백한 후보는 충분히 길지 않습니다.)

그림


와우, 당신은 내가 거기에서 길을 잃게했습니다 :). 당신은 체계적인 검색에 대해 옳았습니다. 각 폴리 라인 / 폴리곤 버텍스의 탄젠트 (수평 라벨은 수직 라벨보다 선호)를 얻기 위해 이미 그렇게 했으므로 이론적으로 다른 검색을 포함하도록이 검색을 확장 할 수 있습니다. BTW : 실제 알고리즘을 사용하거나 수동으로 샘플 플롯을 생성 했습니까?
Igor Brejc

1
그림은 실제이지만 필자가 사용한 구현에서는 공분산 업데이트 절차를 사용하지 않으므로 계산 상 최적이 아닙니다.
whuber

2
마지막 그래프는이 답변을 더욱 멋지게 만듭니다
Ragi Yaser Burhum

2
이고르 (Igor), 라벨 방향은 무료라고 언급해야합니다. 타원의 주축 방향 (더 큰 고유 값과 관련된 고유 벡터)에 의해 제공됩니다. 따라서 레이블 방향과 윤곽 섹션 선형성의 최상의 조합을 위해 효율적인 방식으로 동시에 검색 할 수 있습니다.
whuber

3

컴퓨터 그래픽 커뮤니티에서는 종종 개체 주위에 경계 상자를 찾아야합니다. 결과적으로 이는 빠른 알고리즘으로 잘 연구 된 문제입니다. 예를 들어 Wikipedia의 최소 경계 상자 알고리즘 기사를 참조하십시오 . 폴리 라인을 둘러싼 최소 면적 직사각형을 찾은 다음 직사각형의 종횡비, 높이 / 길이를 사용할 수 있습니다. 보다 정확한 측정을 위해이 경계 사각형의 중심선에서 폴리 라인의 편차를 볼 수 있습니다.


1
나는 min을 사용하는 것에 대해 생각했다. 경계 상자, 그러나 두 가지 문제가 있습니다. 동일한 진폭이지만 다른 웨이브주기를 갖는 곡선).
Igor Brejc

1
GIS 페이지에서 만나서 반가워요, 조셉!
whuber

1
그렇습니다, 나는 당신의 "Computational Geometry in C"책을 지금 내 손에 가지고 있습니다 :)
Igor Brejc

1
환영합니다, 여러분 감사합니다! :-) 내 제안이 이상적인 척도는 아니지만 코딩이 기성품이라는 것을 알고 있습니다 (적절한 선반이있는 경우). 이러한 유형의 문제는 가공 상황에서 상당히 연구되어 가공 된 부품의 품질을 측정해야합니다.
Joseph O'Rourke

3

이것이 도움이되는지 또는 답변으로 간주되는지 모르겠지만 방금 게시 한 질문에 대해 생각하면서 여기에 앉아 생각을했습니다.

등고선에 특정 반경의 원을 배치하면 어떻게됩니까? 이 원은 적어도 두 곳에서 등고선과 교차합니다. 선이 똑 바르면 두 교차점 사이의 등고선을 따라 거리가 짧아집니다. 교차점 사이의 등고선을 따라 거리가 길수록 선이 더 곡선이됩니다. 교차점이 두 개 이상인 경우 등고선이 너무 곡선입니다.

직선 성이 가장 좋은 길이를 알아낼 수있는 길이를 파악하고 각 등고선을 따라 단계별로 설정하고 직선이있는 위치에 레이블을 배치하십시오.

나는 이것이 너무 도움이되지 않는다고 확신하며, 영어로 말하는 것은 사용중인 프로그래밍 언어에서 훨씬 더 어렵지만 시작일 수 있습니까?


재미있는 생각. 더 간단하게하기 위해 한쪽의 세그먼트 길이와 시작점과 끝점 사이의 거리 사이의 비율을 계산할 수 있습니다. 정확하지는 않지만 계산이 빠릅니다. 그리고 원을 사용하려는 아이디어는 진 직도를보다 정확하게 계산할 수 있습니다.
Igor Brejc

3

내가 생각할 수있는 가장 쉬운 방법은 시작과 끝 사이의 실제 경로 길이와 시작점에서 끝점까지의 최단 거리 (직선) 사이의 비율입니다. 직선의 비율은 1에 가까우며 곡선의 비율은 매우 높습니다.

이것은 구현하기가 정말 쉬워야합니다.


업데이트 : Mike가 올바르게 알았 듯이 Sinuosity와 같습니다 .

여기에 이미지 설명을 입력하십시오


그냥 :) 렉스의 답변을 읽은 후 내 마음에 온 것
이고르 Brejc에게

4
기본적으로 sinuosity
Mike T

정확히 :) ....
어둡게

2
레이블을 지정할 적절한 세그먼트를 검색 할 때 길이를 업데이트하는 것이 연속 정점 사이의 길이를 더하고 빼는 것만 큼 간단하기 때문에 이것이 구현하기 쉽다는 것이 맞습니다. 그러나 sinuosity는 곡선이 선형성을 벗어날 수있는 감각을 효과적으로 포착하지 못합니다. 예를 들어, 지름 100 의 반원을 지름 1선형 반원의 시퀀스와 비교하십시오 . 두 곡선은 동일한 sinuosity를 갖지만 첫 번째의 좌우 편차는 두 번째 곡선의 100 배입니다. 라벨의 경우).
whuber

폴리 라인이 원을 그리면이 방법을 사용하면 원하는 결과가 아닌 무한한 sinuosity를 얻을 수 있습니다.
obchardon

1

"곡률"과 "폴리 라인"을 검색하여이 정보를 얻었습니다 . 폴리 라인의 곡률을 어떻게 찾을 수 있습니까? . 거기서 곡률의 정의로 돌아가는 것이 좋습니다 - K= DF/Ds. 여기서 F그는 phi또는 T위키 백과의 표기법 ( http://en.wikipedia.org/wiki/Curvature )을 의미합니다.

p0, p1 및 p2의 시퀀스가 ​​3 개 있다고 가정합니다. 점이 서로 충분히 가깝다고 가정 할 때 ss의 델타 인 p0과 p1 사이의 거리 를 계산 Ds합니다. 그런 다음 DTp0와 p1 사이의 단위 접선 벡터에서 변경되는 T ( )의 델타가 필요합니다 . 정교한 방법이있을 수 있지만 원유 방법은 두 개의 pector p0-> p1, p1-> p2를 취하고 각각의 길이를 갖도록 정규화 한 다음 그 두 벡터를 빼고 크기를 결정하는 것으로 생각할 수 있습니다. 그렇습니다 DT. 나눗셈 곡률을 산출합니다 K0_1. p1, p2 및 p3을 잡고 계산 K1_2합니다.

그래도 윤곽선을 렌더링 된 픽셀이 아닌 폴리 라인으로 유지하는지 궁금합니다. 100px라고 했으므로 조금 걱정할 수 있습니다.


링크 주셔서 감사합니다, 나는 그 뒤에 수학을 공부해야합니다. 렌더링 된 레이블 텍스트가 특정 너비 (픽셀)를 가지고 있기 때문에 100px를 언급했지만 100px는 단지 예입니다.
Igor Brejc

곡률에 대한 생각은 좋은 생각입니다. 충분한 길이의 심하게 매끄럽게 처리 된 윤곽 부분의 곡률은 적절할 수 있지만 곡률 자체는 적합하지 않습니다. 예를 들어 하나의 작은 지그재그는 곡률이 매우 높지만 전체적으로 중요하지 않습니다. 따라서 실제로 폴리 라인의 여러 섹션에서 선형성에 대한 편차의 통계 요약을 사용하게됩니다. 가능성있는 후보 중에서 곡률은 수행하기에 더 복잡한 계산 중 하나입니다.
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.