Witam, czy biblioteka <math.h> posiada funkcje cyklometryczne? jeśli nie to jaka?
bo potrzebuje obliczyć kąt między wektorami, do czego potrzeba mi właśnie arcusa cosinusa.
http://en.cppreference.com/w/c/numeric/math
Rozdział "Trigonometric functions" - funkcje zaczynajace sie od litery "a" to chyba to czego szukasz.
michaloo napisał(a):
potrzebuje obliczyć kąt między wektorami
chciałbym to jednak obliczyć używając arcusa cosinusa i iloczynu skalarnego. Zatem mam tak:
#include <stdio.h>
#include <math.h>
int main()
{
float a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,v;
scanf("%f",&a);
scanf("%f",&b);
scanf("%f",&c);
scanf("%f",&d);
scanf("%f",&e);
scanf("%f",&f);
i=c-a;
j=d-b;
k=e-c;
l=f-d;
r=acos((i*k+j*l)/(sqrt(i*i+j*j)*sqrt(k*k+l*l)));
printf("%lf",r);
}
Ale coś chyba nie działa, źle oblicza. Co powinienem poprawić?
Może napisz co jest czym i czego potrzebujesz.
Gorzej nazwać zmiennych nie mogłeś, czyż tak nie jest czytelniej:
#include <stdio.h>
#include <math.h>
int main()
{
float ax, ay, bx, by, cx, cy;
scanf("%f %f",&ax, &ay);
scanf("%f %f",&bx, &by);
scanf("%f %f",&cx, &cy);
float vx=bx-ax;
float vy=by-ay;
float wx=cx-ax;
float wy=cy-ay;
double r=acos((vx*wx+vy*wy)/(sqrt(vx*vx+vy*vy)*sqrt(wx*wx+wy*wy)))*180/M_PI;
printf("%lf",r);
}
Czy nie prościej tak:
#include <stdio.h>
#include <math.h>
int main()
{
double ax, ay, bx, by, cx, cy;
scanf("%lf %lf",&ax, &ay);
scanf("%lf %lf",&bx, &by);
scanf("%lf %lf",&cx, &cy);
printf("%lf\n",180*(atan2(by-ay,bx-ax)-atan2(cy-ay,cx-ax))/M_PI);
return 0;
}
MarekR22 napisał(a):
Gorzej nazwać zmiennych nie mogłeś, czyż tak nie jest czytelniej:
#include <stdio.h>
#include <math.h>
int main()
{
float ax, ay, bx, by, cx, cy;
scanf("%f %f",&ax, &ay);
scanf("%f %f",&bx, &by);
scanf("%f %f",&cx, &cy);
float vx=bx-ax;
float vy=by-ay;
float wx=cx-ax;
float wy=cy-ay;
double r=acos((vx*wx+vy*wy)/(sqrt(vx*vx+vy*vy)*sqrt(wx*wx+wy*wy)))*180/M_PI;
printf("%lf",r);
}
to się wydaje to, czego chcę ale chyba coś źle liczy bo wpisując np kolejno (0;0),(5;0),(0;5) daje 90 a powinno byc 45. poza tym dlaczego jest na końcu to *180/M_PI? co oznacza to M_PI?
michaloo napisał(a):
to się wydaje to, czego chcę ale chyba coś źle liczy bo wpisując np kolejno (0;0),(5;0),(0;5) daje 90 a powinno być 45. poza tym dlaczego jest na końcu to *180/M_PI? co oznacza to M_PI?
Dobrze liczy bo w tym kodzie kąt jest liczony w rogu trójkąta, w którym jest punkt a
(0;0), a tam jest ewidentnie 90 stopni.
Możliwe, że zmieniając nazwy twoich zmiennych poprzestawiałem dane wejściowe.