C#中的角度测量器

问题描述:

我想制作一个可以测量表单上两个用户定义的点之间的角度的工具.我目前没有代码可以执行此操作,因此任何代码都将不胜感激.

I want to make a tool that can measure angles between two user defined spots on a form. I have no code to do this at the moment, so any code would be appreciated.

谢谢

更新

它必须以度为单位,我的点是3个图片框,三个点中的每一个都有不同的颜色以用于测量角度.

It needs to be in Degrees and my points are 3 pictureboxes, each with different colours on each of the three points for the angle to be measured.

更新

这是我当前的新代码:

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的标签中的那一行.

and my problem is the line of actually putting the size of the angle in the label I have made called anglesize.

要查找由三个点形成的角度,可以使用点积.假设您设置了以下三个点:

To find the angle formed by three points, you can use the dot product. Say you have the three points set up like this:

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

我假设您想找到由点dot1dot2dot3创建的线之间的夹角theta,这些点是您从用户那里收集的点.然后,您可以定义两个向量AB:

I assume you want to find the angle theta between the lines created by points dot1, dot2 and dot3, where they're points that you've collected from the user. Then, you can define two vectors A and B:

A = dot1 - dot2
B = dot3 - dot2

两点相减仅表示您减去每个对应的分量.因此,在代码中可能看起来像这样:

Subtraction of two points simply means that you subtract each corresponding component. So it might look like this in code:

// 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;

点积定义的两个向量之间的夹角为:

The angle between these two vectors as defined by the dot product is:

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

其中||A||||B||分别是向量AB的长度,它是分量平方和的平方根(简称距离公式)./p>

Where ||A|| and ||B|| are the lengths of the vectors A and B respectively, which is the square root of the sum of the squares of the components (which is simply the distance formula).

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只是组件乘积的总和,因此在代码中可能看起来像这样:

The dot product A * B is simply the sum of the products of the components, so it might look like this in code:

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

因此,您可能定义了这样的点积:

So you may perhaps have a dot product defined like this:

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

这将为您提供以度为单位的角度(请记住,Math.Acos()将返回以弧度为单位的角度).

This gives you the angle in degrees (remember that Math.Acos() returns the angle in radians).