在一条线上移动一个点:两点之间的线

时间:2012-10-24 10:57:07

标签: xcode geometry trigonometry

我在另外两点之间的线上有一个标签点。从行的第一个点开始说它的20个像素。

现在我想移动线的第一个点,带上标签点,所以我移动第一个点并将线重新绘制到线的最后一个点。 工作正常,但我如何将标签移动到新线,从左侧再次放入20px。

(长度20px随变量而变化,具体取决于用户将标签放在线上的位置)。

我在考虑使用Y = kx + m但是不能正确...

这是我到目前为止所写的:

-(double)positionOfLabel{
    //return relative position of label on old line, relatively the first point.
    return [self length]-   sqrt(self.label.center.x*self.label.center.x+self.label.center.y*self.label.center.y);
    //return [self length]-sqrt((self.last.x - self.label.center.x)*(self.last.x -  self.label.center.x) + (self.last.y - self.label.center.y)*(self.last.y -      self.label.center.y));
}

-(void)labelTranslate:(double)length{
    NSLog(@"Translating label length:%f", [self length]);
    double m= (self.last.y-self.first.y)/(self.last.x-self.first.x);
    double x= self.first.x+length/(sqrt(1+m*m));
    double y= x*m;
    NSLog(@"Moving label to:%f,%f", x,y);
    [self.label setCenter:CGPointMake(x, y)];


}

标签的位置是指返回标签放置的第一个点的距离。

线的移动示例,因此线的末端有两个点 image

正如您在图像中看到的,箭头表示由第一个和最后一个点组成的线。在箭头的移动/平移期间保留红点和第一点之间的距离。然而,这不能使用我的算法

2 个答案:

答案 0 :(得分:1)

使用Y = kx + m形式不是一个好主意(因为垂直线),所以建议采用参数形式:

enter image description here

Norm = Sqrt((X2-X1)*(X2-X1) + (Y2-Y1)*(Y2-Y1)) // check for 0
Dir_X = (X2 - X1) / Norm
Dir_Y = (Y2 - Y1) / Norm
Label_X = X1 + 20 * Dir_X
Label_Y = Y1 + 20 * Dir_Y

答案 1 :(得分:0)

线方程是解决方案之一,但我找到了另一个很好的例子。 Please check this link