2017-01-23 1 views
-2

Mon application donne la distance entre 2 points sur une photo. Auparavant, ils le faisaient à la main et voulaient une application pour le faire. Toutefois, lorsque vous créez la ligne, la distance pour cette ligne en utilisant la formule ci-dessous pour une petite ligne est par exemple 30. Toutefois, lorsque vous utilisez une règle avec 1/32, la mesure est 5/32.Convertir distance de 2 points en 1/32 de pouce?

Alors qu'est-ce que 30? Quel type de distance est utilisé ici et comment puis-je convertir cela pour afficher le nombre comme il le ferait en utilisant une règle avec une mesure 1/32?

//Distance between 2 points. 
//  ______________________ 
//d = √ (x2-x1)^2 + (y2-y1)^2  

dist = (Convert.ToInt32(Math.Sqrt(Math.Pow(Math.Abs(p2List[i].X - p1List[i].X), 2) + Math.Pow(Math.Abs(p2List[i].Y - p1List[i].Y), 2)))); 

Voici donc ce que j'ai fait.

  Vector2 src = new Vector2(p1List[i].X, p1List[i].Y); //first point on the image 
      Vector2 dst = new Vector2(p2List[i].X, p2List[i].Y); //second point on the image 
      float Density = 38; 
      Vector2 dif = dst - src; //difference between the vectors 
      float len = dif.Length(); //length of the vector, in this case the distance in pixels 
      float inchLen = len/Density; //density is a float with the image DPI's 

      DataGridViewRow row = dataGridView1.Rows[rowId]; 
      row.Cells["colLength"].Value = inchLen; 

Ce, pour la petite ligne que je fis, me donne 0.7649706 Mais je ne sais pas comment faire pour que dire un 3,5,6 ou quoi que ce serait si elle est mesurée à l'aide du 1/32 sur une règle.

+2

Si votre les positions des points sont en pixels, alors vous devez convertir la distance en pixels en pouces –

+2

Et comme ils sont des intergers, vous devez convertir en float/double pour éviter les erreurs mathématiques entières. – TaW

+0

Utilisez la bibliothèque System.Numerics et la classe Vector2, la fonction Length est déjà implémentée avec l'accélération matérielle. – Gusman

Répondre

1

Cela dépend strictement de l'image. L'unité que vous avez est pixels, donc le résultat est la distance en pixels. Pour convertir en pouces vous devez connaître la densité de l'image, si c'est une image normale, ils sont généralement à 72dpi ou 96dpi, mais je suppose qu'ils sont pour un certain type d'impression ou de ce genre, donc ils varieront de 300dpi à n'importe quelle densité, Vous devez le savoir avant de calculer la distance. Donc, si par exemple, vous avez une image avec 72 dpi et vous obtenez une distance de 30, alors la distance en pouces sera 30/72 qui sont 0,42 pouces. N'utilisez pas l'arithmétique entière, cela causera une tonne d'erreurs, vous avez besoin des décimales au résultat pour obtenir une mesure précise, utilisez au moins un flotteur, et si la précision doit être très élevée, utilisez des doubles.

En outre, au lieu d'utiliser manuellement la classe Math utiliser le System.Numerics package NuGet, il est matériel accéléré et a une tonne de fonctions liées à la manipulation des vecteurs, par exemple pour votre tâche, vous pouvez faire:

Vector2 src = new Vector2(srcX, srcY); //first point on the image 
Vector2 dst = new Vector2(dstX, dstY); //second point on the image 

Vector2 dif = dst - src; //difference between the vectors 

float len = dif.Length(); //length of the vector, in this case the distance in pixels 

float inchLen = len/Density; //density is a float with the image DPI's 
+0

Vérifier ma mise à jour. Comment puis-je convertir ce nombre maintenant à ce que le 1/32 serait. Est-ce 1 pour 1/32? Est-ce 5 pour 5/32? Je ne sais pas quoi faire ici. – Lee

+0

Qu'est-ce que c'est «1/32»? tu veux dire 1/32 pouces? Si c'est le cas, multipliez le résultat par 32 car le résultat est déjà en pouces. – Gusman

+0

oui c'est ce que je veux dire. – Lee