I have a line with lenght of l and p1 and p2 and i want to rotate it by angle. I was using this matrix but it doesn’t work.
I have this code in python:
def rotate (point, point2, angel): x1 = (cos(radians(angel)) * point1.x) +( sin(radians(angel)) * point1.y) y1 = (-1 * sin(radians(angel)) * point1.x )+ (cos(radians(angel)) * point1.y) x2 = (cos(radians(angel)) * point2.x) + (sin(radians(angel)) * point2.y) y2 = (-1 * sin(radians(angel)) * point2.x) + (cos(radians(angel)) * point2.y) return [[x1, y1], [x2, y2]]
Advertisement
Answer
You first need to specify an origin point, the rotation will be created around that point. You can adapt your code and use something like this:
def rotate(origin, point, angle): """ Rotate a point counterclockwise by a given angle around a given origin. The angle should be given in radians. """ ox, oy = origin.x, origin.y px, py = point.x, point.y qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy) qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy) return Point(qx, qy)
You can then plot some point and see the results with:
x1 = Point(0, 0) x2 = Point(5, 5) mid_point = Point((x1.x + x2.x) / 2, (x1.y + x2.y) / 2) plt.plot([x1.x, x2.x], [x1.y, x2.y], c='red') x1 = rotate(mid_point, x1, math.radians(30)) x2 = rotate(mid_point, x2, math.radians(30)) plt.plot([x1.x, x2.x], [x1.y, x2.y], c='blue') plt.show()
Where you can clearly see the rotation around the middle point between the two lines.