Domanda

Sto scrivendo una funzione per disegnare gli handle dell'interfaccia utente (ruotare, ridimensionare e così via) nella mia area client in un'applicazione Windows Forms.La funzione viene chiamata quando viene selezionato un oggetto.

Il chiamante mi invia un oggetto Graphics correttamente ruotato, ridimensionato e tradotto per adattarsi allo schema più ampio delle cose (l'oggetto selezionato ha la propria rotazione/traslazione/scala e l'handle dell'interfaccia utente ha una traslazione e rotazione relativa rispetto all'oggetto selezionato).Ora, voglio che i miei handle dell'interfaccia utente abbiano la stessa dimensione indipendentemente dalla scala del genitore (oggetto selezionato).

Come posso eliminare/reimpostare il fattore di scala nella matrice di trasformazione?Come posso ripristinare una scala di 1 mantenendo i preziosi valori di traslazione e rotazione?

È stato utile?

Soluzione

Geometria antigrano utilizza un metodo di base per determinare il ridimensionamento di una trasformazione (implementazione trovata in agg_trans_affine.cpp).Lo fa:

  1. Calcolo della rotazione della trasformazione
  2. Duplicando la trasformazione e applicando la rotazione opposta
  3. Trasformare due punti noti e calcolare la scala dal risultato

Tradotto in C#, questo assomiglia a:

Matrix transform = (Matrix)graphics.Transform.Clone();

PointF[] rotationPoints = new PointF[] { new PointF(0, 0), new PointF(1, 0) };
transform.TransformPoints(rotationPoints);

double rotationRadians = Math.Atan2(rotationPoints[1].Y - rotationPoints[0].Y, rotationPoints[1].X - rotationPoints[0].X);
transform.Rotate((float)(-rotationRadians * (180.0 / Math.PI)));

PointF[] scalePoints = new PointF[] { new PointF(0, 0), new PointF(1, 1) };
transform.TransformPoints(scalePoints);

float xScale = scalePoints[1].X - scalePoints[0].X;
float yScale = scalePoints[1].Y - scalePoints[0].Y;

Il codice AGG contiene anche un avvertimento che ci sono casi degenerati in cui questo non funzionerà correttamente, ma potrebbe essere utile per la tua situazione.

Altri suggerimenti

Si deve essere consapevoli del fatto che l'ordine delle trasformazioni è importante. Pertanto, solo la rimozione della scala può cambiare il "significato" dei seguenti traduzioni (offset per esempio).

Forse solo tenere un registro della scala applicata finora (chiamiamolo questo currentscale) e aggiungere una scala da 1/currentscale ai vostri tranformations.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top