1

我有两点

(x1, y1) (x2, y2)

我只在 x+, y+ 平面上工作

并说这条线是垂直的

(320, 320) (320, 160)

我如何将它旋转 90 度以获得

(320, 320) (480, 320)  [90 deg rotated by bottom point (320, 320)]
(320, 160) (480, 160)  [90 deg rotated by top point (320, 160)]

请记住,我需要相同的形式——即,

(x1, y1) (x2, y2)

顺便说一句,这些线只能是垂直的或水平的,所以斜率要么是未定义的,要么是零。

4

2 回答 2

3

旋转B90 度A

diff = B-A
B_new = A + array([-diff[1],diff[0]])

更笼统地说,您可以这样做:

def rot_origin(p, ang):
    return array([p[0]*cos(ang)-p[1]*sin(ang),p[0]*sin(ang)+p[1]*cos(ang)])

def rot_around(p, p0, ang):
    return p0 + rot_origin(p-p0, ang)

那么,您的情况将是B_new = rot_around(A, B, pi/2),因为90度数是pi/2弧度。

编辑:只是为了让您的示例完全明确。围绕点 1 旋转 90 度,您将得到:

(x1,y1) (x1-(y2-y1),y1+(x2-x1))

要围绕第 2 点旋转,您将得到:

(x2-(y1-y2),y2+(x1-x2)) (x2,y2)
于 2013-02-26T10:28:58.117 回答
-1

以获取您作为示例的内容:

  1. 获取顶部和底部点之间的距离。在您的示例中,d = sqrt((x2 - x1)^2 + (y2-y1)^2)。
  2. 对于底部点旋转 90 度,只需使用 (x2,y2) 和 (x2+d, y2) 作为端点。
  3. 对于顶点旋转 90 度,只需使用 (x1,y1) 和 (x1+d, y1) 作为端点。

这可以很容易地推广到任何一条线,不仅是一条垂直线,还有任何旋转角度。

于 2013-02-26T10:39:51.073 回答