自定义角度的旋转点矩阵
Rotating matrix of points for a custom angle
我想制作点矩阵并将它们旋转自定义角度。
当我输入所需的角度时,我得到了一堆 0,不知道为什么。
可能是一个非常简单的错误,我是 C 语言编程的新手,正在尝试学习。
这是我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(){
double pi = 3.14159265;
double rot[2][2], obj[2][10], obj2[2][10];
int a, c, d, i, j;
double x,y, sum=0;
double element = 0;
printf("Enter the number of columns of the matrix:\n");
scanf("%d", &a);
printf("Enter the elements of the matrix:\n");
for (c = 0; c < 2; c++){
for (d = 0; d < a; d++){
scanf("%lf", &obj[c][d]);
}
}
printf("Enter the desired clockwise rotation angle:\n");
scanf("%lf", &x);
if ((int)x > 360){
x = (int)x % 360;
}
if ((int)x < 0){
x = 360 + x;
}
y = (pi / 180) * x;
rot[0][0] = cos(y);
rot[0][1] = sin(y);
rot[1][0] = -sin(y);
rot[1][1] = cos(y);
for (c = 0; c < 2; c++){
for (d = 0; d < a; d++){
for (i = 0; i < 2; i++){
sum += rot[c][i] * obj[i][d];
}
obj2[c][d] = sum;
sum = 0;
}
}
printf("Rotated object in matrix form:\n");
for (c = 0; c < 2; c++){
for (d = 0; d < a; d++){
printf("%f\t", obj2[c][d]);
}
printf("\n");
}
system("PAUSE");
return 0;
}
在矩阵字段中接受值时遇到问题,几乎所有值都是混乱的。 printf 函数中也有 & 所以它打印了错误的东西。现在一切都已解决,调整了一些输出以使其看起来更好,但它现在是一个有效的代码。
编辑:修复 printf 后,我在调试后得到 http://prntscr.com/7fgq7m。
EDIT2:输入值正常工作,现在将使用 sin() 和 cos() 部分来查看是否也有效。
最终编辑:对于我计划的值,一切都运行顺利,将与朋友进行更多测试,但这看起来不错。
谢谢大家的帮助,非常感谢。
从该行中删除 .
,使其显示为
scanf("%lf", &x);
如果打印输入值,会显示哪个错误。
此外,我看到您正在摸索检查输入值,但 sin()
和 cos()
只会在愚蠢的极端输入时失败。
还有一点,fflush(stdin)
是实现定义的,通常不需要。
更新 这是一个错误
for (d = 0; d < a; c++)
应该是
for (d = 0; d < a; d++)
scanf("%.lf", &obj[c][d]);
这是错误的。 "%.lf" 没有这样的说明符。对于 double 类型值,它必须是“%lf”。
您还使用了 fflush(stdin);
,这不适合刷新标准输入缓冲区,并且根据标准 (C11 7.21.5.2)
,这是未定义的行为。 (okey 编译器支持,但错误)。
您可以使用自己的类似功能;
void FlushStdin(void)
{
int ch;
while((ch = getchar()) != '\n' && ch != EOF )
;
}
我想制作点矩阵并将它们旋转自定义角度。
当我输入所需的角度时,我得到了一堆 0,不知道为什么。
可能是一个非常简单的错误,我是 C 语言编程的新手,正在尝试学习。
这是我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(){
double pi = 3.14159265;
double rot[2][2], obj[2][10], obj2[2][10];
int a, c, d, i, j;
double x,y, sum=0;
double element = 0;
printf("Enter the number of columns of the matrix:\n");
scanf("%d", &a);
printf("Enter the elements of the matrix:\n");
for (c = 0; c < 2; c++){
for (d = 0; d < a; d++){
scanf("%lf", &obj[c][d]);
}
}
printf("Enter the desired clockwise rotation angle:\n");
scanf("%lf", &x);
if ((int)x > 360){
x = (int)x % 360;
}
if ((int)x < 0){
x = 360 + x;
}
y = (pi / 180) * x;
rot[0][0] = cos(y);
rot[0][1] = sin(y);
rot[1][0] = -sin(y);
rot[1][1] = cos(y);
for (c = 0; c < 2; c++){
for (d = 0; d < a; d++){
for (i = 0; i < 2; i++){
sum += rot[c][i] * obj[i][d];
}
obj2[c][d] = sum;
sum = 0;
}
}
printf("Rotated object in matrix form:\n");
for (c = 0; c < 2; c++){
for (d = 0; d < a; d++){
printf("%f\t", obj2[c][d]);
}
printf("\n");
}
system("PAUSE");
return 0;
}
在矩阵字段中接受值时遇到问题,几乎所有值都是混乱的。 printf 函数中也有 & 所以它打印了错误的东西。现在一切都已解决,调整了一些输出以使其看起来更好,但它现在是一个有效的代码。
编辑:修复 printf 后,我在调试后得到 http://prntscr.com/7fgq7m。
EDIT2:输入值正常工作,现在将使用 sin() 和 cos() 部分来查看是否也有效。
最终编辑:对于我计划的值,一切都运行顺利,将与朋友进行更多测试,但这看起来不错。
谢谢大家的帮助,非常感谢。
从该行中删除 .
,使其显示为
scanf("%lf", &x);
如果打印输入值,会显示哪个错误。
此外,我看到您正在摸索检查输入值,但 sin()
和 cos()
只会在愚蠢的极端输入时失败。
还有一点,fflush(stdin)
是实现定义的,通常不需要。
更新 这是一个错误
for (d = 0; d < a; c++)
应该是
for (d = 0; d < a; d++)
scanf("%.lf", &obj[c][d]);
这是错误的。 "%.lf" 没有这样的说明符。对于 double 类型值,它必须是“%lf”。
您还使用了 fflush(stdin);
,这不适合刷新标准输入缓冲区,并且根据标准 (C11 7.21.5.2)
,这是未定义的行为。 (okey 编译器支持,但错误)。
您可以使用自己的类似功能;
void FlushStdin(void)
{
int ch;
while((ch = getchar()) != '\n' && ch != EOF )
;
}