triangle ellipsegeometry data wpf path

wpf - ellipsegeometry - Grosor invariante de la trayectoria sin importar la escala.



wpf path data (3)

Estamos utilizando wpf para desarrollar una aplicación tipo cad donde los dibujos se colocan en el lienzo utilizando el objeto Ruta. Acabo de encontrar un pequeño problema: cuando cada vez que escala / hago zoom en mi lienzo, todos los elementos en el lienzo se escalan y este es el comportamiento que quería pero también aumenta el grosor del trazo.

¿Hay alguna manera de aumentar / escalar / hacer zoom en los objetos pero aún así mantengo el mismo grosor de trazo de la ruta?

Cualquier ayuda en este sentido será muy útil para mí.


Finalmente conseguí la solución para la solución anterior. Lo hice estableciendo el StrokeThickness del StrokeThickness relación con la escala del Canvas .

Me gusta esto:

// scale = scaling factor applied to the canvas path.StrokeThickness = 1.0 / scale;

Esto solo funciona si ScaleX y ScaleY son uniformes.


He estado aquí varias veces, pero se me acaba de ocurrir esta idea, ¿qué tal si simplemente la envolvemos en un Viewbox?

Puede intentar esto: jugar con la Altura / Ancho no debería cambiar la relación de grosor a tamaño. Tal vez hace otras cosas malas que no he descubierto todavía ...

<Viewbox Height="50" Width="50"> <Path Stroke="Black" Fill="Black" StrokeThickness="0.8" Stretch="Uniform" Data="M0,0 20,20" /> </Viewbox>


Una mejor solución sería utilizar uno o más objetos System.Windows.Media.Geometry para almacenar sus rutas, puntos, etc.

Esta geometría se puede dibujar con un lápiz, por lo que podría cambiar el grosor del trazo cuando hace zoom, pero más flexible es usar la propiedad Transformar.

Usando la transformación, puede "ampliar" las coordenadas reales de la representación geométrica y no la visualización; por lo tanto, cuando la dibuja, no necesita jugar con las transformaciones de render.

Para calcular la transformación, utilizo el siguiente código como:

public static Matrix TransformShape(Rect fromPosition, Rect toPosition, bool flipVertical) { Matrix translateThenScale = Matrix.Identity; //we first translate to origin since that''s just easier translateThenScale.Translate(-fromPosition.X, -fromPosition.Y); //now we scale the graph to the appropriate dimensions translateThenScale.Scale(toPosition.Width / fromPosition.Width, toPosition.Height / fromPosition.Height); //then we flip the graph vertically around the viewport middle since in our graph positive is up, not down. if (flipVertical) translateThenScale.ScaleAt(1.0, -1.0, 0.0, toPosition.Height / 2.0); //now we push the graph to the right spot, which will usually simply be 0,0. translateThenScale.Translate(toPosition.X, toPosition.Y); return translateThenScale; }

donde el fromPosition Rect debe contener los límites no transformados, y el toPosition Rect debe contener los límites transformados. Esto también permite trivialmente escalar X e Y por separado, lo que a menudo es necesario para el trazado.

Es fácil calcular los límites de su geometría:

Geometry graphGeom; //[...] //the bounds are modified by the transform, so we want no transform! graphGeom.Transform = Transform.Identity; Rect graphBounds = graphGeom.Bounds; //then set the transform again //or, if the transform is axis-aligned, the following _should_ work: Rect graphBoundsAlt = graphGeom.Transform.Inverse.TransformBounds(graphGeom.Bounds);

Y, por supuesto, WPF puede decirle a qué límites debe realizar, si eso fuera necesario. Juntándolo, podrías hacer algo como

public void RecomputeTransform(Rect targetRect, bool flipVertical) { graphGeom.Transform = Transform.Identity; Rect graphBounds = graphGeom.Bounds; Matrix transMat = TransformShape(graphBounds,targetRect,flipVertical); graphGeom.Transform = new MatrixTransform(transMat); }

La ventaja de usar esta solución es que no necesita meterse con RenderTransforms, puede usar las transformaciones que cortan y / o escalan X e Y de forma independiente sin distorsiones extrañas en sus líneas, y puede tratar el Pen como un objeto opaco (es decir, más fácil de personalizar desde la interfaz de usuario: si selecciona el ancho del lápiz o lo que sea, no es necesario realizar más correcciones).