Количество линий, которые можно нарисовать методом DrawLines

Я рисую серию линий на PrintPreviewControl, используя метод DrawLines. Вот мой код, в котором я беру значения x и y и преобразовываю их в координаты внутри прямоугольника страницы, добавляя их в список. Затем я вызываю DrawLines с помощью пера, и список преобразуется в массив. Я обнаружил, что DrawLines будет рисовать только 8125 линий, используя 8126 пар точек. Я не получаю никаких исключений при сбое DrawLines. Любой способ увеличить количество пар точек, которые будет использовать DrawLines? В качестве альтернативы, я мог бы нарисовать каждую линию отдельно или разбить массив точек на 8000 блоков точек.

Private Sub DrawGammaLog(ByVal gr As Graphics)
  Try
    'draw log in chart area
    If Points.Count <> 0I Then
      gr.SetClip(LogRect)
      Dim LPoints As New List(Of PointF)
      For Each pt In Points
        Dim PointY As Single = LogRect.Top + ((pt.Depth - VScaleMinValue) * VScale)
        Dim PointX As Single = LogRect.Left + (pt.Count * HScale)
        If PointY >= LogRect.Top AndAlso PointY <= LogRect.Bottom Then
          LPoints.Add(New PointF(PointX, PointY))
        End If
      Next
      Debug.Print("{0}", LPoints.Count)
      If LPoints.Count >= 2I Then gr.DrawLines(gpp.LogPen, LPoints.ToArray)
    End If
    'draw box around chart area
    gr.DrawRectangle(gpp.LogPen, Rectangle.Round(LogRect))
  Catch ex As Exception
    MessageBox.Show(ex.Message.ToString & ", " & ex.Source.ToString, Me.Text & " DrawGammaLog")
  Finally
    gr.ResetClip()
  End Try
End Sub

1 ответ

Та же проблема здесь с использованием C# в Visual Studio 2010. 8125 кажется пределом, даже если нет ссылок на эту проблему в Интернете...

В качестве обходного пути я разделил свой массив на блоки массивов 8000 PointF[].

int counter = 0;
int block_size = Math.Min(data.Length, 8000);
PointF[] data_subset;

while (counter != data.Length)
{
    data_subset = new PointF[block_size];
    Array.Copy(data, counter, data_subset, 0, data_subset.Length);
    g.DrawLines(p, data_subset);

    counter += block_size;
    block_size = Math.Min(data.Length - counter, 8000);
}
Другие вопросы по тегам