Chart, optymalizacja kodu

0

Cześć,

Potrzebuję możliwie szybkiej i nie obciążającej obsługi wyświetlania danych na wykresie w Windows Form Application. Dodatkowo chciałbym, żeby obsługa wykresu była jak najbardziej manualna, to jest zlikwidować autodopasowywanie osi itp. Chciałbym także sterować ilością miejsc po przecinku w wyświetlanych wartościach. Niestety nie znalazłem nic interesującego na wyżej wymienione tematy. Jak na razie robiłem to w taki sposób:

 
Chart.Series["series1"].Points.Clear();

            byte[] Bytes_array = new byte[Double_Number_of_Points];
            serialPort1.Read(Bytes_array, 0, Double_Number_of_Points);

            ushort joined, index = 0, max_amp = 0, min_amp = 1023; //1023 - maksymalna wartość joined
            byte High, Low;

            for (int i = 0; i < Number_of_Points; i++)
            {
                Low = Bytes_array[index];
                index++;
                High = Bytes_array[index];
                index++;
                joined = Join_bytes(High, Low); //funkcja 2x 8bit => 16bit

                if (joined > max_amp) max_amp = joined;
                if (joined < min_amp) min_amp = joined;

                Chart.Series["series1"].Points.AddXY(i * Constants.ValueX_i, joined * Constants.constant_amplitude);
            }

oraz obsługa "automatycznego" dopasowywania osi Y:

if (Auto_checkbox.Checked == true) 
            {
                Chart.ChartAreas[0].AxisY.Maximum = (max_amp + 5) * Constants.constant_amplitude;
                Chart.ChartAreas[0].AxisY.Minimum = (min_amp - 5) * Constants.constant_amplitude;
            }

Na pewno da się to zrobić lepiej, i tu liczę na wasze rady i podpowiedzi, gdyż z tego typu problemem jeszcze nie miałem do czynienia.
Dzięki wielkie!

0

W związku z poleceniem WPF do tego zadania, pobrałem WPF Toolkit'a tylko mam problem z dwoma rzeczami:

Po pierwsze muszę usunąć tą legendę z Charta... Znalazłem tutaj (http://stackoverflow.com/questions/3595222/hide-legend-of-wpf-toolkit-chart-with-more-than-one-data-series) jak się ludzie z tym uporali, tylko nie mam pojęcia w które miejsce wsadzić ten kod, bo wszędzie mi błąd wyskakuje:

<charting:Chart>
    <charting:Chart.LegendStyle>
        <Style TargetType="datavis:Legend">
            <Setter Property="Width" Value="0" />
        </Style>
    </charting:Chart.LegendStyle>
 

No a po drugie nie wiem czy aby takie wrzucanie punktów na wykres jest odpowiednie:

((LineSeries)myChart.Series[0]).ItemsSource = new KeyValuePair<double, double>[]
            {
            new KeyValuePair<double, double>(1, 1),
            new KeyValuePair<double, double>(2, 2),
            new KeyValuePair<double, double>(3, 3)
            };
 

Może coś w tym stylu? Tylko działającego :)

double x_i, y_i;
            for (int i = 0; i < 3; i++)
            {
                x_i = y_i = i;
                ((LineSeries)myChart.Series[0]).Points.Add(new Point(x_i, y_i));
            }
 

Bardzo proszę o pomoc

0
Szybki_dzik napisał(a):

tylko nie mam pojęcia w które miejsce wsadzić ten kod, bo wszędzie mi błąd wyskakuje:

charting:Chart
charting:Chart.LegendStyle
<Style TargetType="datavis:Legend">
<Setter Property="Width" Value="0" />
</Style>
</charting:Chart.LegendStyle>



Jaki błąd? Umieściłeś definicje z odpowiedzi?

xmlns:charting="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:datavis="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:chartingprimitives="clr-namespace:System.Windows.Controls.DataVisualization.Charting.Primitives;assembly=System.Windows.Controls.DataVisualization.Toolkit"



 > ##### [Szybki_dzik napisał(a)](http://4programmers.net/Forum/1269237):
> No a po drugie nie wiem czy aby takie wrzucanie punktów na wykres jest odpowiednie
> 
```csharp
((LineSeries)myChart.Series[0]).ItemsSource = new KeyValuePair<double, double>[]
            {
            new KeyValuePair<double, double>(1, 1),
            new KeyValuePair<double, double>(2, 2),
            new KeyValuePair<double, double>(3, 3)
            };
 

Zamist KeyValuePair<double, double> w tablicy możesz użyć Point w kolekcji PointCollection jeśli to mają być określone punkty.

((LineSeries)myChart.Series[0]).ItemsSource = new PointCollection()
{
    new Point(1, 1),
    new Point(2, 2),
    new Point(3, 3)
};

Jeżeli chcesz zrobić punkty np. od 1,1 do 10,10 to wiadomo, że pętla będzie lepsza.

for (int i = 0; i < 10; i++)
   ((LineSeries)myChart.Series[0]).ItemsSource.Add(new Point(i, i));

1 użytkowników online, w tym zalogowanych: 0, gości: 1