2012-01-25 2 views
3

C#/WPF를 사용하여 의료 데이터 용 데이터 시리즈 뷰어 프로그램을 디자인하고 있습니다 (프로그래밍하지 않음). 일반적인 마우스 팬/줌 기능 (왼쪽 드래그로 팬, 스크롤로 수평 줌, 더블 클릭으로 수직 자동 맞춤, 오른쪽 드래그로 선택)과 함께 데이터를 보여주는 하나의 기본 패널이 있습니다.플로터 GUI 구성 요소의 자체 스케일링 자에 대한 알고리즘

문제는 오디오 편집 (goldwave, audacity),지도 제작 (gpsTrackmaker) 및 ilustration (photoshop, inkscape) 프로그램에서 볼 수있는 것처럼 상단/왼쪽에 눈금자가있는 가로 및 세로 눈금이 필요합니다. 게다가이 눈금자는 대부분의 플로팅 API (Matlab, GNUPlot, Matplotlib)와 심지어 사무실 프로그램 (Excel, Calc)에서도 구성 가능합니다.

항상 필수 요소는 콘텐츠에 항상 정렬되고 크기가 조정되는 것 외에 레이블이 "타격"되거나 서로 가려지지 않고 가능한 최대 입도로 틱 레이블을 그리는 "안티 클러 터 (anti-clutter)"알고리즘을 갖추는 것입니다.

다음은 Inkscape에서 같은 그림의 두 가지 확대/축소 수준을 보여주는 이미지입니다. 첫 번째 행은 백 개의 라벨을 보여줍니다. 두 번째 행은 각 10 년 레이블을 보여줍니다.

"이 (자동 눈금자의 해상도)이 많은 프로그램에서 해결 된 문제인 것 같으므로 사용할 수있는 자원/자습서를 어떻게 찾아야합니까? 내 요구에 맞는 컨트롤? "

나는 C#에서 모든 제안이나 예제를 사용하여 주시면 감사하겠습니다. 그러나 어떤 언어에서도 가능합니다. 눈금자

enter image description here

답변

4
  • W = 표시 protion
  • X = 범위 (좌우) 라벨 폭

n = W/w (최대 수 = W W

  • 로 표시 표시 할 수있는 레이블)

    x = X*w/W (최소 범위 두 레이블 사이)

    그런 다음 x를 더 큰 값 (1, 2 또는 5)으로 반올림해야합니다. 예

    • x=18.4 =>x1=20
    • x=539 =>x1=1000

    w1 = x1/X*W (라벨 폭 또는 눈금 사이의 간격)

    n1 = W/w1 (진드기 수)

    들어

  • +0

    완벽하게 작동 시키려면 'w'가 LARGEST 라벨의 폭이어야합니다. 나는 그것을 테스트하지 않았지만 우리가 사용하는 알고리즘은이 개념을 사용합니다. – heltonbiker

    +0

    Brilliant! 슈퍼 놀라운 대답! 우리는 오랫동안 이것을 알아 내려고 노력했지만 반올림으로 인한 이상한 행동으로 버려졌습니다. 그 뒤에 이론적 인 수학 개념의 이름도 언급 할 수 있습니까? 예 : Scaling은 Affine 변환에 속합니다. 이것은에 속하는가? @커피 머신 –