Угловой измеритель в C # - PullRequest
0 голосов
/ 12 ноября 2010

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

Спасибо

UPDATE

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

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.

Ответы [ 6 ]

16 голосов
/ 12 ноября 2010

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

     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() возвращает угол в радианах).

1 голос
/ 12 ноября 2010

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

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

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

axb = | a || Б |sin theta

axb / a * b = tan theta

atan2 (axb, a * b) = theta

0 голосов
/ 08 марта 2011

Там всегда atan2(dy2, dx2) - atan2(dy1, dx1) подходящим массажем.

0 голосов
/ 12 ноября 2010

Сначала вам нужно измерить расстояние между вашими точками:

    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 голосов
/ 12 ноября 2010

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

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

0 голосов
/ 12 ноября 2010

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

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

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

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

...