我需要帮助或构思如何为台球游戏/程序制定算法。
我需要将此作为我的拼贴画的项目,因此仅需使用基本和循环将其编写得尽可能简单,可惜我不能使用数组或函数。
程序的全部要点是计算球在桌子角处需要多少步/击球才能达到起点(假设球具有无限的速度,并且没有其他球等。)我们认为这是可能的)
我们需要将表视为具有(mxn)尺寸的坐标系,并且需要输入球的起点(x1,y1)和球首次击中桌子的点( x2,y2),我们需要根据该信息制定一种算法,以计算出球到达起点所需的击打数/步数。
我有一个想法可以利用这样一个事实,即球在撞击时具有相同的角度,这意味着如果球以30度角击中桌面,它将以相同的角度从另一侧击退桌面。因此,由于将表格设置为坐标系,因此我可以使用atan来计算角度,然后使用该信息来计算与另一点的距离。我用我知道的信息制作了一个程序,但是这行不通,因为这只是一种计算(我想我将需要使用for(s)循环来计算所有内容。而且在理解如何设置方面存在很大的问题表的边缘,因为我的某些计算超出了(mxn)空间。
我将随附提供给我们的2张图片作为示例以及所用代码的一部分。我希望有人能帮助我,如果我在语法上犯了很多错误,对不起,英语不是我的主要语言。
谢谢。
图片:
橙色点是起点,橙色线是我们输入的第一个匹配点,其他所有内容都需要计算:
与图片一相同,但示例更复杂:
我的代码:
#include <stdio.h>
#include <math.h>
#define PI 3.14159265359
int main() {
int i;
double x1,y1,x2,y2;
int n,m;
double angle;
double xPrime,yPrime;
double distance;
double m1;
printf("Enter the staring point (x1,y1) and first hit point(x2,y2) ");
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
printf("Enter the dimensions (n x m ) ");
scanf("%d %d",&n,&m);
m1=(y2-y1)/(x2-x1);
angle=atan(m1);
distance =sqrt( pow((x2-x1),2) + pow((y2-y1),2));
xPrim = x2 + (-distanca * cos(ugao));
yPrim = y2 + (distanca * sin(ugao));
return 0;
}
答案 0 :(得分:1)
您应该分别考虑X轴和Y轴。下面的讨论假定球最初在两个轴上开始沿正方向移动。如果不这样做,则将内容翻转到对称状态,这样就可以了。
使用 M x N ,起始点(x0,y0)和第一个匹配项(x1,y1)赋予表格大小>:
让 T 为从(x0,y0)到(x1,y1)的时间,因此初始速度(以每T为单位)为(vx,vy)=(x1-x0,y1-y0)
考虑到X轴,该球将在时间(M-x0)/ vx 击中墙壁,以 T 为单位。它将在时间(2M-2x0)/ vx 返回到起始 X 坐标。它会在时间(2M-x0)/ vx 撞到另一堵墙,并在时间 2M / vx 再次回到起始位置。然后循环将重复。
因此,对于所有整数,它返回起始位置的时间为(2aM-2x0)/ vx 和 2aM / vx a> 0 。撞墙的时间是(2aM-x0)和((2a-1)M-x0)。
类似地,在 Y 轴上,它回到起始位置的时间为(2bN-2y0)/ vy 和 2bN / vy < / strong>,对于所有整数 b> 0 。撞墙的时间是(2bN-y0)和((2b-1)N-y0)。
因此,要找出球回到起点的时间,请解决:
表示最小整数 a> 0 和 b> 0 。
所有这些都简化为容易解决的线性Diophantine方程:https://en.wikipedia.org/wiki/Diophantine_equation
一旦您知道回到起点需要多长时间,就可以使用上面的其他方程式来计算撞墙的次数。