2009-10-28 29 views
20

Suponiendo que la esquina superior izquierda es (0,0) y me dan un ángulo de 30 grados, un punto de partida de (0,300), una longitud de línea de 600 ¿Cómo calculo el punto final de la línea para que la línea es representativa del ángulo dado?Dado un ángulo y longitud, ¿cómo puedo calcular las coordenadas

El pseudo-código C es

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

supongo que desea al tipo de (int *) para end_x y end_y, así como también para cambiar sus asignaciones al final de su función. –

+0

Gracias, quería los valores calculados. Editado para reflejar eso. – amanda

+0

Quiere decir que la firma de su función es mala. Lo arreglaré. –

Respuesta

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()' y 'sin()' tomar radianes, tenga cuidado. –

+4

radianes = pi * grados/180 – Brian

+0

Eso funcionó perfectamente ... a veces hago las cosas demasiado difíciles. ¡Muchas gracias! – amanda

1

math.h tiene todas las funciones trigonométricas que usted debe necesitar. Es posible que deba proporcionar -lm a su vinculador, según el sistema que esté creando (a veces es automático).

1

No dice qué ángulo se mide en relación con, o de hecho, en qué dirección van sus ejes. Estos harán la diferencia.

Primero necesita convertir de grados a radianes (multiplicar por PI y dividir por 180). Luego debe tomar el seno y el coseno de su ángulo y multiplicarlos por la longitud de la línea. Ahora tiene dos números para sus coordenadas, pero depende de qué direcciones vayan sus ejes y de dónde esté midiendo sus ángulos, cuál de estos valores es la coordenada xy cuál es la y, y si alguno de ellos necesita ser negado.

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

personas están olvidando de la biblioteca complex en C++, lo que hace a las conversiones polares rectangulares para nosotros.

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

También tendría cuidado con la terminología elegida. Cuando veo get en un nombre, lo considero como recuperar una respuesta almacenada en alguna parte. En este ejemplo, estamos computando algo, y eso podría ser una falsa seguridad dada a un usuario de su código.

Cuestiones relacionadas