0

我想制作一个可以测量表单上两个用户定义点之间角度的工具。我目前没有代码可以做到这一点,所以任何代码都会受到赞赏。

谢谢

更新

它需要以度为单位,我的点是 3 个图片框,每个图片框在要测量的角度的三个点上都有不同的颜色。

更新

这是我当前的新代码:

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。

4

6 回答 6

17

要找到由三个点形成的角度,可以使用点积。假设您已经像这样设置了三个点:

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

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

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||是向量的长度AB分别是分量平方和的平方根(简单来说就是距离公式)。

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()以弧度返回角度)。

于 2010-11-11T21:07:29.083 回答
1

类似于 In silico 的答案,您可以使用点积和叉积的组合来获得角度,而不仅仅是无向角度。

其中 a 和 b 是向量,分别从您要计算角度的点到图片框的角。

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

斧头 = |a| |b| 辛西塔

axb / a*b = tan theta

atan2(axb, a*b) = theta

于 2010-11-11T21:22:38.853 回答
0

要测量一个角度,您需要三个点或一个基本方向。

Math.Atan2(y, x)可用于测量与 x 轴的角度。

请注意,y 是第一个参数,而不是第二个。与此函数的其他版本不同,它在 x=0 时是安全的

要将以弧度表示的结果转换为度数,您需要乘以 (180/Math.PI)

于 2010-11-11T21:03:50.800 回答
0

嘿,这似乎是一个家庭作业问题,所以我不会直接回答,但你可以在这里找到一些东西:

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

于 2010-11-11T21:04:00.847 回答
0

总有atan2(dy2, dx2) - atan2(dy1, dx1)适当的按摩。

于 2011-03-07T21:43:59.360 回答
-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;
  }
于 2010-11-11T21:11:43.140 回答