Python 如何在两个方向上延伸线段

Python 如何在两个方向上延伸线段,python,math,line,Python,Math,Line,我被这个烦人的问题困扰了很久。我正在尝试编写代码,这样我可以缩放线段,这意味着如果我要缩放的量(例如)是2,而当前行的长度是33,那么整个长度将增加到67。意思是我把一半加在开头,一半加在结尾。。。 新正面-----a-------b--新背面。。。但是我很难把它翻译成代码。下面是一个代码示例。。endpoints方法应该返回元组中的端点,例如(p1,p2) 不确定我是否做对了,但是 使用线性插值(参数化直线方程) 您得到了由端点p0,p1以向量形式定义的线,因此其上的任何点都被定义为: p(

我被这个烦人的问题困扰了很久。我正在尝试编写代码,这样我可以缩放线段,这意味着如果我要缩放的量(例如)是2,而当前行的长度是33,那么整个长度将增加到67。意思是我把一半加在开头,一半加在结尾。。。 新正面-----a-------b--新背面。。。但是我很难把它翻译成代码。下面是一个代码示例。。endpoints方法应该返回元组中的端点,例如(p1,p2)



不确定我是否做对了,但是

  • 使用线性插值(参数化直线方程)

    您得到了由端点
    p0,p1
    以向量形式定义的线,因此其上的任何点都被定义为:

    p(t)=p0+(p1-p0)*t
    
    其中,
    p(t)
    是点(向量),
    t
    是范围内的标量参数

    t=<0.0,1.0>
    
    因此,如果
    t=0
    则得到点
    p0
    ,如果
    t=1
    则得到点
    p1

  • 现在只需重新缩放
    t
    范围

    所以你有scale
    s

    t0=0.5-(0.5*s)` ... move from half of line by scale towards p0
    t1=0.5+(0.5*s)` ... move from half of line by scale towards p1
    
    因此,新的端点是

    q0=p0+(p1-p0)*t0
    q1=p0+(p1-p0)*t1
    
  • [edit1]我是这样看的

    def scale(self,factor):
     t0=0.5*(1.0-factor)
     t1=0.5*(1.0+factor)
     x1 = self.firstPoint.x +(self.secondPoint.x - self.firstPoint.x) * t0
     y1 = self.firstPoint.y +(self.secondPoint.y - self.firstPoint.y) * t0
     x2 = self.firstPoint.x +(self.secondPoint.x - self.firstPoint.x) * t1
     y2 = self.firstPoint.y +(self.secondPoint.y - self.firstPoint.y) * t1
     self.firstPoint = Point(x1, y1)
     self.secondPoint = Point(x2, y2)
    

    请记住,我不是用python编写代码的,所以请带着偏见处理…

    使用公共度量值,您只需要分别调整每个维度

    我重写了代码的一些部分,以便更好地适应

    你可能想要完成那些你不熟悉的事情,以便在将来为自己节省很多时间

    class Line:
        def __init__(self, point_one, point_two):
            self.point_one = point_one
            self.point_two = point_two
    
        def __str__(self):
            return 'Line(p1:{},p2:{})'.format(self.point_one, self.point_two)
    
        @property
        def points(self):
            return self.point_one, self.point_two
    
        @property
        def length(self):
            return ((self.point_one.x - self.point_two.x)**2 + (self.point_one.y - self.point_two.y)**2)**0.5
    
        def scale(self, factor):
            self.point_one.x, self.point_two.x = Line.scale_dimension(self.point_one.x, self.point_two.x, factor)
            self.point_one.y, self.point_two.y = Line.scale_dimension(self.point_one.y, self.point_two.y, factor)
    
        @staticmethod
        def scale_dimension(dim1, dim2, factor):
            base_length = dim2 - dim1
            ret1 = dim1 - (base_length * (factor-1) / 2)
            ret2 = dim2 + (base_length * (factor-1) / 2)
            return ret1, ret2
    
    
    class Point:
        def __init__(self, x=0, y=0):
            self.x = x
            self.y = y
    
        def __str__(self):
            return 'Point(x={},y={})'.format(self.x, self.y)
    
        def __eq__(self, other):
            return self.x == other.x and self.y == other.y
    
    
    if __name__ == "__main__":
        p1 = Point(5, 5)
        p2 = Point(20, 35)
        l1 = Line(p1, p2)
        print(l1)
        print(l1.length)
        l1.scale(2)
        print(l1)
        print(l1.length)
        p5 = Point(-2.5, -10)
        p6 = Point(27.5, 50)
        assert l1.points == (p5, p6)
    
    请注意,缩放方法会修改原始直线和点。如果要获取新行,方法应为:

    def scale(self, factor):
        x1, x2 = Line.scale_dimension(self.point_one.x, self.point_two.x, factor)
        y1, y2 = Line.scale_dimension(self.point_one.y, self.point_two.y, factor)
        return Line(Point(x1, y1), Point(x2, y2))
    

    对于比例系数
    s
    ,新点的坐标如下所示:

    Xa' = Xa (1+s)/2 + Xb (1-s)/2
    Ya' = Ya (1+s)/2 + Yb (1-s)/2
    
    
    Xb' = Xb (1+s)/2 + Xa (1-s)/2
    Yb' = Yb (1+s)/2 + Ya (1-s)/2
    

    Line类中的方法
    scale
    ?请告诉我们你们到目前为止都做了些什么,我想你们并没有达到我的要求。我想从点a(5,5)到点(20,35)的直线向外缩放2。这意味着我想把a点变成(-2.5,-10),把b点变成(27.5,50)。就长度而言,我想把33.54变成67.08,但我不想只扩展b,我还想扩展a。好吧,这正是我的答案…你能用数学术语或我的代码来解释吗?我想你们不会明白我的问题。我想从点a(5,5)到点(20,35)的直线向外缩放2。这意味着我想把a点变成(-2.5,-10),把b点变成(27.5,50)。就长度而言,我想把33.54变成67.08,但我不想只扩展b,我还想扩展a。@Crunch如果你试图计算你例子中的值,你会看到你得到了你想要的<代码>s=2,t0=-0.5,t1=+1.5。。。所以x0=5+(20-5)*(-0.5)=2.5
    t
    是从起始点算起的长度,单位为[line length],是否相反?因为当数字小于1时,a点(5,5)在被2缩放后是(-2.5,-10),在被缩放时变成(8.75,12.5)。5@Crunch我在之前的评论中缺少了负号(结果是粗略的-2.5:))反向缩放也应该起作用如果你按2缩放,那么长度是2倍,所以反向缩放应该是
    s=1/2=0.5
    …我刚刚在我的帖子中编辑了我解释为的内容。你能帮我纠正一下吗?我想你们不明白我的要求。我想从点a(5,5)到点(20,35)的直线向外缩放2。这意味着我想把a点变成(-2.5,-10),把b点变成(27.5,50)。就长度而言,我想把33.54变成67.08,但我不想只扩展b,我还想扩展a。你试过这个代码吗?断言通过了,点就是你想要的,长度合适。好的,谢谢你,但是当我在打印上尝试时(str(l1))#p5=Point(8.75,12.5)#p6=Point(16.25,27.5)#断言l1.getEndPoints()=(p5,p6)或l1.getEndPoints()=(p6,p5)
    def scale(self,factor):
     t0=0.5*(1.0-factor)
     t1=0.5*(1.0+factor)
     x1 = self.firstPoint.x +(self.secondPoint.x - self.firstPoint.x) * t0
     y1 = self.firstPoint.y +(self.secondPoint.y - self.firstPoint.y) * t0
     x2 = self.firstPoint.x +(self.secondPoint.x - self.firstPoint.x) * t1
     y2 = self.firstPoint.y +(self.secondPoint.y - self.firstPoint.y) * t1
     self.firstPoint = Point(x1, y1)
     self.secondPoint = Point(x2, y2)
    
    class Line:
        def __init__(self, point_one, point_two):
            self.point_one = point_one
            self.point_two = point_two
    
        def __str__(self):
            return 'Line(p1:{},p2:{})'.format(self.point_one, self.point_two)
    
        @property
        def points(self):
            return self.point_one, self.point_two
    
        @property
        def length(self):
            return ((self.point_one.x - self.point_two.x)**2 + (self.point_one.y - self.point_two.y)**2)**0.5
    
        def scale(self, factor):
            self.point_one.x, self.point_two.x = Line.scale_dimension(self.point_one.x, self.point_two.x, factor)
            self.point_one.y, self.point_two.y = Line.scale_dimension(self.point_one.y, self.point_two.y, factor)
    
        @staticmethod
        def scale_dimension(dim1, dim2, factor):
            base_length = dim2 - dim1
            ret1 = dim1 - (base_length * (factor-1) / 2)
            ret2 = dim2 + (base_length * (factor-1) / 2)
            return ret1, ret2
    
    
    class Point:
        def __init__(self, x=0, y=0):
            self.x = x
            self.y = y
    
        def __str__(self):
            return 'Point(x={},y={})'.format(self.x, self.y)
    
        def __eq__(self, other):
            return self.x == other.x and self.y == other.y
    
    
    if __name__ == "__main__":
        p1 = Point(5, 5)
        p2 = Point(20, 35)
        l1 = Line(p1, p2)
        print(l1)
        print(l1.length)
        l1.scale(2)
        print(l1)
        print(l1.length)
        p5 = Point(-2.5, -10)
        p6 = Point(27.5, 50)
        assert l1.points == (p5, p6)
    
    def scale(self, factor):
        x1, x2 = Line.scale_dimension(self.point_one.x, self.point_two.x, factor)
        y1, y2 = Line.scale_dimension(self.point_one.y, self.point_two.y, factor)
        return Line(Point(x1, y1), Point(x2, y2))
    
    Xa' = Xa (1+s)/2 + Xb (1-s)/2
    Ya' = Ya (1+s)/2 + Yb (1-s)/2
    
    
    Xb' = Xb (1+s)/2 + Xa (1-s)/2
    Yb' = Yb (1+s)/2 + Ya (1-s)/2