2009-10-28 14 views
20

Zakładając, że górny lewy róg wynosi (0,0) i otrzymuję kąt 30 stopni, punkt początkowy (0,300), długość linii 600 , jak obliczyć końcowy punkt linii tak, aby linia była reprezentatywna dla podanego kąta.Podając kąt i długość, w jaki sposób obliczyć współrzędne

C pseudo-kod jest

main() { 
    int x,y; 

    getEndPoint(30, 600, 0, 300, &x, &y); 
    printf("end x=%d, end y=%d", x, y); 
} 

// input angle can be from 0 - 90 degrees 

void getEndPoint(int angle, int len, int start_x, int start_y, int *end_x, int *end_y) 
{ 

    calculate the endpoint here for angle and length 

    *end_x = calculated_end_x; 
    *end_y = calculated_end_y; 
} 
+0

Zakładam, że chcesz mieć typ (int *) dla end_x i end_y, a także odwracasz przypisania na końcu swojej funkcji. –

+0

Dzięki, chciałem obliczonych wartości. Edytowane w celu odzwierciedlenia tego. – amanda

+0

Oznacza, że ​​twój podpis funkcji jest zły. Naprawię to. –

Odpowiedz

37
// edit to add conversion 
    #define radian2degree(a) (a * 57.295779513082) 
    #define degree2radian(a) (a * 0.017453292519) 

     x = start_x + len * cos(angle); 
     y = start_y + len * sin(angle); 
+12

'cos()' i 'sin()' wziąć radiany, bądź ostrożny. –

+4

radians = pi * degrees/180 – Brian

+0

To działało idealnie ... czasami robię rzeczy zbyt trudne. Dzięki wielkie! – amanda

1

math.h posiada wszystkie funkcje trygonometryczne należy potrzebujesz. Być może będziesz musiał podać -lm linkerowi, w zależności od systemu, na którym budujesz (czasami jest to automatyczne).

1

Nie mówisz, jaki kąt jest mierzony w stosunku do tego, w jakim kierunku idą twoje osie. Te będą miały znaczenie.

Najpierw musisz przeliczyć ze stopni na radiany (pomnóż przez PI i podziel przez 180). Następnie musisz wziąć sinus i cosinus swojego kąta i pomnożyć je przez długość linii. Masz teraz dwie liczby dla swoich współrzędnych, ale zależy to od kierunku, w jakim idą osie i od tego, gdzie mierzysz swoje kąty, które z tych wartości jest współrzędną x, a które jest y, i czy którekolwiek z nich musi zostać zanegowane.

2
// Here is a complete program with the solution in C and command-line parameters 
// Compile with the math library: 
// gcc -Wall -o point_on_circle -lm point_on_circle.c 
// 
// point_on_circle.c 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

double inline degree2radian(int a) { return (a * 0.017453292519); } 

void getEndPoint(double angle, int len, int start_x, 
    int start_y, int *end_x, int *end_y) { 
     *end_x = start_x + len * cos(angle); 
     *end_y = start_y + len * sin(angle); 
} // getEndPoint 

int main(int argc, char *argv[]) { 
    double angle = atoi(argv[1]); 
    int length = atoi(argv[2]); 
    int start_x = atoi(argv[3]); 
    int start_y = atoi(argv[4]); 
    int x, y; 

    getEndPoint(degree2radian(angle), length, start_x, start_y, &x, &y); 
    printf("end x=%d, end y=%d\n", x, y); 

    return 0; 
} // main 
0

Ludzie zapominają biblioteki w C++, który dokłada polarny do prostokątnych konwersji dla nas complex.

complex<double> getEndPoint(complex<double> const &startPoint, double magnitude, double radians) 
{ 
    return startPoint + polar<double>(magnitude, radians); 
} 

int main() 
{ 
    complex<double> startingPoint(0.0, 300.0); 
    auto newPoint = getEndPoint(startingPoint, 600, 0.523598776); 

    cout << newPoint << endl; 
} 

Będę też ostrożny z wybraną terminologią. Kiedy widzę w nazwie nazwę get, myślę o tym, że pobiera ona gdzieś odpowiedź. W tym przykładzie obliczamy coś, co może być fałszywym zapewnieniem dla użytkownika kodu.

Powiązane problemy