簡體   English   中英

C#中的角度測量器

[英]Angle Measurer in C#

我想制作一個可以測量表單上兩個用戶定義的點之間的角度的工具。 我目前沒有代碼可以執行此操作,因此任何代碼都將不勝感激。

謝謝

更新

它必須以度為單位,我的點是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。

要找到由三個點形成的角度,可以使用點積 假設您設置了以下三點:

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

我假設您想找到由點dot1dot2dot3創建的線之間的角度theta ,它們是您從用戶那里收集的點。 然后,您可以定義兩個向量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()返回以弧度為單位的角度)。

與In silico的答案類似,您可以使用點積和叉積的組合來獲取角度,而不僅僅是不定向角度。

其中a和b是分別從要計算與圖片框角之間的角度的點開始的矢量。

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

axb = | a | | b | 罪孽

axb / a * b = tan theta

atan2(axb,a * b)= theta

要測量角度,您需要三個點或一個基本方向。

Math.Atan2(y,x)可用於測量與x軸的角度。

請注意,y是第一個參數,而不是第二個。 與該函數的其他版本不同,x = 0時很安全

要將以弧度表示的結果轉換為度數,您需要乘以(180 / Math.PI)

嘿,這似乎是一個作業問題,所以我不會直接回答,但是您可以在這里找到一些東西:

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

總是有適當按摩過的atan2(dy2, dx2) - atan2(dy1, dx1)

首先,您需要測量點之間的距離:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM