如何从P1到P2按顺序确定一行中的点?

时间:2010-02-07 02:29:21

标签: java android

嘿伙计们。我正在尝试为Android制作一个简单的游戏,其中玩家用一个拇指拖动太空船,并通过用另一个拇指敲击空间来向敌舰发射。事实上,要为穿越太空的子弹制作动画,我需要用户的宇宙飞船和屏幕的末端之间的点列表,这条线穿过用户点击的地方。

我知道我必须对该行进行参数化,并且已经阅读了一些关于该主题的内容,但我无法理解它,特别是关于如何将其转换为代码。我看到它的方式,我需要转换用户船(P1)和用户点击(P2)最小可能部分之间的线段,x和y之间的变化率,斜率,我猜。一旦我有了,我可以将变化率乘以距P1的距离,得到所需的点。

但它不太合适。任何帮助,将不胜感激。感谢。

编辑: 这就是我在做的事情。这就是计算变化率的全部,我在Beam的更新方法中使用它来通过乘以速度来更新它的位置......

Beam(Renderer r, float OX, float OY, float TX, float TY)
{
    super(r);

    p.x = (int) OX;
    p.y = (int) OY;

    paint = new Paint();
    paint.setColor(Color.BLUE);


    float X = TX - OX;
    float Y = TY - OY;

    boolean xPositive = X >= 0;
    boolean yPositive = Y >= 0;

    if(X < Y)
    {
        RateOfChangeX = Math.abs(X) / Math.abs(Y);
        RateOfChangeY = 1;
    }
    else
    {
        RateOfChangeX = 1;
        RateOfChangeY = Math.abs(Y) / Math.abs(X);
    }
    if(RateOfChangeX < 0 & xPositive)
    {
        RateOfChangeX = RateOfChangeX * -1;
    }
    if(RateOfChangeY < 0 & yPositive)
    {
        RateOfChangeY = RateOfChangeY * -1;
    }
}

3 个答案:

答案 0 :(得分:2)

这是如何插入两点之间的点的示例。绘制线条的代码非常不同且更简单

此示例位于C中,但代码可能很有用。 im是图像,stride是图像的步幅,sx和sy是你向上/向下或向左/向右移动的量。

float x=sx, y=sy;
  for ( int i=1; i < int(totalLength); i++ ) { 
    int  top = stride*int(y)    + int(x),
         bot = stride*int(y+1)  + int(x);
    float xr = x-int(x),
          xl = 1-xr,
          yt = y-int(y),
          yb = 1-yt;
    newLine[i]= im[top]*xr*yt   +
                im[top-1]*xl*yt + 
                im[bot]*xr*yb   +
                im[bot-1]*xl*yb;
    x+=xgain;
    y+=ygain;
  }

获取sx / sy (x1,y1)(x2,y2)是您要绘制的点...代码是python:

totalLength = math.sqrt(math.pow(x2-x1,2) + math.pow(y2-y1,2))

if x1 < x2:
  sx,sy,ex,ey=(x1,y1,x2,y2)
else:
  sx,sy,ex,ey=(x2,y2,x1,y1)

xgain = float(ex-sx)/totalLength
ygain = float(ey-sy)/totalLength

需要注意的是,您需要确定每个步骤的x和y移动,然后如图所示进行插值。想一想,只需在一张纸上写一个网格,然后查看每一步的点应该在哪里。围绕该点绘制1px乘1px的盒子。

此算法通过使用该框触摸的四个网格点之间的插值,从该点向后绘制1px x 1xx框,从而略微简化。请注意,跳过第一个像素,因为它是一种特殊情况。第一个像素表示问题,因为它可能在图像之外,您需要检查是否可以在实际执行计算之前进行计算。

答案 1 :(得分:1)

基本上你可以使用线性方程的Slope–intercept form。 要在不使用浮点运算的情况下执行此操作,您可以使用以下算法:

答案 2 :(得分:0)

Bezier Curve是最好的方法.....链接到这个

http://en.wikipedia.org/wiki/B%C3%A9zier_curve