池球运动计算算法

时间:2018-11-05 16:19:41

标签: c algorithm

我需要帮助或构思如何为台球游戏/程序制定算法。

我需要将此作为我的拼贴画的项目,因此仅需使用基本和循环将其编写得尽可能简单,可惜我不能使用数组或函数。

程序的全部要点是计算球在桌子角处需要多少步/击球才能达到起点(假设球具有无限的速度,并且没有其他球等。)我们认为这是可能的)

我们需要将表视为具有(mxn)尺寸的坐标系,并且需要输入球的起点(x1,y1)和球首次击中桌子的点( x2,y2),我们需要根据该信息制定一种算法,以计算出球到达起点所需的击打数/步数。

我有一个想法可以利用这样一个事实,即球在撞击时具有相同的角度,这意味着如果球以30度角击中桌面,它将以相同的角度从另一侧击退桌面。因此,由于将表格设置为坐标系,因此我可以使用atan来计算角度,然后使用该信息来计算与另一点的距离。我用我知道的信息制作了一个程序,但是这行不通,因为这只是一种计算(我想我将需要使用for(s)循环来计算所有内容。而且在理解如何设置方面存在很大的问题表的边缘,因为我的某些计算超出了(mxn)空间。

我将随附提供给我们的2张图片作为示例以及所用代码的一部分。我希望有人能帮助我,如果我在语法上犯了很多错误,对不起,英语不是我的主要语言。

谢谢。

图片:

橙色点是起点,橙色线是我们输入的第一个匹配点,其他所有内容都需要计算:

Orange dot is the starting point, orange line is the first hit that we input,everything else needs to be calculated

与图片一相同,但示例更复杂:

Same as picture one but more complex example

我的代码:

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

1 个答案:

答案 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)

因此,要找出球回到起点的时间,请解决:

  • (2aM-2x0)/ vx =(2bN-2y0)/ vy
  • (2aM-2x0)/ vx = 2bN / vy
  • 2aM / vx =(2bN-2y0)/ vy
  • 2aM / vx = 2bN / vy

表示最小整数 a> 0 b> 0

所有这些都简化为容易解决的线性Diophantine方程:https://en.wikipedia.org/wiki/Diophantine_equation

一旦您知道回到起点需要多长时间,就可以使用上面的其他方程式来计算撞墙的次数。