Es posible que los extremos de un arco no se dibujan correctamente

Este artículo le ayuda a resolver el problema en el que es posible que el punto inicial y los puntos de conexión no se dibujen en la posición correcta al dibujar un arco con un radio grande.

Versión del producto original:   .NET Framework 3.5 Service Pack 1, .NET Framework 3.5.1, .NET Framework 4.5
Número KB original:   2984519

Síntomas

Al dibujar un arco con un radio grande, es posible que los puntos inicial y final del arco no se dibujen correctamente en función de los parámetros establecidos.

Causa

En exploradores web, como Internet Explorer, es posible mostrar gráficos de aplicaciones WPF que cargan y muestran imágenes representadas en formato SVG (gráficos vectoriales escalables) o aplicaciones que muestran imágenes con XAML suelto (que es la función para cargar y representar el marcado sin compilar).

La visualización de imágenes SVG y el motor de representación de XAML suelto usan DirectX (Direct3D9).

Sin embargo, el procesamiento dentro de DirectX (Direct3D9) se lleva a cabo con un número de punto flotante de precisión única. Por lo tanto, existe la posibilidad de dibujar una imagen inesperada si se usa un número grande que supera el límite del procesamiento.

Por ejemplo, en XAML suelto, cuando dibujas un arco que tiene un radio grande, con el comando del marcado, es posible que el punto inicial y el punto de conexión no se dibujen en la posición correcta según el valor que se va a A Path establecer.

Estado

Este comportamiento es una limitación del motor de representación que realiza el procesamiento con un número de punto flotante de precisión única.

Solución

Los desarrolladores deben tener en cuenta las limitaciones de las operaciones numéricas al realizar dibujos complejos con sistemas gráficos, que no están necesariamente limitados a XAML suelto.

Al dibujar un arco con un radio grande, es posible que no obtenga el resultado esperado debido a estas limitaciones, y se recomienda a los desarrolladores que tomen métodos alternativos, como reemplazar el arco por una línea, si la diferencia resultante de dicho reemplazo puede omitirse razonablemente.

Pasos para reproducir este problema

A continuación se indican los pasos para reproducir el caso de dibujar un arco con un radio grande mediante el A comando del Path marcado:

Guarda el código siguiente en un archivo de texto con extensión .xaml para crear un archivo XAML suelto. Al abrir este archivo con Internet Explorer 11, el motor de representación wpf dibuja el arco rojo y la línea azul como se muestra en la siguiente captura de pantalla.

<?xml version="1.0" encoding="utf-8"?>
<Canvas Background="#fff" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Canvas.RenderTransform>
        <TransformGroup>
            <TranslateTransform X="-26000" Y="-3000" />
        </TransformGroup>
    </Canvas.RenderTransform>
    <Path Stroke="#f00" StrokeThickness="1">
        <Path.Data>
            <PathGeometry Figures="M 26557.35, 3320.226 A 1703595, 1703595, 0, 0, 0, 26569.29, 3290.773" />
        </Path.Data>
    </Path>
    <Path Stroke="#00f" StrokeThickness="3">
        <Path.Data>
            <PathGeometry Figures="M 26557.35, 3320.226 L 26569.29, 3290.773" />
        </Path.Data>
    </Path>
</Canvas>

El código de la línea 10 especifica que un arco rojo se dibuja desde una coordenada absoluta (26557.35, 3320.226), que se establece mediante el comando del atributo dentro de un elemento, a otra coordenada absoluta M Figures PathGeometry (26569.29, 3290.773), que establece el comando mediante un radio de A 1703595.

Mientras tanto, el código de la línea 15 dibuja una línea azul desde una coordenada absoluta (26557.35, 3320.226), que establece el comando, a otra coordenada absoluta M (26569.29, 3290.773), que establece el L comando.

Nota

El arco se dibuja con extremos extraviados, aunque tanto el arco como la línea usan el mismo par de puntos iniciales y finales.

La figura muestra que los puntos de conexión del arco rojo están fuera de lugar.

Este ejemplo está diseñado para conectar dos puntos con 32 píxeles de diferencia mediante un arco con un radio de 1,7 millones de píxeles; que no es un enfoque significativo porque estos dos valores son astronómicamente diferentes. Como se muestra en la siguiente captura de pantalla, la desviación máxima del arco (AM'B) de la línea (AMB) es inferior a 0,0001 píxeles (MM'), lo que sería lo suficientemente pequeño como para ser invisible incluso si esas formas se dibujaron con la máxima precisión matemática. Por lo tanto, en situaciones como esta, dibujar una línea entre estos dos puntos sería un enfoque mucho más preferible porque reduciría las posibilidades de alcanzar limitaciones numéricas del procesamiento interno.

La figura muestra la desviación máxima del arco de la línea.