데이터 시각화 WPF - 폭포

(A)의 구현 :

       최종 데이터의 전체 길이와 동일한 폭을 그려 상기 X 축 가상 캔버스 따라 인덱스를 이용하여 데이터의 요점 ([])는, 각각의 1 픽셀 *의 1 픽셀의 도면 데이터 크기가 인출된다. 플래그 저장 현재 그린 그래프 PreviousBitmap는, 그리기 모드) (로컬 1 픽셀 DrawingContext.DrawImage하여 Y 축 위에서 PreviousBitmap 콘텐츠 거리로 표시된 제 셋톱 데이터 드로잉 후 제 2 세트의 데이터를 계속 그릴 등등. 다음과 같이 핵심 코드는 다음과 같습니다

개인 무효 DoAddDataArray 요점 ([] arrPoints) 
{ 
    this.Dispatcher.Invoke (DispatcherPriority.Normal 새로운 액션 (() => 
    { 
        이중 dPixelWidth = 픽셀; 
        이중 dContainerWidth = this.VbxContainer.ActualWidth, 
        이중 dContainerHeight = this.VbxContainer.ActualHeight ; 
        이중 dPixelHeight = 픽셀 / 2D, 
        이중 dCellHeight = 1; 
        더블 dCellWidth = 1; 

        DrawingVisual과 DrawingVisual과 새로운으로 DrawingVisual = (); 
        drawingContext drawingContext drawingVisual.RenderOpen = (); 
        drawingContext.DrawRectangle (새 SolidColorBrush (Colors.Blue), 
                새로운 펜 ( ), 새로운 사각형 (0, 0, dPixelWidth, dCellHeight));

        //绘制新数据
                  
        용 INT (I = 0; I <arrPoints.Length; I ++) 
        { 
            이중 dCellX Math.Round = (((arrPoints [I] .X - MinAxisX) / (MaxAxisX - MinAxisX)) * 픽셀); 
            이중 DY는 arrPoints [I]를 .Y =; 
            컬러 oColor = this.GetColor (DY); 
            //drawingContext.DrawRectangle(new SolidColorBrush (oColor) 
            // 새로운 펜 (), 새로운 사각형 (dCellX, 0, dCellWidth, dCellHeight)); 
            LinearGradientBrush lineBrush = 새로운 LinearGradientBrush (); 
            lineBrush.GradientStops.Add (새 GradientStop (Colors.Transparent, 0)); 
            lineBrush.GradientStops.Add (새 GradientStop (oColor, 0.25));
            lineBrush.GradientStops.Add (새 GradientStop (oColor 0.5)); 
            lineBrush.GradientStops.Add (새 GradientStop (oColor, 0.75)); 
            lineBrush.GradientStops.Add (새 GradientStop (Colors.Transparent 1)); 
            drawingContext.DrawRectangle (lineBrush 새로운 펜 (), 새로운 사각형 (dCellX-1, 0, dCellWidth + 2 dCellHeight)); 
        }     

        //绘制历史数据
        (this.PreviousBitmap = 널!) 경우 
            drawingContext.DrawImage (this.PreviousBitmap, 새로운 사각형 (0, dCellHeight, dPixelWidth, dPixelHeight)); 
        drawingContext.Close (); 

        //生成图像处理
        RenderTargetBitmap rtbCurrent = 새로운 RenderTargetBitmap ((int)를 dPixelWidth, 
            (INT) dPixelHeight, 96, 96, PixelFormats.Pbgra32) 
        rtbCurrent.Render (DrawingVisual과를) 

        this.PreviousBitmap = rtbCurrent // 현재 그린 히스토리 저장, 직접 다음 드로잉 호출
        this.ImgMain.Source = rtbCurrent // 표시 화상이 그려진 
    ))} 
}

영업 실적

 

두 가지의 구현 :

        최종 데이터의 전체 길이와 동일한 폭을 그려 상기 X 축 가상 캔버스 따라 인덱스를 이용하여 데이터의 요점 ([])는, 각각의 1 픽셀 *의 1 픽셀의 도면 데이터 크기가 인출된다. 직사각형이 Rectangle.Fill 속성에 할당 될 것이다 플롯 생성 직사각형 적 제어 StackPanel에의 삽입에 의해 생성 된 제 동안 그려진 것이다. 다음과 같이 핵심 코드는 다음과 같습니다

private void DoAddDataArray(Point[] arrPoints)
{
    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => 
    {
        double dPixelWidth = Pixel;
        double dContainerWidth = this.VbxContainer.ActualWidth;
        double dContainerHeight = this.VbxContainer.ActualHeight;
        double dPixelHeight = Pixel / 2d;

        DrawingVisual drawingVisual = new DrawingVisual();
        DrawingContext drawingContext = drawingVisual.RenderOpen();
        drawingContext.DrawRectangle(new SolidColorBrush(Colors.Blue),
                new Pen(), new Rect(0, 0, dPixelWidth, 1));

        // 绘制新数据
        double dCellHeight = 1;
        double dCellWidth = 1;
        for (int i = 0; i < arrPoints.Length; i++)
        {
            double dCellX = Math.Round(((arrPoints[i].X - MinAxisX) / (MaxAxisX - MinAxisX)) * Pixel);
            double dY = arrPoints[i].Y;
            Color oColor = this.GetColor(dY);
            //drawingContext.DrawRectangle(new SolidColorBrush(oColor),
            //    new Pen(), new Rect(dCellX, 0, dCellWidth, dCellHeight));
            LinearGradientBrush lineBrush = new LinearGradientBrush();
            lineBrush.GradientStops.Add(new GradientStop(Colors.Transparent, 0));
            lineBrush.GradientStops.Add(new GradientStop(oColor, 0.25));
            lineBrush.GradientStops.Add(new GradientStop(oColor, 0.5));
            lineBrush.GradientStops.Add(new GradientStop(oColor, 0.75));
            lineBrush.GradientStops.Add(new GradientStop(Colors.Transparent, 1));
            drawingContext.DrawRectangle(lineBrush, new Pen(), new Rect(dCellX - 0.5, 0, dCellWidth + 1, dCellHeight));
        }
        drawingContext.Close();

        // 生成图像处理
        RenderTargetBitmap rtbCurrent = new RenderTargetBitmap((int)dPixelWidth, (int)1, 96, 96, PixelFormats.Pbgra32);
        rtbCurrent.Render(drawingVisual);

        Rectangle rect = new Rectangle();
        rect.Width = Pixel;
        rect.Height = 1;
        rect.Fill = new ImageBrush(rtbCurrent);
        // SpContainers  ---- Stackpanel
        this.SpContainers.Children.Insert(0, rect);
        if (this.SpContainers.Children.Count > 500)
            this.SpContainers.Children.RemoveAt(500);
    }));
}

 运行效果:

대조적으로 인해 연속적으로 두 번째 방법은 새로운 직사각형을 삽입한다. 하나의 완전한지도 인 방법과는 달리 제시 컨트롤의 위치의 변화에 ​​대한 효과 아래로, 그것은 품질의 부족이다. 

성능 및 테스트 : 

       타이머는 임의의 테스트 데이터를 이용하여 생성. 1,000 데이터 포인트 1 내지 10 밀리 기. 초당 10 만 포인트의 상당을 그립니다.

릴리스 모드에서 테스트 할 때, 서브 - 모듈, 간신히 허용 가능한 성능 복수 켜. 

환경 :

 언어 : C #을

 프로젝트 : WPF

 도구 : 비주얼 스튜디오 2017

 체제 : Windows

 타사 플러그인 : 없음

            마이크로 채널 소스 코드를 다운로드하는 스캔 코드 :

추천

출처www.cnblogs.com/duel/p/11696065.html