2010-11-11 3 views
0

Я хочу создать инструмент, который может измерять углы между двумя определяемыми пользователем точками на форме. У меня нет кода, чтобы сделать это в данный момент, поэтому любой код будет оценен.Угловой измеритель в C#

Благодаря

UPDATE

Он должен быть в градусах и мои пункты 3 PictureBoxes, каждый с разными цветами на каждой из трех точек для измеряемого угла.

UPDATE

Это мой новый текущий код:

namespace Angle_Measurer_Tool 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent();     
     } 

     int Dotter = 0; 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Dotter = 1; 
     } 

     public int Distance2D(int x1, int y1, int x2, int y2) 
     {  
      int result = 0; 
      double part1 = Math.Pow((x2 - x1), 2); 

      double part2 = Math.Pow((y2 - y1), 2); 
      double underRadical = part1 + part2; 
      result = (int)Math.Sqrt(underRadical); 

      return result; 
     } 

     private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
     { 
      if (Dotter == 1) 
      { 
       dot1.Visible = true; 
       dot1.Location = e.Location; 
       Dotter = 2; 
      } 
      else if (Dotter == 2) 
      { 
       dot2.Visible = true; 
       dot2.Location = e.Location; 
       Dotter = 3; 
      } 
      else if (Dotter == 3) 
      { 
       dot3.Visible = true; 
       dot3.Location = e.Location; 
       Dotter = 4; 
      } 
      else if (Dotter == 4) 
      { 
       dot1.Visible = false; 
       dot2.Visible = false; 
       dot3.Visible = false; 
       Dotter = 1; 
      } 

      anglesize.Text = Convert 
       .ToInt32(Distance2D(
          dot1.Location, 
          dot2.Location, 
          dot3.Location)) 
       .ToString(); 
     } 
    } 
} 

и моя проблема линия фактически поставив размер угла в метке я сделал под названием anglesize.

+0

В каком блоке? Градусы? Радиан? Также как вы хотите измерить угол между двумя пятнами? !! Должен быть и третий! : D Или между двумя строками ...? – M2X

+0

Какое ваше "пятно"? Это точка? И как это определяется? –

+0

Чтобы добавить то, что M2X и Albin Sunnanbo сказали, какую систему координат вы используете? Вы делаете это в необработанных пикселях или используете какую-то другую меру измерения? Есть ли у вас базовое понимание тригонометрии? –

ответ

13

Чтобы найти угол, образованный тремя точками, вы можете использовать dot product. Скажем, у вас есть три очка, настроенные так:

 dot1   
    /
    A/
/
/theta 
dot2-------dot3 
     B 

Я предполагаю, что вы хотите, чтобы найти угол theta между линиями созданных точек dot1, dot2 и dot3, где они очки, которые вы собрали из Пользователь. Затем, вы можете определить два вектора A и B:

A = dot1 - dot2 
B = dot3 - dot2 

Вычитание двух точек просто означает, что вы вычитать каждый соответствующий компонент. Так может выглядеть в коде:

// I'll just use another point to represent a vector 
Point A = new Point(); 
A.X = dot1.X - dot2.X; 
A.Y = dot1.Y - dot2.Y; 

Point B = new Point(); 
B.X = dot3.X - dot2.X; 
B.Y = dot3.Y - dot2.Y; 

Угол между этими двумя векторами, как определено скалярное произведение является:

   A * B 
theta = acos(-----------) 
      ||A|| ||B|| 

Где ||A|| и ||B|| являются длины векторов A и B соответственно, который является квадратным корнем из суммы квадратов компонентов (что является просто формулой расстояния).

double ALen = Math.Sqrt(Math.Pow(A.X, 2) + Math.Pow(A.Y, 2)); 
double BLen = Math.Sqrt(Math.Pow(B.X, 2) + Math.Pow(B.Y, 2)); 

Скалярное произведение A * B просто сумма произведений компонент, поэтому он может выглядеть в коде:

double dotProduct = A.X * B.X + A.Y * B.Y; 

Таким образом, вы, возможно иметь скалярное произведение определено следующим образом:

double theta = (180/Math.PI) * Math.Acos(dotProduct/(ALen * BLen)); 

Это дает угол в градусах (помните, что Math.Acos() возвращает угол в радианах).

+0

Это вычисляет только неориентированный угол. Во многих приложениях имеет значение, если угол равен + 30deg или -30deg. – CodesInChaos

+1

@CodeInChaos: Правильно, но, к сожалению, вопрос OP действительно отсутствует в деталях, поэтому я дал «самый очевидный» ответ. Я обновлю свой ответ, как только ОП на самом деле даст нам ключ к необходимости. –

+0

Итак, где это вписывается в мой код, мне нужно сделать отдельную функцию в моей программе, чтобы она работала? –

0

Для измерения угла вам понадобятся три точки или базовое направление.

Math.Atan2(y, x) может использоваться для измерения угла по оси x.

Обратите внимание, что y является первым параметром, а не вторым. В отличии от других версий этой функции безопасно с й = 0

Чтобы преобразовать результат, который дается в радианах в градусы вам нужно умножить на (180/Math.PI)

0

Эй это выглядит как домашнее задание вопрос, поэтому я не буду отвечать прямо, но вы можете найти что-то здесь:

http://msdn.microsoft.com/en-us/library/system.math.atan.aspx

+0

Это не обязательно вопрос о домашнем задании. Я использовал sin/cos/acos2 как функции blackbox для преобразования из (x, y) в (угол, длина) и обратно, прежде чем я узнал тригонометрию. Например, эта проблема возникает даже в очень простых играх. – CodesInChaos

-1

Прежде всего, необходимо измерить расстояние между вашими точками:

public int Distance2D(int x1, int y1, int x2, int y2) 
    { 

     int result = 0; 
     double part1 = Math.Pow((x2 - x1), 2); 

     double part2 = Math.Pow((y2 - y1), 2); 
     double underRadical = part1 + part2; 
     result = (int)Math.Sqrt(underRadical); 

     return result; 
    } 
+0

Как синус или косинус помогут ему? Ему нужны их обратные функции, чтобы получить угол. – CodesInChaos

1

похожи в ответе силикомарганца, вы можете использовать комбинацию продукта точки и поперечного продукт, чтобы получить угол, а не только неориентированную угол.

где a и b - векторы, выполняемые с точки, которую вы хотите вычислить, угол от углов ваших ящиков изображения соответственно.

a * b = | a | | Б | cos theta

axb = | a | | Б | Грех тета

AXB/а * Ь = загар тета

atan2 (AXB, а * б) = тета

0

Там всегда atan2(dy2, dx2) - atan2(dy1, dx1) соответствующим образом массируют.

Смежные вопросы