2009-10-28 16 views
20

Supponendo che l'angolo in alto a sinistra sia (0,0) e che io abbia un angolo di 30 gradi, un punto iniziale di (0,300), una lunghezza di linea di 600 , come faccio a calcolare il punto finale della linea in modo da che la linea è rappresentativa dell'angolo dato.Dato un angolo e una lunghezza, come faccio a calcolare le coordinate

Il C pseudo-codice è

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

presumo che tu voglia al tipo di (int *) per end_x e end_y, oltre a capovolgere i tuoi compiti in giro alla fine della tua funzione. –

+0

Grazie, volevo i valori calcolati. Modificato per riflettere questo. – amanda

+0

Significa che la firma della funzione è sbagliata. Lo aggiusterò. –

risposta

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()' e 'sin()' prendi radianti, fai attenzione. –

+4

radians = pi * degrees/180 – Brian

+0

Ciò ha funzionato perfettamente ... a volte faccio le cose troppo duramente. Grazie mille! – amanda

1

math.h ha tutte le funzioni trigonometriche si dovrebbe avere bisogno. Potrebbe essere necessario dare -lm al tuo linker, a seconda del sistema su cui stai costruendo (a volte è automatico).

1

Non dire quale sia l'angolo misurato rispetto a, o in quale direzione vanno i vostri assi. Questi faranno la differenza.

Per prima cosa è necessario convertire da gradi a radianti (moltiplicare per PI e dividere per 180). Quindi devi prendere il seno e il coseno del tuo angolo e moltiplicarli per la lunghezza della linea. Ora hai due numeri per le tue coordinate, ma dipende da quali direzioni vanno i tuoi assi e da dove stai misurando i tuoi angoli quale di questi valori è la coordinata x e quale è la y, e se entrambi devono essere negati.

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

Le persone stanno dimenticando la libreria complex in C++, che fa polare per conversioni rettangolari per noi.

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

Farei anche attenzione alla terminologia scelta. Quando vedo get in un nome, penso a come recuperare una risposta memorizzata da qualche parte. In questo esempio, stiamo calcolando qualcosa, e questo potrebbe essere una falsa garanzia data ad un utente del tuo codice.

Problemi correlati