2011-01-08 5 views
1

큰 2 차원 그림을 시각화하기 위해 tk를 사용하여 perl 응용 프로그램을 작성하고 싶습니다 (2D 이미지로 간주 될 수 있음). 스크롤 및 크기 조정이 필요합니다. 또한 전체 이미지를 메모리에 저장할 필요가 없습니다.perl-tk : 상호 작용이 큰 2d 래스터 데이터를 시각화합니다 (xvcg와 같이)

하나의 거대한 그림에 저장하기에는 너무 크지만 그 중 일부를 쉽게 다시 그릴 수 있습니다. 그래서이 데이터를 대화 형 모드로 보려면 그래픽 응용 프로그램을 작성하고 싶습니다. 이 그래프를 위해 할 xvcg 것 같다 : http://blogs.oracle.com/amitsaha/resource/blog-shots/apt-rdepends.png (이 인터페이스의 예입니다 x와 y 스크롤 바, 줌 바있다.) 내 데이터가 얇은 (1 x 1 픽셀) 라인 텍스트없이 http://www.access-excel-vba.com/giantchart.png 같은 비트 보이는

는 그 (것)들에 점의 다량은 (지금) 33000x23000에서 크기가 있고 더 클 것이다. 픽셀 당 2 비트 이미지를 사용합니다.

그렇다면 perl/tk에서 스크롤 및 확대/축소가 가능한 이미지 뷰어를 어떻게 프로그래밍 할 수 있습니까? 요구 사항은 전체 이미지를 메모리에 저장하는 것이 아니라 (190Mb 이상이 될 것입니다!), 일부 기능에 부분적으로 그려달라고 요청하십시오.

언어/툴킷 선택 정보. 내 데이터 생성기는 perl로 작성되었으며 OS는 유닉스/POSIX이므로 언어를 전환하지 않기를 원합니다. 다른 그래픽 툴킷으로 전환 할 수 있지만 perl/tk는 대상 PC에 사전 설치되어 있습니다.

답변

2

Canvas 위젯을 사용하십시오. 이미지를 배치하거나 직접 그릴 수 있습니다.이 경우 기본 제공 scale 메서드가 크기 조절을 처리합니다. 스크롤링을위한 오른쪽 핸들러를 사용하면 이동하면서 메모리 사용을 합리적으로 유지하면서 동적으로 내용을로드하고 언로드 할 수 있습니다. 예 : -xscrollcommand의 콜백은 언로드 된 영역으로 오른쪽으로 스크롤하고 해당 영역의 내용을로드 할 때이를 감지합니다. 한 번 항목을 언로드 한 다음 화면을 벗어날 수 있습니다.

2

재미 있겠지만, 최선의 방법은 효율적인 2D 타일 스크롤링 게임 작성에 대한 몇 가지 기사를 살펴 보는 것입니다. 이전에 Java로 설명한 내용을 작성했지만 핵심 개념은 동일합니다. 이미지를 작은 타일로 나누는 방법을 파악할 수 있다면 가시적 인 부분 만 스트리밍하고 크기를 조절할 수 있습니다.

또는 전체 이미지를 디스크로 렌더링 한 다음 http://www.labnol.org/internet/design/embed-large-pictures-panoramas-web-pages-google-maps-image-viewer/2606/과 같은 것을 사용할 수 있습니다. Google지도는 앞서 언급 한 것과 동일한 문제를 훨씬 더 큰 규모로 다루고 있습니다. 이 기술은 사용자가 작성한 이미지를 깨뜨린 다음 브라우저 기반 솔루션에 피드를 제공 할 수있게합니다. Perl 요구 사항을 벗어나지 만 사용자의 요구에 맞을 수도 있습니다.

+0

그것은 일반적인 경우에 좋은,하지만 빠르게 원하는 : 여기

은 (모듈의 예에서하는 시어 핀 스키 삼각형을 그리는이 경우) <canvas> 요소를 사용하는 방법을 보여주는 간단한 예제입니다 내 사건을 해결하라. perl과 tk를 사용하면 빠르게 개발할 수 있습니다. 또한, 타일 (gmaps와 같은)에 대해서는 1 분 전에 생각합니다. 이미지를 조각 낼 때 매우 빠릅니다 (1Mpix의 경우 0.5 초). 이것은 게임이 아닌 프로그래머 유틸리티이므로 두 번째 부분을 기다리는 것이 정상입니다. – osgx

+0

타일의 크기가 256x256 pix 인 경우 128x90 타일이 거의 필요하지 않습니다. 그리고 나는 다른 이미지를 많이 분석하기를 원하기 때문에 모든 이미지에 11520 개의 타일과 더 많은 것을 저장해야합니까 ??? 그러나 이미지를 생성하는 데 사용 된 데이터는 구조가 잘되어있어 1 개의 파일에 저장할 수 있습니다. – osgx

1

캔버스 (기본적으로 Michael Carman과 NBJack이 제안하는 것)에서 바둑판 식으로 배열 된 사진 이미지로 작업하고 싶지 않은 경우 사용자 지정 이미지 유형을 작성할 수 있습니다 (일부 C 코드 필요). 구현해야하는 API는 Tk_CreateImageType입니다.이 API를 사용하면 이미지의 5 가지 핵심 요소 (작성 방법, 표시 가능한 컨텍스트에 설치, 그리기, 컨텍스트에서 릴리스 및 삭제)를 사용자 정의 할 수 있습니다. 나는 말했어 - 그러나 이것은 경험할 수있는 말로는 말할 것도 없습니다 - 이것은 구현하기에 합리적으로 쉬운 API입니다. 이 작업을 수행하는 한 가지 장점은 사진 이미지 유형 (예 : 드문 디스플레이 유형 처리와 같은 모든 종류의 이모티카 포함)과 거의 같은 복잡성을 필요로하지 않으므로보다 효율적인 데이터 구조를 사용할 수 있고 더 빠릅니다 처리.

1

샘플 데이터를 보면 다양한 웹 기술 (배경색이있는 방대한 표 또는 HTML <canvas> 태그가있는 처음부터 렌더링 됨) 내부에 들어갈 수 있습니다.

Perl의 경우 많은 서버 측 웹 개발 기술 중 하나를 사용하거나 XUL::Gui과 같은 것을 사용할 수 있습니다.이 모듈은 기본적으로 Firefox (또는 기타 지원되는 브라우저)를 GUI 렌더링 엔진으로 사용합니다 Perl 용.

use strict; 
use warnings; 
use XUL::Gui 'g->'; 

my $width = 400; 
my $height = sqrt($width**2 - ($width/2)**2); 

g->display(
    g->box(
     g->fill, 
     g->middle, 
     style => q{ 
      background-color: black; 
      padding:   40px; 
     }, 
     g->canvas(
      id  => 'canvas', 
      width => $width, 
      height => int $height, 
     ) 
    ), 
    g->delay(sub { 
     my $canvas = g->id('canvas')->getContext('2d'); 
     $canvas->fillStyle = 'white'; 

     my @points = ([$width/2, 0], 
      [0, $height], [$width, $height], 
     ); 
     my ($x, $y) = @{ $points[0] }; 
     my $num = @points; 
     my ($frame, $p); 
     while (1) { 
      $p = $points[ rand $num ]; 
      $x = ($x + $$p[0])/2; 
      $y = ($y + $$p[1])/2; 

      # draw the point with a little anti-aliasing 
      $canvas->fillRect($x + 1/4, $y + 1/4, 1/2, 1/2); 

      if (not ++$frame % 1_000) { # update screen every 1000 points 
       $frame % 100_000 
         ? g->flush 
         : g->doevents # keeps firefox happy 
      } 
     } 
    }) 
); 
+0

No-no-no. 웹용은 아닙니다. 그것은 C 프로그래머를위한 도구입니다, 그것은 xvcg (추한 X 응용 프로그램입니다)와 같을 수 있습니다. – osgx

+0

데이터는 테이블이 아니며 높이 1pixel의 긴 선이 많이 있습니다. 각 선에는 그것에 표시된 몇 점이 있습니다. 일반적인 경우에는 23000 개의 선이 있습니다. – osgx

+0

태그 Tk가 있습니다. 웹용 태그가 아닙니다. – osgx