如何在两个方向上扩展线段

时间:2015-03-03 06:30:36

标签: python math line

我一直坚持这个恼人的问题。我正在尝试编写代码,以便我可以缩放一个线段,这意味着如果我要缩放的数量(例如)是2并且该行的当前长度是33,则会将整个长度增加到67。我加一半到开头,一半加到最后...... 新的前面---一个-------- b ---新的回来......但是我在将它翻译成代码时遇到了麻烦。以下是代码的示例..端点方法应该返回元组中的端点,例如(p1,p2)

from point import Point
import math

class Line:
def __init__(self,aPoint=Point(), bPoint=Point()):
    self.firstPoint = aPoint
    self.secondPoint = bPoint

def getEndPoints(self):
    return (self.firstPoint, self.secondPoint)

def scale(self,factor):
    if factor < 1:
       x1 = self.firstPoint.x +(self.secondPoint.x - self.firstPoint.x) * (factor)
       x2 = self.secondPoint.x +(self.firstPoint.x  - self.secondPoint.x) * (factor)
       print(str(x1))
       y1 = self.firstPoint.y +(self.secondPoint.y - self.firstPoint.y) * (factor)
       y2 = self.secondPoint.y +(self.firstPoint.y  - self.secondPoint.y) * (factor)
    else:
       x1 = -(self.firstPoint.x +(self.secondPoint.x - self.firstPoint.x) * (factor))
       x2 = -(self.secondPoint.x +(self.firstPoint.x  - self.secondPoint.x) * (factor))
       y1 = self.firstPoint.y +(self.secondPoint.y - self.firstPoint.y) * (factor)
       y2  = self.secondPoint.y +(self.firstPoint.y  - self.secondPoint.y) * (factor)
    self.firstPoint = Point(x1, y1)
    self.secondPoint = Point(x2, y2)

if __name__ == "__main__":
    p1 = Point(5,5)
    p2 = Point(20,35)
    l1 = Line(p1,p2)
    l1.scale(2)
    p5 = Point(-2.5,-10)
    p6 = Point(27.5,50)
    assert l1.getEndPoints() == (p5,p6)

这些测试工作不正常,但上面是......我得到了(5.0,5.0)和b(20.0,35.0)


    l1.scale(0.5)

    p5 = Point(8.75,12.5)
    p6 = Point(16.25,27.5)

class Point:
'''Point class represents and manipulates
x,y coordinates.'''

def __init__(self,x=0,y=0):
    '''Create a new point with default
    x,y coordinates at 0,0.'''
    self.x = x
    self.y = y

def distanceTo(self,aPoint):
    return ((self.x-aPoint.x) ** 2 + (self.y-aPoint.y) ** 2)** .5 

3 个答案:

答案 0 :(得分:1)

不确定我是否正确使用线性插值...(参数线方程)

  • 您以端点p0,p1以向量的形式定义了行
  • 所以它上的任何一点都定义为:
  • p(t)=p0+(p1-p0)*t
  • 其中p(t)是点(向量)
  • t是范围t=<0.0,1.0>
  • 中的标量参数
  • 如果您不知道矢量数学,则将其重写为标量
  • x(t)=x0+(x1-x0)*t
  • y(t)=y0+(y1-y0)*t
  • 所以如果t=0那么你得到点p0
  • 如果t=1,则得到点p1

现在只需重新调整t范围

  • 所以你有比例s
  • t0=0.5-(0.5*s) ...从一半按比例移动到p0
  • t1=0.5+(0.5*s) ...从一半按比例移动到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中编码,所以小心处理......

答案 1 :(得分:1)

使用常见的metrik,您只需要单独调整每个维度。

我重写了代码的某些部分,以便更好地适应the usual Python style

你可能想要解决这些问题,你不熟悉将来会节省很多时间。

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)

注意,scale方法会修改原始线和点。如果您想获得一个新行,该方法应为:

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))

答案 2 :(得分:1)

对于比例因子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