2017-01-23 10 views
-2

내 응용 프로그램은 그림 상자에서 2 점 사이의 거리를 제공합니다. 이전에 그들은 이것을 손으로하고 있었고 앱이 그것을하고 싶어했습니다. 그러나 선을 만들 때, 예를 들어 작은 선이라도 아래 수식을 사용하여 해당 선의 거리는 30입니다. 그러나 1/32로 눈금자를 사용하면 측정 값은 5/32가됩니다.2 포인트의 거리를 1/32로 변환 하시겠습니까?

그래서 30은 무엇입니까? 여기에 어떤 유형의 거리가 사용되며 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)))); 

그래서 여기까지했습니다.

  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; 

는, 내가 만든 작은 줄을, 나에게 0.7649706 을 제공하지만 나는 3,5,6 말을 확인하는 방법을 모르거나 통치자의 1/32을 사용하여 측정하면 어떤 그것이 될 것입니다.

+2

을 경우 점 위치는 픽셀 단위입니다. 따라서 픽셀 단위로 거리를 인치로 변환해야합니다. –

+2

그리고 intergers이므로 정수 연산 오류를 피하기 위해 float/double로 변환해야합니다. – TaW

+0

System.Numerics 라이브러리와 Vector2 클래스를 사용하면 이미 하드웨어 가속으로 구현 된 Length 함수가 있습니다. – Gusman

답변

1

이미지에 따라 다릅니다. 가지고있는 단위는 픽셀이므로 결과는 픽셀 단위입니다. 인치로 변환하려면 이미지의 밀도를 알아야합니다. 일반 이미지 인 경우 보통 72dpi 또는 96dpi이지만 이러한 유형의 인쇄 또는 이와 유사한 것으로 가정하므로 300dpi에서 모든 밀도로 다양합니다. 거리를 계산하기 전에 이것을 알아야합니다.

예를 들어, 이미지가 72dpi이고 거리가 30 인 경우, 인치 단위 거리는 30/72이 0.42 인치가됩니다.

이것은 정수 연산을 사용하지 마십시오. 이것은 많은 오류를 유발할 수 있습니다. 정확한 측정을 위해 결과에 십진법이 필요하고, 적어도 float을 사용하고, precision이 매우 높아야한다면 double을 사용하십시오.

또한, 대신 수동으로 수학 클래스는 System.Numerics nuget 패키지를 사용하여, 그것은 당신의 작업에 대한 예에 따라, 하드웨어 가속 그리고 벡터 조작에 관련 기능의 톤을 가지고 당신은 할 수 있습니다 :

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

내 업데이트를 확인하십시오. 이 번호를 1/32로 변환하려면 어떻게해야합니까? 1/32에 1입니까? 5/32는 5 분입니까? 여기에 무엇을해야할지 모르겠습니다. – Lee

+0

"1/32"는 무엇입니까? 1/32 인치를 의미합니까? 그렇다면 결과를 32로 곱하십시오. 결과는 이미 인치입니다. – Gusman

+0

예, 그것이 내 뜻입니다. – Lee