用于绘制一种喷嘴(线)的算法,其方向由鼠标确定?

时间:2012-06-19 06:47:58

标签: c++

我正在使用旧的Turbo C ++并且是初学者。 这是我正在计划的正在进行的项目的代码。

圆圈随着WSAD键移动 但问题是我希望那个圆圈的喷嘴(中心的一条直线)跟随鼠标的移动,但是我无法弄清楚数学部分将喷嘴的长度限制为30像素。该线继续触摸指针的位置。

我尝试使用距离公式和线方程得到一个具有斜率和线长度的表达式。但问题在于分母中有一个平方根,我认为这会导致问题

此处的大多数代码对于以下问题都是不必要的,因此请忽略

这是相关代码

   originx=getmaxx()/2;
   originy=getmaxy()/2;

   while(doga==0)      //main game loop
     {      if(kbhit())
    op=getch();
        if(limiter>10)             //limiter is used to restrict the motion of the  circle for a limited                                 //  time
   { op=0;limiter=0;}         // otherwise the cirlce moves in that direction unless another                                      //key is pressed


       //movement of the circle
    if(op==72)
      { originy--;  limiter++;}
    if(op==80)
          {originy++;  limiter++;}
    if(op==75)
     { originx--;  limiter++ ;}
    if(op==77)
     { originx++;  limiter++;    }

    circle(originx,originy,5);

      mouseposi(x,y,cl);
   printf(" %d  %d",x,y);
   printf("\b\b\b\b\b\b\b\b");

     m=sloper(originx,originy,x,y);

     line(originx,originy,80/sqrt(1+m*m),m*80/sqrt(1+m*m)); //THIS LINE IS WHERE THE PROBLEM IS


      delay(30);
      cleardevice();
      if(op==49)          //for exiting
        doga=2;
    }


   } 

1 个答案:

答案 0 :(得分:3)

(x,y)成为你追求的点,(ox, oy)成为你的起源,(mx, my)是你的鼠标位置。

从原点到鼠标的矢量是(dx, dy) = (mx - ox, my - oy)

鼠标与原点之间的距离与该矢量的范数相同:

distance = sqrt(dx * dx + dy * dy);

规范化(缩放)矢量以获得长度为1(“单位长度”)的新矢量

nx = dx / distance;
ny = dy / distance;

最后我们可以按照所需的长度缩放这些坐标(记住要添加原点)

x = ox + length * nx;
y = oy + length * ny;