Ich muss viel auf einem Raster mit einem Abstand von 12,5 Pixel X und 20 Pixel Y (die PICA-Skala) zu zeichnen. Die Schrift muss eine bestimmte Größe haben und die Linien müssen immer noch ein Pixel dick sein. Momentan speichere ich diese Werte in Fließkommazahlen und multipliziere sie (z. B. Text beginnend in Zeile 3, Spalte 6 wird als Koordinaten 2f * cx, 5f * cy gezeichnet). Ich möchte diese unnötige Multiplikation vermeiden, indem ich eine Maßstabsumwandlung benutze, die aber leider auch die Schriftgröße und Linienstärke beeinflusst. Gibt es eine Möglichkeit, dies zu vermeiden? Oder würde der Compiler das still für mich tun, da die cx/cy-Werte Konstanten sind?C# Scaling GDI-Positionen, aber nicht Schriftgröße oder Linienstärke
Antwort
Der Compiler sollte den konstanten Teil der Ausdrücke auf eine einzige Konstante reduzieren, aber es muss immer noch eine Multiplikation zur Laufzeit geben, da der Wert Ihres Gleitkommazugs zur Kompilierungszeit nicht bekannt ist. Also kann (1 + 2 + c) * 6 * f vom Compiler auf n * f reduziert werden, wenn c eine Konstante ist.
Ihre beste Wette, um die Skalierung Ihres Textes zu verhindern, ist wahrscheinlich, eine Skalierungstransformation einzurichten, alle Nicht-Textgrafiken zu zeichnen, die Sie nicht interessieren, minimale Linienbreiten beizubehalten, dann Ihren Text ohne die Transformation zu zeichnen. Sie können die Transformation verwenden, um zu lokalisieren, wo der Text beginnen soll, um sich selbst zu errechnen, dass er dies unabhängig berechnen muss - eine Funktion wie LPtoDP (logischer Punkt zum Gerätepunkt) sollte den Trick machen.
Eine weitere Möglichkeit, dies zu erreichen, besteht darin, den Text in der Transformation zu rendern, aber eine umgekehrte Skalierung auf die Textgröße anzuwenden. Wenn die Transformation also um 5% reduziert wird, skalieren Sie die Schriftgröße um 5%. Dies wird keine genauen Ergebnisse liefern, könnte aber für Visuals nahe genug sein.
... Microsoft hat auch einen kleinen "Hack" für uns hinterlassen, wenn Sie nicht möchten, dass Zeilen skaliert werden. Stellen Sie die Breite der Linie auf 0px, und es wird immer ein einzelnes Pixel dick gezeichnet.
Wow. Das wusste ich nicht. Das ist ordentlich. – Patrick
Das ist brilliant, du bist ein Beinende. –
- 1. SKSpriteNode scaling nicht richtig
- 2. Direct3D Linienstärke
- 3. OpenGL Linienstärke
- 4. Scaling Drupal
- 5. Scaling Phoenix auf Heroku
- 6. A Scaling Paginator
- 7. Scaling Picturebox ändert das Bild überhaupt nicht
- 8. Scaling Sprites in Cocos2d
- 9. Ändern der Linienstärke von gtk_render_line
- 10. Scaling Web-Anwendung
- 11. ggplot Linienstärke in der Legende reduzieren
- 12. Scaling UIwebview swift
- 13. Scaling socket.io zwischen Servern
- 14. mediaelement.js - Video Scaling Optionen (z. B. 'fit' oder 'fill')
- 15. Heroku Dyno/Worker Scaling
- 16. Scaling mysql in Docker
- 17. Java Advanced Imaging Scaling Bild
- 18. Scaling ein div mit Fenstergröße
- 19. UITableViewCell Schriftgröße ändert sich nicht
- 20. Wie ändere ich die Linienstärke in iText?
- 21. Linienstärke von Marker Kontur gegen Series Linie
- 22. Unterstreichung mit pdfnet ergibt unterschiedliche Linienstärke
- 23. Die Schriftgröße des Labels in C# kann nicht geändert werden
- 24. Linienstärke auf beiden Seiten des Diagramms
- 25. Scaling Rotation Shearing Reflection Algorithmen
- 26. Scaling Storyboard von iPhone zu iPad
- 27. UITextView Schriftgröße Klasse nicht ändern
- 28. Amazon Auto Scaling API für Jobserver
- 29. CSS-Taste Schriftgröße funktioniert nicht
- 30. Matplotlib: Linienstärke wird zur Länge einer Linie hinzugefügt.
Gibt es eine LPtoDP-Funktion in den Grafikklassen, oder müsste ich das selbst machen? Es gibt eine Menge Textausgaben, aber ich möchte das so schnell wie möglich (es gehört tatsächlich in OnPaintBackground) und der Aspekt ist nicht 1: 1, also glaube ich nicht, dass eine umgekehrte Skalierung eine gute Wahl wäre. – Patrick
LPtoDP ist eine Win32 GDI-API-Funktion. Es kann ähnlich in den .NET-Grafikklassen sein, nicht sicher. – dthorpe