Exception en drawing.dll

27/04/2005 - 06:53 por Carlos Xudiera | Informe spam
Hola:
Estoy haciendo un grafico de una función el problema es que me lanza una
exception cuando trato de dibujar una línea.
La exception que me lanza es: "System.OverflowException occurred in
system.drawing.dll"
No entiendo porque si creo que convierto bien los datos y por lo tanto no
debería haber ningún problema como este.
El código es el siguiente:

Pen plotPen = new Pen(Color.Blue, 1 / G.DpiX);
Single X, Y;
Single oldX = -10;
Single oldY = Convert.ToSingle(EvaluateFunction(-10));
for (Single i = -10; i < 10; i = i + (20)/(pictureBox1.Width - 1))
{
X = i;
Y = Convert.ToSingle(EvaluateFunction(i));
G.DrawLine(plotPen, oldX, oldY, X, Y);
oldX = X;
oldY = Y;
}

Espero puedan ayudarme.

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
27/04/2005 - 17:09 | Informe spam
¿En qué instrucción te da? Debe ser en new Pen(... o en G.DrawBox(..., si
nos guiamos por el hecho de que se produce en system.drawing.dll. En todo
caso, creo que se debe a que se pasa como parámetro un valor incorrecto a
una función.

Slds,

Octavio

"Carlos Xudiera" escribió en el mensaje
news:O%
Hola:
Estoy haciendo un grafico de una función el problema es que me lanza una
exception cuando trato de dibujar una línea.
La exception que me lanza es: "System.OverflowException occurred in
system.drawing.dll"
No entiendo porque si creo que convierto bien los datos y por lo tanto no
debería haber ningún problema como este.
El código es el siguiente:

Pen plotPen = new Pen(Color.Blue, 1 / G.DpiX);
Single X, Y;
Single oldX = -10;
Single oldY = Convert.ToSingle(EvaluateFunction(-10));
for (Single i = -10; i < 10; i = i + (20)/(pictureBox1.Width - 1))
{
X = i;
Y = Convert.ToSingle(EvaluateFunction(i));
G.DrawLine(plotPen, oldX, oldY, X, Y);
oldX = X;
oldY = Y;
}

Espero puedan ayudarme.


Respuesta Responder a este mensaje
#2 Carlos Xudiera
28/04/2005 - 07:08 | Informe spam
La instrucción en la que me da el error es en G.DrawLine(plotPen, oldX,
oldY, X, Y);
y los parámetros que le paso son del tipo que deben ser. Por eso es que no
entiendo que pasa.
Saludos
Carlos,

"Octavio Hernandez" wrote in message
news:#

¿En qué instrucción te da? Debe ser en new Pen(... o en G.DrawBox(..., si
nos guiamos por el hecho de que se produce en system.drawing.dll. En todo
caso, creo que se debe a que se pasa como parámetro un valor incorrecto a
una función.

Slds,

Octavio

"Carlos Xudiera" escribió en el mensaje
news:O%
> Hola:
> Estoy haciendo un grafico de una función el problema es que me lanza una
> exception cuando trato de dibujar una línea.
> La exception que me lanza es: "System.OverflowException occurred in
> system.drawing.dll"
> No entiendo porque si creo que convierto bien los datos y por lo tanto


no
> debería haber ningún problema como este.
> El código es el siguiente:
>
> Pen plotPen = new Pen(Color.Blue, 1 / G.DpiX);
> Single X, Y;
> Single oldX = -10;
> Single oldY = Convert.ToSingle(EvaluateFunction(-10));
> for (Single i = -10; i < 10; i = i + (20)/(pictureBox1.Width - 1))
> {
> X = i;
> Y = Convert.ToSingle(EvaluateFunction(i));
> G.DrawLine(plotPen, oldX, oldY, X, Y);
> oldX = X;
> oldY = Y;
> }
>
> Espero puedan ayudarme.
>
>


Respuesta Responder a este mensaje
#3 Carlos García-Carazo
28/04/2005 - 10:56 | Informe spam
Buenas,
yo he tenido problemas similares con las GDI de VS.NET 1.1 framework, también desde código C#.

Cuando yo creaba un Pen de la misma manera que tú haces (con un simple constructor y ya está),
e intentaba dibujar en un contexto gráfico escalado (también como haces tú), en ciertas situaciones
se me producía una excepción en drawing.dll. Imprimiendo el mensaje de la excepción se veía
como las llamadas eran todas del sistema, y en algún paso interno como intercambiar el doble buffer,
o liberar el contexto gráfico temporal, se producía el fallo.

Te cuento brevemente hasta donde he podido investigar:
- El fallo se produce pintando lineas que al ser escaladas por el contexto gráfico quedan muy "reducidas".
- Ciertas situaciones de clipping, con la zona superior del contexto (es muy curioso que sea solo con la superior)
también disparan esta excepción.
- Pintar una elipse de radio pequeño en uno de estos contextos también da error en determinados casos de
clipping.
- Estos fallos son muy difíciles de capturar y sólo he podido demostrarlos a base de lanzar aleatoriamente miles
de líneas (o elipses) a pantalla hasta que uno de estos objetos cae en un determinado caso especial que hace
fallar a la drawing.dll

- Es un error que se produce con contextos Graphics escalados, con Pens cuya Width es pequeña (de manera que
al escalarse cae por debajo de 1), y usando Doble Buffering.

- Sólo he podido "parchear" este error de dos maneras:
1) Inicializando algunas propiedades del Pen después de llamar al constructor. Es muy curioso observar que después
de darle un valor "inofensivo" a LineJoin, MiterLimit, DashStyle... ya no se cuelga la aplicación por más que uno
mueva polígonos por la zona de clipping.
2) Activando el SmoothingMode de Graphics como "AntiAlias". Por lo visto, al cambiar la forma en que va a pintar
la DLL las líneas (con suavizado), cambia el algoritmo interno que las pinta y ese en concreto ya no se "cuelga".

Tras darle muchas vueltas a este tema y buscar infructuosamente por Internet una solución (incluso en este mismo foro),
he llegado a la conclusión que para aplicaciones que usan intensivamente líneas, polígonos etc es mejor recurrir
a una librería sólida como OpenGL. Seguro que GDI+ será una gran librería para aplicaciones gráficas con .NET más
adelante, pero de momento tiene bugs que no pueden asumirse para una aplicación que vas a instalarle a un cliente.

Como ejemplo del estado prematuro en el que creo que se encuentra la GDI+:
http://www.bobpowell.net/getregionscansbug.htm
(en esa misma web vi documentado un fallo que se producía con Pens cuya width era inferior a 2)

PD:
Ya que menciono OpenGL, quiero utilizar el framework Tao OpenGL (evolución de csGL) para .NET.
¿Alguien conoce alguna web sobre esto (aparte de la oficial)?


"Carlos Xudiera" escribió en el mensaje news:
La instrucción en la que me da el error es en G.DrawLine(plotPen, oldX,
oldY, X, Y);
y los parámetros que le paso son del tipo que deben ser. Por eso es que no
entiendo que pasa.
Saludos
Carlos,

"Octavio Hernandez" wrote in message
news:#
>
> ¿En qué instrucción te da? Debe ser en new Pen(... o en G.DrawBox(..., si
> nos guiamos por el hecho de que se produce en system.drawing.dll. En todo
> caso, creo que se debe a que se pasa como parámetro un valor incorrecto a
> una función.
>
> Slds,
>
> Octavio
>
> "Carlos Xudiera" escribió en el mensaje
> news:O%
> > Hola:
> > Estoy haciendo un grafico de una función el problema es que me lanza una
> > exception cuando trato de dibujar una línea.
> > La exception que me lanza es: "System.OverflowException occurred in
> > system.drawing.dll"
> > No entiendo porque si creo que convierto bien los datos y por lo tanto
no
> > debería haber ningún problema como este.
> > El código es el siguiente:
> >
> > Pen plotPen = new Pen(Color.Blue, 1 / G.DpiX);
> > Single X, Y;
> > Single oldX = -10;
> > Single oldY = Convert.ToSingle(EvaluateFunction(-10));
> > for (Single i = -10; i < 10; i = i + (20)/(pictureBox1.Width - 1))
> > {
> > X = i;
> > Y = Convert.ToSingle(EvaluateFunction(i));
> > G.DrawLine(plotPen, oldX, oldY, X, Y);
> > oldX = X;
> > oldY = Y;
> > }
> >
> > Espero puedan ayudarme.
> >
> >
>
>


Respuesta Responder a este mensaje
#4 Carlos Xudiera
29/04/2005 - 07:41 | Informe spam
Hola
Magnifica tu respuesta. Y si, el fallo se produce cuando trato de pintar
líneas muy pequeñas. Intente cambiándole las propiedades que sugeriste, pero
no sirvió de nada. Parece que como dices tendremos que esperar a que en un
futuro GDI+ sea una librería sólida.
Muchas gracias por la ayuda.

"Carlos García-Carazo" wrote in message
news:
Buenas,
yo he tenido problemas similares con las GDI de VS.NET 1.1 framework,


también desde código C#.

Cuando yo creaba un Pen de la misma manera que tú haces (con un simple


constructor y ya está),
e intentaba dibujar en un contexto gráfico escalado (también como haces


tú), en ciertas situaciones
se me producía una excepción en drawing.dll. Imprimiendo el mensaje de la


excepción se veía
como las llamadas eran todas del sistema, y en algún paso interno como


intercambiar el doble buffer,
o liberar el contexto gráfico temporal, se producía el fallo.

Te cuento brevemente hasta donde he podido investigar:
- El fallo se produce pintando lineas que al ser escaladas por el contexto


gráfico quedan muy "reducidas".
- Ciertas situaciones de clipping, con la zona superior del contexto (es


muy curioso que sea solo con la superior)
también disparan esta excepción.
- Pintar una elipse de radio pequeño en uno de estos contextos también da


error en determinados casos de
clipping.
- Estos fallos son muy difíciles de capturar y sólo he podido demostrarlos


a base de lanzar aleatoriamente miles
de líneas (o elipses) a pantalla hasta que uno de estos objetos cae en


un determinado caso especial que hace
fallar a la drawing.dll

- Es un error que se produce con contextos Graphics escalados, con Pens


cuya Width es pequeña (de manera que
al escalarse cae por debajo de 1), y usando Doble Buffering.

- Sólo he podido "parchear" este error de dos maneras:
1) Inicializando algunas propiedades del Pen después de llamar al


constructor. Es muy curioso observar que después
de darle un valor "inofensivo" a LineJoin, MiterLimit, DashStyle... ya


no se cuelga la aplicación por más que uno
mueva polígonos por la zona de clipping.
2) Activando el SmoothingMode de Graphics como "AntiAlias". Por lo visto,


al cambiar la forma en que va a pintar
la DLL las líneas (con suavizado), cambia el algoritmo interno que las


pinta y ese en concreto ya no se "cuelga".

Tras darle muchas vueltas a este tema y buscar infructuosamente por


Internet una solución (incluso en este mismo foro),
he llegado a la conclusión que para aplicaciones que usan intensivamente


líneas, polígonos etc es mejor recurrir
a una librería sólida como OpenGL. Seguro que GDI+ será una gran librería


para aplicaciones gráficas con .NET más
adelante, pero de momento tiene bugs que no pueden asumirse para una


aplicación que vas a instalarle a un cliente.

Como ejemplo del estado prematuro en el que creo que se encuentra la GDI+:
http://www.bobpowell.net/getregionscansbug.htm
(en esa misma web vi documentado un fallo que se producía con Pens cuya


width era inferior a 2)

PD:
Ya que menciono OpenGL, quiero utilizar el framework Tao OpenGL (evolución


de csGL) para .NET.
¿Alguien conoce alguna web sobre esto (aparte de la oficial)?
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida