Как передать эту структуру функции? у меня есть слабое представление, но мне нужен совет - PullRequest
1 голос
/ 07 мая 2020

Итак, у меня есть фрагмент кода, который сдвигает точку (x, y) в соответствии с вводом пользователем смещения x, смещения y и поворота (тета). точка является структурным типом pointA с float x и float y. Я создал функции для смещения x и y, но я не уверен, как приблизиться к повороту с учетом угла, я знаю, что мне нужно передать структуру через функцию, чтобы получить выходные данные x и y, но я не уверен, как это сделать -А совет, пожалуйста. Вот мой код:

#include <stdio.h>
#include <math.h>

float xNew(float x, float x2);
float yNew(float y, float y2);
float Rotate(float x, float y, float angle);

voide main()
{

typedef struct
{
float x;
float y;
}coordinate;

cooardinate pointA;
float x, y, x2, y2;

printf("Enter coordinates>");
scanf("%f%f, &pointA.x, &pointA.y);

printf("Enter x offset>");
scanf(%f, &x2);
x = xNew(pointA.x, x2);

printf("Enter y offset>");
scanf("%f", &y2);
y = yNew(PointA.y, y2);

/*enter rotation call function here*/

printf("offsets were %f%f\n", x2, y2);
printf("rotation was %f degrees\n", theta);
pointA.x = x;
pointA.y = y;
printf("struc coords are now %f%f", pointA.x, pointA.y);
}
printf("new coords are%f%f\n", x, y);

float xNew(float x, float x2)
{
float xpos;

xpos = x + x2;
return(xpos);
}

float yNew(float y, float y2)
{
float ypos;

ypos = y + y2;
return(ypos);

/enter rotation function declaration here*/
}

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Как упоминалось в других ответах, передача структуры указателем, вероятно, является лучшим вариантом. При этом функция будет выглядеть примерно так.

void Rotate(coordinate* point, float angle){
    //Calculate in radians
    angle = angle/180.0 * M_PI;

    float newX = cos(angle)*point->x - sin(angle)*point->y;
    float newY = sin(angle)*point->x + cos(angle)*point->y;

    point->x = newX;
    point->y = newY;
}

Кроме того, вам не нужно иметь функции для вычисления newX и newY для смещения. Вы можете просто обновить их как переменные.

pointA.x += x2;
pointA.y += y2;
1 голос
/ 07 мая 2020

Предполагая, что функции поворота потребуется изменить координату, вы, вероятно, должны передать структуру как указатель:

void Rotate(coordinate *coord, float angle);

Тогда функция может просто обновить координаты с помощью:

coord->x = newx;
coord->y = newy;

Вам не нужно возвращать значение, поскольку структура изменяется на месте, когда вы передаете на нее указатель.

0 голосов
/ 07 мая 2020

Вам нужно передать структуру по ссылке на функцию. То есть вам нужно передать указатель.

void Rotate(coordinate *point, float theta);

Затем вы вызываете функцию через

coordinate point;
point.x=SOME_VALUE;
point.y=SOME_OTHER_VALUE;

Rotate(&point,SOME_ANGLE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...