[JAVA/C++] Wyznaczanie kąta pomiędzy odcinkami


(Grzesie K) #1

Witam, mam dane współrzędne punktów A, B, C w układzie kartezjańskim. Moim celem jest wyznaczenie kąta ABC. Znalazłem coś takiego i kilka innych podobnych artykułów, lecz gdzieś popełniam błąd. Mogę liczyć na pomoc?

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

	Scanner sc=new Scanner(System.in);

	int

		Ax=sc.nextInt(),

		Ay=sc.nextInt(),

		Bx=sc.nextInt(),

		By=sc.nextInt(),

		Cx=sc.nextInt(),

		Cy=sc.nextInt();

	double

		ABa=(Ay-By)/(Ax-Bx),

		BCa=(By-Cy)/(Bx-Cx),

		tan=Math.abs(ABa-BCa)/(1+ABa*BCa);

	System.out.println(tan+" "+(Math.atan(tan)*180/Math.PI));

    }

}

Ideone


([alex]) #2

Owszem znajdujesz kat między dwoma prostymi stanowiącymi dwa boki trójkąta, lecz teraz w zależności od ich pochylenia trzeba wyliczyć 180-X lub -X

Lepiej uzyj twierdzenia kosinusów: http://pl.wikipedia.org/wiki/Twierdzenie_cosinus%C3%B3w


(Grzesie K) #3

Dzięki, tego w szkole jeszcze nie miałem :smiley: Może komuś się przyda:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

	Scanner sc=new Scanner(System.in);

	int

		Ax=sc.nextInt(),

		Ay=sc.nextInt(),

		Bx=sc.nextInt(),

		By=sc.nextInt(),

		Cx=sc.nextInt(),

		Cy=sc.nextInt();

	double

		AB=Math.sqrt(Math.pow(Ax-Bx,2)+Math.pow(Ay-By,2)),

		BC=Math.sqrt(Math.pow(Bx-Cx,2)+Math.pow(By-Cy,2)),

		AC=Math.sqrt(Math.pow(Ax-Cx,2)+Math.pow(Ay-Cy,2)),

		alfa=Math.acos((AB*AB+BC*BC-AC*AC)/(2*AB*BC))*180/Math.PI;

	System.out.println(alfa);

    }

}

([alex]) #4
AB=Math.pow(Ax-Bx,2)+Math.pow(Ay-By,2),

      BC=Math.pow(Bx-Cx,2)+Math.pow(By-Cy,2),

      AC=Math.pow(Ax-Cx,2)+Math.pow(Ay-Cy,2),

      alfa=Math.acos((AB+BC-AC)/(2*Math.sqrt(AB)*Math.sqrt(BC)))*180/Math.PI;

(Grzesie K) #5

Przecież zapisałeś dokładnie to co ja tylko innym sposobem. Mi potrzebne są długości boków do dalszych obliczeń więc pozostaje przy swoim.


([alex]) #6

to zrób tak:

AB2=Math.pow(Ax-Bx,2)+Math.pow(Ay-By,2),AB=Math.sqrt(AB2),

      BC2=Math.pow(Bx-Cx,2)+Math.pow(By-Cy,2),BC=Math.sqrt(BC2),

      AC2=Math.pow(Ax-Cx,2)+Math.pow(Ay-Cy,2),AC=Math.sqrt(AC2);

      alfa=Math.acos((AB2+BC2-AC2)/(2*AB*BC))*180/Math.PI;

zrób sobie przysługę i oszczędzaj kosztownych operacji kiedy to się da, przyda ci się to nie raz. Np jeżeli często używasz *180/Math.PI oraz *Math.PI/180 to zrób sobie dwie zmienne może w dodatkowym pakiecie:

double RadToDeg = 180/Math.PI;

double DegToRad = Math.PI/180;

to zamiast: alfa=Math.acos((AB2+BC2-AC2)/(2*AB*BC))*180/Math.PI;

będzie: alfa=RadToDeg*Math.acos((AB2+BC2-AC2)/(2*AB*BC));

oszczędzasz na kosztownym dzieleniu przy każdej konwersji.