2012-02-18 75 views
2

我想通过到第一个点的距离计算线上的一个点。因为我没有任何新点的坐标,我不能使用线性插值... 我以为是这样的: Example Drawing (对不起,我是新用户,我不允许发布图像)按距离到第一个点的线上点

但实际上它不工作,所以我请你帮忙。

这里是在java中的实际代码:

public static PointDouble interpolationByDistance(Line l, double d) { 
    double x1 = l.p1.x, x2 = l.p2.x; 
    double y1 = l.p1.y, y2 = l.p2.y; 
    double ratioP = ratioLine_x_To_y(l); 
    double disP = l.p1.distance(l.p2); 
    double ratioDis = d/disP; 
    PointDouble pn = l.p2.getLocation(); 
    pn.multi(ratioDis); 
    System.out.println("dis: " + d); 
    System.out.println("new point dis: " + l.p1.distance(pn)); 
    return pn; 
} 

谢谢。

+0

您可以使用更具描述性的变量名中受益。我愿意打赌它会让你的生活更轻松。 – jonmorgan 2012-02-18 16:56:03

回答

3

作为程序员,您应该喜欢将问题更改为您已经解决的问题。查找的比例,然后使用线性插值:

public static PointDouble interpolationByDistance(Line l, double d) { 
    double len = l.p1.distance(l.p2); 
    double ratio = d/len; 
    double x = ratio*l.p2.x + (1.0 - ratio)*l.p1.x; 
    double y = ratio*l.p2.y + (1.0 - ratio)*l.p1.y; 
    System.out.println(x + ", " + y); 
    ... 
} 
+0

谢谢,非常好的算法! :) – Thomas 2012-02-18 17:16:57

+1

啊,我忘了提及:第3行应该是“double ratio = d/len;”。完全比例需要使用。 – Thomas 2012-02-18 17:32:55

+0

当然你是对的:)这也为我们节省了特例。 – 2012-02-18 18:07:22

1

这样做的基础是相当简单:

f = 0.3; 
xp = f * x1 + (1-f) * x2; 
yp = f * y1 + (1-f) * y2; 

要理解这一点,可以考虑:

  • 如果f==0,然后xp = x2, yp=y2
  • 如果f==1,然后xp = x1, yp=y1
  • 任何价值f之间0..1,你得到一个点之间的点(x1,y1)..(x2,y2)

我不确定你准确计算什么。这需要f的范围0..1。如果您有d作为绝对长度,请执行f=d/disP

相关问题