2015-03-03 32 views
0

我一直被困在這個惱人的問題上。我試圖編寫代碼,以便我可以縮放線段,這意味着如果我按比例縮放的數量(例如)爲2,並且當前線的長度爲33,則會將整個長度增加到67.意義我加了一半到開始,一半加到最後... 新的前面--- a -------- 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 
+2

你的方法'scale'在給定的線課程不包括在內?請告訴我們你到目前爲止做了什麼 – Johan 2015-03-03 06:47:02

+0

我不認爲你們得到了我所要求的。我想用點a(5,5)指向(20,35)並將其向外縮放2.這意味着我想將點a轉變爲(-2.5,-10),點b (27.5,50)。在長度方面,我想分別把33.54變成67.08,但我不想只是延長b,我也想延長一下。 – Crunch 2015-03-03 07:16:24

+1

嗯,就是這樣,我的答案是...... – 2015-03-03 07:22:30

回答

1

不知道,如果我得到正確的,但使用線性內插...(參數方程線N)

  • 你有線由端點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與照顧,讓處理...
+0

我不認爲你們得到了我所要求的。我想用點a(5,5)指向(20,35)並將其向外縮放2.這意味着我想將點a轉變爲(-2.5,-10),點b (27.5,50)。在長度方面,我想分別把33.54變成67.08,但我不想只是延長b,我也想延長一下。 – Crunch 2015-03-03 07:17:45

+0

@Crunch如果你嘗試計算你的例子的值,那麼你會看到你得到你想要的。 's = 2,t0 = -0.5,t1 = + 1.5 ...所以x0 = 5 +(20-5)*( - 0.5)= 2.5' ....'t'是從[線路長度] – Spektre 2015-03-03 08:00:53

+0

這是否會反向工作?因爲當數字小於1點a(5,5)後,縮放2後變爲(-2.5,-10)變爲(8.75,12.5),當縮放爲.5時 – Crunch 2015-03-03 08:08:22

1

有了共同梅特賴克,你只需要seperately調整每個維度。

我重寫了代碼的某些部分,以適應它更好地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) 

請注意,縮放方法會修改原始線條和點。如果你想獲得一個新的生產線,該方法應該是:

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

我不認爲你們會得到我所要求的。我想用點a(5,5)指向(20,35)並將其向外縮放2.這意味着我想將點a轉變爲(-2.5,-10),點b (27.5,50)。在長度方面,我想分別把33.54變成67.08,但我不想只是延長b,我也想延長一下。 – Crunch 2015-03-03 07:18:34

+0

你試過這段代碼嗎?斷言通過,點是那些,你想要的和長度適合。 – 2015-03-03 07:25:06

+0

好的,謝謝你的工作,但是當我在print(str(l1))上嘗試它時#p5 = Point(8.75,12.5) #p6 = Point(16.25,27.5) #assert l1.getEndPoints()== ,p6)或l1.getEndPoints()==(p6,p5) – Crunch 2015-03-03 07:51:07

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