Каковы жесткие границы? для отрисовки координат в GDI +?

Я представляю интерполяционную кривую таким образом:

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 не работает между прочим. Я все еще получаю исключение.)

10
задан Paul Sasik 12 August 2010 в 17:59
поделиться

2 ответа

Хорошо, мне нужно было знать, поэтому я тестировал постепенно и нашел следующие ограничения:

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, в котором упоминается близкая, хотя и не точная корреляция с ограничениями с плавающей запятой.

9
ответ дан 3 December 2019 в 23:10
поделиться

Я не слышал о конкретных ограничениях для DrawLines () или любой другой функции рисования GDI. Почему бы вам не использовать e.ClipRectangle в качестве ограничения?

Рисование точек за пределами видимой области в любом случае не требуется. Просто убедитесь, что отбрасываются только линии, у которых обе точки находятся снаружи.

1
ответ дан 3 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: