Die Endpunkte eines Bogens werden möglicherweise nicht richtig gezeichnet
Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem Startpunkt und Endpunkte beim Zeichnen eines Bogens mit einem großen Radius möglicherweise nicht an der richtigen Position gezeichnet werden.
Ursprüngliche Produktversion: .NET Framework 3.5 Service Pack 1, .NET Framework 3.5.1, .NET Framework 4.5
Ursprüngliche KB-Nummer: 2984519
Problembeschreibung
Wenn Sie einen Bogen mit einem großen Radius zeichnen, werden die Anfangs- und Endpunkte des Bogens je nach den festgelegten Parametern möglicherweise nicht richtig gezeichnet.
Ursache
In Webbrowsern wie Internet Explorer ist es möglich, Grafiken von WPF-Anwendungen anzuzeigen, die Bilder laden und anzeigen, die im SVG-Format (Scalable Vector Graphics) dargestellt sind, oder Anwendungen, die Bilder mit loosem XAML anzeigen (die Funktion zum Laden und Rendern des Markups ohne Kompilierung).
Die Anzeige von SVG-Bildern und das Renderingmodul von Loose XAML verwenden DirectX (Direct3D9).
Die Verarbeitung in DirectX (Direct3D9) erfolgt jedoch mit einer Gleitkommazahl mit einfacher Genauigkeit. Daher besteht die Möglichkeit, dass unerwartete Bilder gezeichnet werden, wenn Sie eine große Zahl verwenden, die den Grenzwert der Verarbeitung überschreitet.
Wenn Sie z. B. in Loose XAML einen Bogen mit einem großen Radius zeichnen, werden der Startpunkt und der Endpunkt je nach festzulegenden A Wert möglicherweise nicht an der Path richtigen Position gezeichnet.
Status
Dieses Verhalten ist eine Einschränkung des Renderingmoduls, das die Verarbeitung mit einer Gleitkommazahl mit einfacher Genauigkeit durchführt.
Lösung
Entwickler müssen die Einschränkungen numerischer Vorgänge berücksichtigen, wenn sie komplexe Zeichnungen mit Grafiksystemen ausführen, die nicht unbedingt auf lose XAML beschränkt sind.
Wenn Sie einen Bogen mit einem großen Radius zeichnen, erhalten Sie aufgrund dieser Einschränkungen möglicherweise nicht das erwartete Ergebnis, und die Entwickler werden aufgefordert, alternative Ansätze zu verwenden, z. B. das Ersetzen des Bogens durch eine Linie, wenn der resultierende Unterschied einer solchen Ersetzung angemessen ignoriert werden kann.
Schritte zum Reproduzieren dieses Problems
Nachfolgend finden Sie die Schritte zum Reproduzieren des Zeichnungsfalls eines Bogens mit einem großen Radius mithilfe A des Befehls des Path Markups:
Speichern Sie den folgenden Code in einer Textdatei mit der Erweiterung XAML, um eine lose XAML-Datei zu erstellen. Wenn Sie diese Datei mit Internet Explorer 11 öffnen, zeichnet das WPF-Renderingmodul den roten Bogen und die blaue Linie, wie im folgenden Screenshot dargestellt.
<?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>
Der Code in Zeile 10 gibt an, dass ein roter Bogen von einer absoluten Koordinate (26557.35, 3320.226), die durch den Befehl des Attributs innerhalb eines Elements festgelegt M Figures wird, auf eine andere PathGeometry absolute Koordinate (26569,29, 3290,773) gezeichnet wird, die vom Befehl mit einem Radius von 1703595 festgelegt A wird.
In der Zwischenzeit zeichnet der Code in Zeile 15 eine blaue Linie von einer absoluten Koordinate (26557,35, 3320,226), die durch den Befehl festgelegt M wird, auf eine andere absolute Koordinate (26569,29, 3290,773), die durch den Befehl festgelegt L wird.
Hinweis
Der Bogen wird mit falsch platzierten Endpunkten gezeichnet, obwohl sowohl der Bogen als auch die Linie das gleiche Paar von Anfangs- und Endpunkten verwenden.
In diesem Beispiel werden zwei Punkte verbunden, die 32 Pixel voneinander entfernt sind, indem ein Bogen mit einem Radius von 1,7 Millionen Pixeln verwendet wird. dies ist kein sinnvoller Ansatz, da sich diese beiden Werte im Wesentlichen unterscheiden. Wie im folgenden Screenshot gezeigt, beträgt die maximale Abweichung des Bogens (AM'B) von der Linie (AMB) weniger als 0,0001 Pixel (MM),was klein genug wäre, um unsichtbar zu sein, auch wenn diese Formen mit mathematischer Genauigkeit gezeichnet wurden. Daher wäre das Zeichnen einer Linie zwischen diesen beiden Punkten in solchen Situationen ein wesentlich besserer Ansatz, da dadurch die Wahrscheinlichkeit verringert wird, dass numerische Einschränkungen der internen Verarbeitung erreicht werden.