Python 沿着三角形的每条边反射图像
Python reflect image along each sides of the triangle
我在屏幕中央创建了一个三角形。
from PIL import Image, ImageDraw
GRAY = (190, 190, 190)
im = Image.new('RGBA', (400, 400), WHITE)
points = (250, 250), (100, 250), (250, 100)
draw = ImageDraw.Draw(im)
draw.polygon(points, GRAY)
如何复制此图像并在不同的随机点沿三角形的每一边反射它。例如...
方案:先在大三角形的边上随机找一个点,放一个小的,然后旋转它,使其正好贴合在边上。
假设我们可以像这样访问三角形的点
triangle.edges[0].x,
triangle.edges[0].y,
triangle.edges[1].x,
etc
然后我们可以通过首先选择一条边来找到任意点,并且"walk a random distance to the next edge":
r = randInt(3) # random integer between 0 and 2
first_edge = triangle.edges[r]
second_edge = r == 2 ? triangle.edges[0] : triangle.edges[r + 1]
## The next lines is kind of pseudo-code
r = randFloat(1)
random_point = (second_edge - first_edge)*r + first_edge
我们的下一个问题是如何旋转一个三角形。如果你学过一些代数,你可能会认出这个:
def rotatePointAroundOrigin(point, angle):
new_point = Point()
new_point.x = cos(angle)*point.x - sin(angle)*point.y
new_point.y = sin(angle).point.x + cos(angle)*point.y
return new_point
(参见 https://en.wikipedia.org/wiki/Rotation_matrix)
除此之外,您还需要确定将三角形旋转多少,然后将上述函数应用于所有点。
我在屏幕中央创建了一个三角形。
from PIL import Image, ImageDraw
GRAY = (190, 190, 190)
im = Image.new('RGBA', (400, 400), WHITE)
points = (250, 250), (100, 250), (250, 100)
draw = ImageDraw.Draw(im)
draw.polygon(points, GRAY)
如何复制此图像并在不同的随机点沿三角形的每一边反射它。例如...
方案:先在大三角形的边上随机找一个点,放一个小的,然后旋转它,使其正好贴合在边上。
假设我们可以像这样访问三角形的点
triangle.edges[0].x,
triangle.edges[0].y,
triangle.edges[1].x,
etc
然后我们可以通过首先选择一条边来找到任意点,并且"walk a random distance to the next edge":
r = randInt(3) # random integer between 0 and 2
first_edge = triangle.edges[r]
second_edge = r == 2 ? triangle.edges[0] : triangle.edges[r + 1]
## The next lines is kind of pseudo-code
r = randFloat(1)
random_point = (second_edge - first_edge)*r + first_edge
我们的下一个问题是如何旋转一个三角形。如果你学过一些代数,你可能会认出这个:
def rotatePointAroundOrigin(point, angle):
new_point = Point()
new_point.x = cos(angle)*point.x - sin(angle)*point.y
new_point.y = sin(angle).point.x + cos(angle)*point.y
return new_point
(参见 https://en.wikipedia.org/wiki/Rotation_matrix)
除此之外,您还需要确定将三角形旋转多少,然后将上述函数应用于所有点。