Hallo,
ich habe folgendes Problem:
Ich zeichne mit einem Pfad einen gefüllten Bogen. Dazu benutze ich einen Pfad, der vom Codebehind ausgerechnet und applied wird. Das funktioniert auch soweit recht gut, wenn allerdings der Winkel des Ellipsenbogens um die 180° ist, wird der Radius "verzerrt", d. h. ich zeichne die Ellipse mit dem gleichen Radius wie immer, aber je näher ich an die 180° komme, desto stärker wird die Ellipse (hauptsächlich in x-Richtung, wenn ich das richtig sehe) verzerrt. Das Problem scheint quadratisch zu steigen. Ich habe ein paar Bilder angehängt, die das ganze verdeutlichen sollten. Im Spoiler steht der Code, der die Pfaddaten erstellt. Ich hoffe, ihr könnt mir sagen, wo das Problem liegt, ich komme leider nicht weiter und im Web habe ich bisher auch noch nichts dazu gefunden.
Spoiler anzeigen
Hier noch der Outline-Pfad mit dem grauen Background:
Noch nen kleiner Link zum Auffrischen des Pfadmarkups: msdn.microsoft.com/en-us/library/cc189041(v=vs.95).aspx
ich habe folgendes Problem:
Ich zeichne mit einem Pfad einen gefüllten Bogen. Dazu benutze ich einen Pfad, der vom Codebehind ausgerechnet und applied wird. Das funktioniert auch soweit recht gut, wenn allerdings der Winkel des Ellipsenbogens um die 180° ist, wird der Radius "verzerrt", d. h. ich zeichne die Ellipse mit dem gleichen Radius wie immer, aber je näher ich an die 180° komme, desto stärker wird die Ellipse (hauptsächlich in x-Richtung, wenn ich das richtig sehe) verzerrt. Das Problem scheint quadratisch zu steigen. Ich habe ein paar Bilder angehängt, die das ganze verdeutlichen sollten. Im Spoiler steht der Code, der die Pfaddaten erstellt. Ich hoffe, ihr könnt mir sagen, wo das Problem liegt, ich komme leider nicht weiter und im Web habe ich bisher auch noch nichts dazu gefunden.
VB.NET-Quellcode
- Class MainWindow
- Dim iC As System.Globalization.CultureInfo = System.Globalization.CultureInfo.InvariantCulture
- Private Sub drawSpeed(speed)
- Dim data As String = "M88.5,187.5 L79.5,204.5" 'so fängt der Pfad an, ich setze hier den "Cursor" auf den Startpunkt (den Endpunkt des inneren Bogens) und zeichne eine Linie zum Startpunkt des äußeren
- Dim deg As Double = (speed / 360) * 300 - 150 'Hier rechne ich den Winkel aus. Zuerst ein kleiner Dreisatz (max. Winkel = 300°), danach -150°, da meine Nullinie ja um 150° gegen den Uhrzeigersinn rotiert ist
- Dim largeArc As Integer = 0 'Wird für den Bogen als Parameter gebraucht. Wenn der Winkel des Bogens >180° ist, muss dieser Wert 1 sein, sonst 0
- If deg + 150 >= 180 Then largeArc = 1 'Dies wird hier getestet
- Dim outerX As Double = Math.Sin(toRad(deg)) * 92 + 125 'Hier rechne ich nun die Koordinaten des Endpunkts vom äußeren Bogen aus. Dabei gilt: r = 92; Mittelpunkt M(125|125)
- Dim outerY As Double = 125 - Math.Cos(toRad(deg)) * 92 'Da das Koordinatensystem im Computer von oben nach unten geht, statt wie in der Mathematik üblich von unten nach oben, muss ich hier -cos() rechnen
- data += makeEllipseString(92, 92, largeArc, 1, outerX, outerY) 'Hier werden nun die Pfad-Daten aus den berechneten Koordinaten erstellt
- Dim innerX As Double = Math.Sin(toRad(deg)) * 73 + 125 's. o., r = 73
- Dim innerY As Double = 125 - Math.Cos(toRad(deg)) * 73 's. o.
- data += "L" & innerX.ToString(iC) & "," & innerY.ToString(iC) 'Hier wird nun vom Endpunkt des äußeren Bogens die Begrenzungslinie zum inneren Bogen gezogen.
- data += makeEllipseString(73, 73, largeArc, 0, 88.5, 187.5) & "Z" 'Anschließend wird ein Ellipsenbogen zurück zum Anfang gezogen und der Pfad geschlossen.
- speedPath.Data = System.Windows.Media.Geometry.Parse(data) 'Der fertige Datenstring wird nun applied
- End Sub
- Private Function toRad(deg) As Double
- Return deg * (Math.PI / 180) 'Winkel- zu Bogenmaß Konvertierung
- End Function
- Private Function makeEllipseString(rx As Double, ry As Double, largeArc As Integer, posDir As Integer, toX As Double, toY As Double) As String
- Return "A" & rx.ToString(iC) & "," & ry.ToString(iC) & ",0," & largeArc.ToString & "," & posDir.ToString & "," & toX.ToString(iC) & "," & toY.ToString(iC)
- End Function
- End Class
Hier noch der Outline-Pfad mit dem grauen Background:
Noch nen kleiner Link zum Auffrischen des Pfadmarkups: msdn.microsoft.com/en-us/library/cc189041(v=vs.95).aspx
Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „newcat“ ()