Obliczenie kąta nachylenia

0

Chciałbym napisać program, który wyliczy kąt nachylenia prostej do układu współrzędnych o początku układu na środku formy i wyświetli go np. na labelu. Jak wiadomo trzeba to wyliczyć jakoś z własności trygonometrycznych np. cosinusa. Tylko nie wiem za bardzo jak obliczyć długość wektora nachylenia (oznaczonego w moim kodzie jako c)?

public int srodekx = 0;
public int srodeky =0;
public int wspx;
public int wspy;

 private void Form1_Load(object sender, EventArgs e)
 {
             public int srodekx =  this.Width / 2  -30;
             public int srodeky = this.Height / 2  -30;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
    
            if (e.Button == MouseButtons.Left)
            {
                gr.Clear(panel1.BackColor);
                gr.DrawLine(p1, srodekx, srodeky, wspx + 30, wspy + 30);

                wspx = e.X;
                wspy = e.Y;

            }
            double wcos = Math.Acos((this.Height - srodekx)/c);
            double wynik = Math.Round(wcos * 180 / Math.PI,1);
        }

Z góry dzieki za każdą pomoc :)

0

Nie wiem czy o to ci chodzi ale majac wspolzedne wektora mozna obliczyc jego długość

sqrt(x2 + y2)

0

jest taka piękna funkcja która zwie się Atan2
// btw - zastanawiająco mało popularna wśród programistów

0

@unikalna_nazwa, a w jakich kręgach funkcja atan2 jest popularna?
@autor, jeżeli zostaniesz przy funkcji acos, to musisz jeszcze uwzględniać znak współrzędnej x. Funkcja acos zwraca liczbę (kąt) z przedziału [0,\pi], po przeliczeniu na stopnie, z przedziału [0,180].

0

Dzięki, funkcja atan2 działa poprawnie tylko, że punt startowy jest w lewym górnym rogu ekranu i funkcja zwraca mi tylko kąty z przedziału 0-90. Da sie jakoś ustawić na formie, żeby współrzędne środka formy to były [0,0], tak jak to jest np. w openglu?

   Graphics grafika;
        Pen pen1 = new Pen(Color.Red, 2);
        public int wspx = 0;
        public int wspy = 0;
        public int srodekx = 0;
        public int srodeky = 0;


        private void Form1_Load(object sender, EventArgs e)
        {
            srodekx = 280;
            srodeky = 160;
            grafika = panel1.CreateGraphics();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            grafika.DrawLine(pen1, 0, 160, 580, 160);
            grafika.DrawLine(pen1, 280, 0, 280, 355);
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            wspx = e.X;
            wspy = e.Y;
            grafika.Clear(panel1.BackColor);
            grafika.DrawLine(pen1, 0, 160, 580, 160);
            grafika.DrawLine(pen1, 280, 0, 280, 355);
            grafika.DrawLine(pen1, srodekx, srodeky, wspx, wspy);

            label1.Text = "X= " + wspx.ToString();
            label2.Text = "Y= " + wspy.ToString();
            label3.Text = "Tgalfa = " + Convert.ToString(Math.Atan2(wspx, wspy));
            label4.Text = "Kat = " + Convert.ToString(Math.Round(Math.Atan2(wspx, wspy) *180 / Math.PI,0));
        }

Z góry dzięki za każdą pomoc :)

0

Może tak:

Convert.ToString(Math.Atan2(wspx-srodekx, wspy-srodeky))

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.