我知道我必须对该行进行参数化,并且已经阅读了一些关于该主题的内容,但我无法理解它,特别是关于如何将其转换为代码。我看到它的方式,我需要转换用户船(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;
}
}
答案 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是最好的方法.....链接到这个