Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 台球运动计算的算法_C_Algorithm - Fatal编程技术网

C 台球运动计算的算法

C 台球运动计算的算法,c,algorithm,C,Algorithm,我需要帮助或想法如何为台球游戏/程序制作算法 我需要这作为我的拼贴项目,所以这需要写得尽可能简单,只使用基本和循环,遗憾的是,我不能使用数组或函数 程序的全部要点是计算球到达起点需要在桌子角上走多少步/击多少次(假设球有无限的速度,没有其他球等。我们简单地假设它是可能的) 我们需要将表格视为(m x n)维的坐标系,我们需要输入球的起点(x1,y1)和球第一次撞击表格的点(x2,y2)根据这些信息,我们需要制定一个算法,计算出球到达起点需要多少次击球/步数 我有一个想法,利用这个事实,球在撞击时

我需要帮助或想法如何为台球游戏/程序制作算法

我需要这作为我的拼贴项目,所以这需要写得尽可能简单,只使用基本和循环,遗憾的是,我不能使用数组或函数

程序的全部要点是计算球到达起点需要在桌子角上走多少步/击多少次(假设球有无限的速度,没有其他球等。我们简单地假设它是可能的)

我们需要将表格视为(m x n)维的坐标系,我们需要输入球的起点(x1,y1)和球第一次撞击表格的点(x2,y2)根据这些信息,我们需要制定一个算法,计算出球到达起点需要多少次击球/步数

我有一个想法,利用这个事实,球在撞击时会有相同的角度,这意味着如果球以30度的角度撞击桌子,它会以相同的角度从桌子上排斥到另一边。因此,由于表格被设置为坐标系,我可以使用atan计算角度,然后使用该信息计算与另一点的距离。我用我知道的信息编制了一个程序,但这不起作用,因为这只是一次计算(我想我需要使用for循环来计算所有内容。我在理解如何设置表的边缘时遇到了一个大问题,因为我的一些计算超出了(m x n)空间

我将附上2张图片,作为我使用的示例和代码的一部分。我希望有人能帮助我,如果我犯了很多语法错误,我很抱歉,英语不是我的主要语言

提前谢谢

图片:

橙色点是起点,橙色线是我们输入的第一个点击,其他一切都需要计算:

与图1相同但更复杂的示例:

我的代码:

#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;
}
#包括
#包括
#定义PI 3.14159265359
int main(){
int i;
双x1,y1,x2,y2;
int n,m;
双角度;
双X素,次素;
双倍距离;
双m1;
printf(“输入起始点(x1,y1)和第一个生命点(x2,y2)”;
扫描频率(“%lf%lf%lf%lf”、&x1、&y1、&x2、&y2);
printf(“输入尺寸(n x m)”;
scanf(“%d%d”,&n,&m);
m1=(y2-y1)/(x2-x1);
角度=atan(m1);
距离=sqrt(功率((x2-x1),2)+功率((y2-y1),2));
xPrim=x2+(-distanca*cos(ugao));
yPrim=y2+(distanca*sin(ugao));
返回0;
}

你应该分别考虑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>撞击另一面墙壁/vx并在时间2M/vx时再次回到起始位置。然后循环将重复

因此,对于所有整数a>0,它返回起始位置的时间是(2aM-2x0)/vx2aM/vx。它撞击墙壁的时间是(2aM-x0)((2a-1)M-x0)

类似地,在Y轴上,它回到起始位置的时间是(2bN-2y0)/vy2bN/vy,对于所有整数b>0。它撞击墙壁的时间是(2bN-y0)((2b-1)N-y0)

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

  • (凌晨2点-2x0)/vx=(20亿-2y0)/vy
  • (凌晨2点-2x0)/vx=20亿辆/vy
  • 2aM/vx=(20亿-2y0)/vy
  • 2aM/vx=20亿辆/vy
对于最小整数a>0b>0

所有这些都简化为易于求解的线性丢番图方程:


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

你不想输入击中点,但要从起点和给定角度来计算它,不是吗?所以对于所有其他即将到来的击中点。然后找到它穿过表格的那条线der(这是命中点),然后计算新角度并重新开始。给定的坐标是整数吗?首先,您好:位置(x,y)是整数还是实数?您使用了双精度,好像是实数。这会产生一个“到达其起点”的大问题然而,我认为你应该使用整数和圆坐标的墙壁击中。提示:代替计算反射,你可以考虑表的镜像副本,使它覆盖整个平面,并将路径视为直线。