0

私は古いTurboC++を使用しており、初心者です。これは私が計画している進行中のプロジェクトのコードです。

円は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;
    }


   } 
4

1 に答える 1

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;
于 2012-06-19T07:42:10.210 に答える