0

フォーム上の2つのユーザー定義スポット間の角度を測定できるツールを作成したいと思います。現時点ではこれを行うためのコードがないので、どんなコードでもいただければ幸いです。

ありがとう

アップデート

それは度である必要があり、私のポイントは3つのピクチャーボックスであり、角度を測定するために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

3 点によって形成される角度を見つけるには、内積を使用できます。次のように 3 つのポイントが設定されているとします。

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

pointsとthetaによって作成された線の間の角度を見つけたいと思います。ここで、それらはユーザーから収集した点です。次に、2 つのベクトルとを定義できます。dot1dot2dot3AB

A = dot1 - dot2
B = dot3 - dot2

2 つのポイントの減算は、対応する各コンポーネントを減算することを意味します。したがって、コードでは次のようになります。

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

内積によって定義されるこれら 2 つのベクトル間の角度は次のとおりです。

                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| コスシータ

axb = |a| |b| サインシータ

axb / a*b = タン シータ

atan2(axb, a*b) = シータ

于 2010-11-11T21:22:38.853 に答える
0

角度を測定するには、3点または基本方向が必要です。

Math.Atan2(y、x)を使用して、x軸に対する角度を測定できます。

yは最初のパラメータであり、2番目のパラメータではないことに注意してください。この関数の他のバージョンとは異なり、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 に答える