2010-08-24 6 views
6

Ich habe eine ziemlich große PathGeometry (mehr als 100.000 Punkte und strich aber nicht gefüllt) für den Benutzer angezeigt werden, aber nur ein kleiner Teil des Weges wird zu jeder Zeit sichtbar sein. Zur Klarstellung ist der Pfad selbst nicht vorgegeben, sondern wird aus Daten erstellt.Splitting ein WPF PathGeometry in „Kacheln“

Das Problem: Ich möchte sehr weiche Schwenks schaffen, so dass der Benutzer Bereiche des größeren Weg zu erkunden.

Ich habe eine mögliche Lösung, aber ich bin mir nicht sicher, wie man es abzieht. Ich würde gerne eine Kacheltechnik verwenden - die Geometrie in Kacheln teilen und nur die sichtbaren Kacheln laden.

Also, wie teilen Sie eine Hub-Pfad Geometrie nur in Kacheln. Genauer gesagt, wie ermittle ich den Teil des Pfades, der in einer gegebenen rechteckigen Kachel existiert?

Ich weiß, dass ich eine CombinedGeometry verwenden kann, um den Schnittpunkt zwischen der Pfadgeometrie und einem Rechteck zu bestimmen, aber dazu gehören auch die "Wände" des Rechtecks ​​(die gestrichen werden). Gibt es eine bessere Möglichkeit, eine Nur-Strich-PathGeometry einzufügen?

Danke!

Antwort

2

Vielleicht statt Fliesen haben nur die eine PathGeometry und die PathData programmatisch Datenbindung unter Verwendung ändern oder was auch immer das Segment des Pfades vertreten Sie in herangezoomt werden. Ein bisschen wie DeepZoom, aber mit Pfaden. Dies bedeutet, dass Sie sich nicht um verschmelzende Pfade kümmern müssen.

ich etwas ähnliches wie Sie tue, aber die Zahlen, die ich in meinem Weg bin mit etwas weniger so havnt ich keine Virtualisierungsmethoden in Betracht gezogen werden. Allerdings habe ich keine massiven Leistungsprobleme bemerkt. Ich habe einen Pfad in einem Scrollviewer, der ungefähr 1000 - 10000 Punkte repräsentiert, und es wird nur verzögert, wenn ich nur dann zoome, wenn die Punkte sehr weit voneinander entfernt sind. Wenn die Punkte in dem Pfad relativ nahe bei ihren Nachbarn liegen (z. B. eine schöne ausladende Sinuswelle), dann führt WPF eine Art von Optimierung für sie durch, um jede mögliche Verzögerung zu verhindern.

Beispiel: dieser Weg ...

multiple sines

... wird länger dauern, als dieser Weg zu zeichnen:

simple sine

, obwohl sie die gleiche Menge an Punkten enthalten beschreibt es. In der Realität muss der Pfad jedoch wie in der Abbildung unten aussehen, bevor Sie einen Leistungsunterschied bemerken.

the troublemaker

Da der Pfad eine Audio-Welle repräsentiert ich, indem eine Art von Kontrolle, um zu sehen, wie diese loswerden zukünftige Probleme zu bekommen beabsichtigen, wenn die Punkte einen massiven dunkelblauen Block zu schaffen und ersetzt sie durch etwas weniger machthungrig, aber das ist vielleicht keine ausreichende Lösung für dich.

(sorry über die Größe Unterschied in den Bildern, das Bit, das die Sinuswelle berechnet ist zur Zeit außer Gefecht gesetzt, so habe ich alte JPEG-Dateien zu verwenden, hat)

+0

Danke für die Antwort. Klingt wie eine gute Technik, wenn Sie leicht bestimmen können, welcher Unterabschnitt des Pfads in dem Bereich angezeigt werden soll, in den der Benutzer verschoben wurde (z. B. wenn Sie x_i und x_f kennen, können Sie bestimmen, welche y-Werte grafisch dargestellt werden). Es ist schwieriger, wenn Sie zweidimensionale, nicht parametrisierte Pfaddaten verwenden (wie können Sie "schnell" herausfinden, wie der aktuell sichtbare Teilpfad aussieht). Die Idee hinter den Kacheln war, die Teilmenge des Pfades, der in jeder Kachel sichtbar sein würde, vorzubestimmen (vorzugsweise unter Verwendung der Geometriefunktionen von WPF) und "Kärtchen schnell anzeigen/verbergen" nach Bedarf. – FTLPhysicsGuy

0

Eine Möglichkeit wäre, laden Sie die ganze Geometrie in einer Leinwand. Wenden Sie dann einen Zoom auf die Leinwand an. Sie können Steuerelemente von Drittanbietern wie ab2d verwenden.

ich geschaffen habe, eine solche Leinwand wie ein in Photoshop mit vielen Zeichnungen (vom Benutzer erstellt) in Form von Geometrien in daliegen.Ich habe ab2d verwendet, um mit seiner Menüsteuerung heranzuzoomen, und es funktioniert gut. Sie können auch einen vordefinierten Zoom auf einen Teil davon einstellen.

Dank/subho100

1

ich mich darüber vor kurzem dachte, vielleicht kann meine Erfahrungen Ihnen helfen. Erstens können Sie eine bessere Leistung erzielen, wenn Sie eine StreamGeometry anstelle einer PathGeometry verwenden können. Ich würde empfehlen, eine einzelne StreamGeometry als Data-Eigenschaft eines Pfades zu erstellen, sie auf einer Zeichenfläche zu platzieren und dann die Transformationen "Scale" und "Translate" anzuwenden, um durch die Form zu navigieren. Ich bekam anständige Leistung mit 5 oder 6 SeriesGeometries mit jeweils 1000 Punkten (offensichtlich viel weniger als die von dir erwähnte Zahl), obwohl ich glaube, dass die WPF-Grafik-Engine ziemlich gut skalieren wird, solange du nicht alle Punkte auf dem Bildschirm hast gleichzeitig. Wenn Sie "vollständig herausgezoomt" unterstützen möchten, dh alle Punkte sichtbar wären, dann würde ich empfehlen, Versionen mit niedriger Auflösung der Geometrie zu erstellen (dh entweder eine einfachere Menge von Punkten oder eine Bitmap) und die Höhen und Tiefen zu vertauschen -res Versionen, wenn der Zoom einen bestimmten Level erreicht.

Macht das Sinn?

Viel Glück!

+0

Danke für die Aufmerksamkeit auf StreamGeometry - ich werde hineinschauen. Ich habe die "Low-Res" -Version bereits als vollständig ausgezoomt betrachtet. Wenn Sie jedoch zu weit hineinzoomen, treten beim Skalieren und Übersetzen Probleme auf. Siehe meine andere Frage zum Übersetzen einer Leinwand mit hoher Zoomstufe (http://stackoverflow.com/questions/3523541/translate-a-wpf-canvas-at-high-scale-factors-isnt-smooth-away-from-origin)). – FTLPhysicsGuy