2010-11-11 76 views
0

我想製作一個可以測量窗體上兩個用戶定義點之間角度的工具。目前我沒有任何代碼可以做到這一點,所以任何代碼將不勝感激。C中的角度測量器#

由於

UPDATE

它需要在度和我的點是3個pictureboxes,每個上的每個的三個點的角度的不同的顏色進行測量。

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標籤行。

+0

在什麼單位?度?弧度?另外你想如何測量兩個點之間的角度?!還必須有第三個! :D或兩行之間......? – M2X 2010-11-11 21:03:22

+0

你的「現貨」是什麼?這是一個點嗎?它是如何定義的? – 2010-11-11 21:03:23

+0

要添加M2X和Albin Sunnanbo所說的內容,您使用的座標系是什麼?你是用原始像素來做這個,還是使用其他一些度量單位?你對三角學有基本的瞭解嗎? – 2010-11-11 21:04:17

回答

13

要找到三個點形成的角度,你可以使用dot product。假設你有三個點設置是這樣的:

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

我假設你想找到點dot1dot2和​​,他們在哪裏,你已經從收集點所創建的線之間的角度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()返回弧度的角度)的角度。

+0

這隻計算了無向角。在許多應用中,如果角度爲+ 30度或-30度,則很重要。 – CodesInChaos 2010-11-11 21:10:19

+1

@CodeInChaos:是的,但不幸的是,OP的問題真的缺乏細節,所以我給出了「最明顯」的答案。一旦OP實際給我們提供了線索,我會更新我的答案。 – 2010-11-11 21:15:29

+0

那麼,這適合我的代碼,我需要在我的程序中做一個單獨的功能,使其工作? – 2010-11-11 22:05:14

0

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

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

請注意,y是第一個參數,而不是第二個參數。與此功能的其他版本中,它是個安全= 0

要變換它的弧度給你需要使用(180/Math.PI)乘以度

0

嘿,這似乎是一個功課結果問題所以我不會直接回答,但你可以在這裏找到:

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

+0

這不一定是一個家庭作業問題。在學習三角學之前,我使用sin/cos/acos2作爲黑盒函數將(x,y)轉換爲(角度,長度)並返回。例如,即使在非常簡單的遊戲中也會出現此問題。 – CodesInChaos 2010-11-11 21:24:50

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

正弦或餘弦如何幫助他?他需要他們的反函數來獲得一個角度。 – CodesInChaos 2010-11-11 21:38:42

1

類似於在硅片的回答,您可以使用點積和叉積的組合來獲取角度,而不僅僅是無方向角度。

其中,a和b分別是從想要計算角度到圖像框角點的點運行的向量。

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

axb = | a | | B |罪THETA

AXB/A * B =黃褐色THETA

ATAN2(AXB,A * B)= THETA

0

人們總是atan2(dy2, dx2) - atan2(dy1, dx1)適當按摩。