Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
442 views
in Technique[技术] by (71.8m points)

winforms - Angle Measurer in 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.

Thanks

UPDATE

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.

UPDATE

This is my new current code:

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();
        }
    }
}

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...