Die Endpunkte eines Bogens werden möglicherweise nicht richtig gezeichnet.

Dieser Artikel hilft Ihnen, das Problem zu beheben, wenn Ausgangspunkt und Endpunkte möglicherweise nicht an der richtigen Position gezeichnet werden, wenn Sie einen Bogen zeichnen, der einen großen Radius aufweist.

Original Version des Produkts:   Microsoft .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 Endpunkt Punkte des Bogens möglicherweise nicht ordnungsgemäß in Abhängigkeit von den festgelegten Parametern gezeichnet.

Ursache

In Webbrowsern wie Internet Explorer ist es möglich, Grafiken von WPF-Anwendungen anzuzeigen, die im SVG-Format (Scalable Vector Graphics) dargestellte Bilder laden und anzeigen, oder Anwendungen, die Bilder mit Loose XAML (die Funktion zum Laden und Rendern des Markups ohne kompilieren) darstellen.

Die Anzeige von SVG-Bildern und das Rendering-Modul von Loose XAML verwenden DirectX (Direct3D9).

Die Verarbeitung in DirectX (Direct3D9) wird jedoch mit einer Gleitkommazahl mit einfacher Genauigkeit ausgeführt. Daher gibt es die Möglichkeit, unerwartetes Bild zu zeichnen, wenn Sie eine große Zahl verwenden, die den Grenzwert der Verarbeitung überschreitet.

Wenn Sie beispielsweise in Loose XAML einen Bogen zeichnen, der über einen großen Radius verfügt, wird der A Path Ausgangspunkt und der Endpunkt möglicherweise nicht in der richtigen Position gezeichnet, je nach festgelegtem Wert.

Status

Dieses Verhalten ist eine Einschränkung des Rendering-Moduls, das die Verarbeitung mit einfacher Genauigkeit-Gleitkommazahl ausführt.

Lösung

Entwickler müssen die Einschränkungen numerischer Vorgänge berücksichtigen, wenn Sie komplexe Zeichnungen mithilfe von Grafiksystemen ausführen, die nicht unbedingt auf Loose XAML beschränkt sind.

Wenn Sie einen Bogen mit einem großen Radius zeichnen, erhalten Sie aufgrund solcher Einschränkungen möglicherweise nicht das erwartete Ergebnis, und die Entwickler werden ermutigt, alternative Ansätze wie das Ersetzen des Bogens durch eine Textreihe zu ergreifen, wenn die daraus resultierende Differenz dieser Ersetzung angemessen ignoriert werden kann.

Schritte zum Reproduzieren dieses Problems

Im folgenden finden Sie die Schritte zum Reproduzieren des Groß-/Kleinschreibung beim Zeichnen eines Bogens mit einem großen Radius mit dem A Befehl des Path Markups:

Speichern Sie den Code unten 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-Rendering-Modul den roten und blauen Bogen, 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) gezeichnet wird, die durch den M Befehl des Figures Attributs in einem PathGeometry Element auf eine andere absolute Koordinate (26569,29, 3290,773) festgelegt wird, die vom A Befehl mit einem Radius von 1703595 festgelegt wird.

In der Zwischenzeit zeichnet der Code in Zeile 15 eine blaue Zeile von einer absoluten Koordinate (26557,35, 3320,226), die durch den Befehl festgelegt wird M , auf eine andere absolute Koordinate (26569,29, 3290,773), die durch den Befehl festgelegt wird L .

Hinweis

Der Bogen wird mit falsch platzierten Endpunkten gezeichnet, obwohl sowohl der Bogen als auch die Linie dasselbe paar von Start-und Endpunkten verwenden.

Abbildung 1: Endpunkte des roten Bogens sind verlegen

In diesem Beispiel werden zwei Punkte, die 32 Pixel voneinander entfernt sind, mit einem Bogen mit einem Radius von 1,7 Millionen Pixel verbunden; Dies ist kein sinnvoller Ansatz, da diese beiden Werte astronomisch unterschiedlich sind. Wie im folgenden Screenshot gezeigt, ist die maximale Abweichung des Bogens (AM'B) von der Linie (AMB) kleiner als 0,0001 Pixel (mm '), was klein genug ist, um unsichtbar zu sein, selbst wenn diese Formen mit größter mathematischer Genauigkeit gezeichnet wurden. Daher wäre es in solchen Situationen ein weitaus vorzuziehender Ansatz, eine Linie zwischen diesen beiden Punkten zu zeichnen, da dadurch die Wahrscheinlichkeit verringert würde, numerische Einschränkungen der internen Verarbeitung zu verringern.

Abbildung 2: maximale Abweichung des Bogens von der Linien Kante.