2015-09-21 63 views
0

我想實現一個任務,即在從用戶獲取長度輸入後調整線的大小。因此,我目前使用的是舊長度,舊點(P1,P2)並且具有找到新的P2後,從用戶的新長度。我在這裏粘貼代碼,我試圖調整使用斜坡線,但它不工作。我是全新的畫布部分任何類型的搜索提示也將明顯。謝謝提前。找出使用斜率和起點的座標

方法找出以前的點之間的角度:

public double calculateAngle(){ 
    if(selectedShape!=null){  
    InnWall shape = (InnWall)selectedShape; 
    if(shape!=null) 
    return calAngle(shape.y2-shape.y1, shape.x2-shape.x1); 
    } 
return -1; 
} 

方法,找出他的座標

public void calCoordinates(double length){ 

     InnWall shape = (InnWall)selectedShape; 
     if(shape!=null){ 
      double angle = calculateAngle(); 
     Log.e(TAG, "cal angle"+(int)calculateAngle()); 
     Log.e(TAG, "cal length"+(int)length); 
     Log.e(TAG, "x coodinatee"+shape.x1+length*Math.cos(angle)); 
     Log.e(TAG, "y coodinatee"+shape.y1+length*Math.sin(angle)); 
     shape.x2=(float)(shape.x1+length*Math.cos(angle)); 
     shape.y2=(float)(shape.y1+length*Math.sin(angle)); 

} 

private double calAngle(double dy,double dx){ 
     return double compassBearing=dy/dx; 
} 
+0

calAngle()'? – JimmyB

+0

順便說一句,你根本不需要三角函數。 dx&dy與線的長度呈線性比例關係。 – JimmyB

+0

@HannoBinder請參閱eddited之一 –

回答

1
double scale = old_length/new_length; 
dx = p2.x - p1.x 
dy = p2.y - p1.y 

你知道:

- scale_x^2 + scale_y^2 = scale^2 
- scale_x/scale_y = dx/dy 

因此:

scale_y = sqrt(scale * scale * dy *dy/(dx*dx + dy*dy)); 
scale_x = scale_y*dx/dy; 

如果相對點是P1 然後 p2.x + =(p2.x-p1.x)* SCALE_X p2.y + =(p2.y-P1。 y)* scale_y

理論上,對於縮放,您需要將點與一個縮放矩陣相乘,在您的情況下是2D。

[ 1 0 dx ] [ p1.x ] [ p2.x ] 
[ 0 1 dy ] [ p1.y ] = [ p2.y ] 
[ 0 0 1 ] [ 1 ] [ 1 ] 
+0

嗨Cosmin,首先謝謝你的解決方案。只有一個疑問,應該以像素爲單位? –

+0

另外它是否與需要延伸的線的方向(角度)有關?在我的情況下,它不能正常工作 –

+0

當線是垂直/水平時它工作正常。但是當線處於任何角度時它不工作。 –