funkcje cyklometryczne

0

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.

1

http://en.cppreference.com/w/c/numeric/math

Rozdział "Trigonometric functions" - funkcje zaczynajace sie od litery "a" to chyba to czego szukasz.

0
michaloo napisał(a):

potrzebuje obliczyć kąt między wektorami

\alpha = atan2(\vec{a}\times\vec{b}, \vec{a}\cdot\vec{b})

http://www.cplusplus.com/reference/cmath/atan2/

0

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ć?

0

Może napisz co jest czym i czego potrzebujesz.

0

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);
}

http://ideone.com/bc7ENP

0

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;
}
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);
}

http://ideone.com/bc7ENP

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?

0
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1