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