Я представляю интерполяционную кривую таким образом:
e.Graphics.DrawLines(new Pen(Color.Red), _interpolationPoints.ToArray());
, которая иногда вызывает исключение OverflowException.
Изучение массива _interpolationPoints показывает некоторые очень большие значения в научной нотации, например, {X = 0.0 Y = -1.985174E + 10}
Я подозреваю, что Y = -1.985174E + 10 - это значение, которое GDI + не может обработать. Это нормально, но каковы максимальные / минимальные значения X и Y, в которые я могу нарисовать и таким образом ограничить данные (и предупредить пользователя), а не перехватывать исключение переполнения во время рисования? Задокументированы ли ограничения?
Например, я хотел бы сделать что-то вроде этого:
if (yVal < float.MinValue || yval > float.MaxValue)
throw new OverflowException("Interpolation value too large to be rendered.");
во время заполнения массива _interpolationPoints и остановить процесс. (float mix / max не работает между прочим. Я все еще получаю исключение.)
Хорошо, мне нужно было знать, поэтому я тестировал постепенно и нашел следующие ограничения:
positive: 1,073,741,951
negative: -1,073,741,760
Код, который я использовал, выглядел примерно так:
int lastGoodVal = 0;
for (int i = -1073000000; i > -1073832999; i -= 1)
{
g.DrawLine(Pens.Blue, new Point(0,0), new Point(0, i));
lastGoodVal = i;
}
Цикл выше был последним тестом, шагая на 1, через диапазон отрицательных значений, установленных в ходе предыдущих тестов. Как видите, lastGoodVal содержит последнюю успешную итерацию рисования и, следовательно, реальный предел, который я буду использовать в качестве константы.
Я попытался сопоставить эти числа со значением в примитивах .NET, но не смог. Каждый предел близок к значению 2 ^ 30, но не совсем на нем. Любая другая информация будет очень признательна.
Я также тестировал только метод DrawLine. Возможно, существуют другие ограничения для других функций в API, но у меня еще не было возможности изучить это.
Кроме того, после завершения этого эксперимента и поиска в Google значения 1073741951 я наткнулся на эту статью , которая коррелирует с моими выводами. Я также нашел это в каком-то архиве кода Mono, в котором упоминается близкая, хотя и не точная корреляция с ограничениями с плавающей запятой.
Я не слышал о конкретных ограничениях для DrawLines () или любой другой функции рисования GDI. Почему бы вам не использовать e.ClipRectangle в качестве ограничения?
Рисование точек за пределами видимой области в любом случае не требуется. Просто убедитесь, что отбрасываются только линии, у которых обе точки находятся снаружи.