Python-PIL绘制一段圆形阳光

Python-PIL绘制一段圆形阳光,python,math,python-imaging-library,trigonometry,Python,Math,Python Imaging Library,Trigonometry,我遇到了一个问题,我想在图像中的某个位置画一个圆/物体,然后我想画从该图像发出的光线,每一条光线间隔1度。光线只能投射在145度的部分上,所以它不会形成一个完整的圆。我正在使用Python PIL(我是新手)来完成这项任务——尽管我对语言要求不严格 def drawSunshine(im): draw = ImageDraw.Draw(im) x, y = im.size draw.ellipse((370,200, 400,230), fill='red',outlin

我遇到了一个问题,我想在图像中的某个位置画一个圆/物体,然后我想画从该图像发出的光线,每一条光线间隔1度。光线只能投射在145度的部分上,所以它不会形成一个完整的圆。我正在使用Python PIL(我是新手)来完成这项任务——尽管我对语言要求不严格

def drawSunshine(im):
    draw = ImageDraw.Draw(im)
    x, y = im.size
    draw.ellipse((370,200, 400,230), fill='red',outline='black')
    draw.line((370,205,390,218), fill='black',width=3)
    draw.point((100,100),'red')
    im.show()
我在想,我可以从迭代圆周围的每个像素开始。然后我可以改变像素的颜色

编辑这种方法对我来说很有意义,因为我计划在黑白PNG文件上绘制此图像。如果当前的像素是白色的,我会画出另一个像素的线,如果当前的像素是黑色的:我会认为这是一个障碍,并终止在那一点的线。 然而,主要问题是:

  • 如何在图像中的任意位置迭代对象,使对象周围的区域为圆或圆段
  • 还有,我如何确保每像素绘制的每个“光线”之间的间隔为1度
  • 编辑有没有办法让这些“光线”被黑色像素打断

    • 这里有一个可以调整的小功能

      import Image, ImageDraw
      from math import sin, cos, pi
      
      
      width, height = 400, 400
      
      skyBlue = (135, 206, 235)
      
      im = Image.new("RGBA", (width, height), skyBlue)
      
      
      #Draw Sun
      draw = ImageDraw.Draw(im)
      
      def drawSun(draw, centre, radius, rays=False, startAngle=0, finishAngle=360, rayAngle=10, rayGap=10, rayLength=1000, rayColour="Yellow", rayOutline="Orange"):
        x1,x2 = centre[0] - radius, centre[0] + radius
        y1,y2 = centre[1] - radius, centre[1] + radius
      
      
        if rays:
          for rayStart in range(startAngle, finishAngle, rayAngle+rayGap):
      
            rayEnd = (rayStart+rayAngle) * pi/180
            rayStart *= pi/180
      
            corner1 = centre[0] + rayLength*cos(rayStart), centre[1] + rayLength*sin(rayStart)
            corner2 = centre[0] + rayLength*cos(rayEnd), centre[1] + rayLength*sin(rayEnd)
      
            print [centre, corner1, corner2]
      
            draw.polygon([centre, corner1, corner2], fill="Yellow", outline="Orange")
      
      
        draw.ellipse((x1, y1, x2, y2), fill="Yellow", outline="Orange")
      
      
      
      
      drawSun(draw, (100, 100), 40, rays=True, startAngle=0, finishAngle=145, rayAngle=3, rayGap=5)
      
      im.save("example.png")
      

      这里有一个小功能,你可以调整

      import Image, ImageDraw
      from math import sin, cos, pi
      
      
      width, height = 400, 400
      
      skyBlue = (135, 206, 235)
      
      im = Image.new("RGBA", (width, height), skyBlue)
      
      
      #Draw Sun
      draw = ImageDraw.Draw(im)
      
      def drawSun(draw, centre, radius, rays=False, startAngle=0, finishAngle=360, rayAngle=10, rayGap=10, rayLength=1000, rayColour="Yellow", rayOutline="Orange"):
        x1,x2 = centre[0] - radius, centre[0] + radius
        y1,y2 = centre[1] - radius, centre[1] + radius
      
      
        if rays:
          for rayStart in range(startAngle, finishAngle, rayAngle+rayGap):
      
            rayEnd = (rayStart+rayAngle) * pi/180
            rayStart *= pi/180
      
            corner1 = centre[0] + rayLength*cos(rayStart), centre[1] + rayLength*sin(rayStart)
            corner2 = centre[0] + rayLength*cos(rayEnd), centre[1] + rayLength*sin(rayEnd)
      
            print [centre, corner1, corner2]
      
            draw.polygon([centre, corner1, corner2], fill="Yellow", outline="Orange")
      
      
        draw.ellipse((x1, y1, x2, y2), fill="Yellow", outline="Orange")
      
      
      
      
      drawSun(draw, (100, 100), 40, rays=True, startAngle=0, finishAngle=145, rayAngle=3, rayGap=5)
      
      im.save("example.png")
      

      把它们画成三角形,圆心,然后在图像边缘画两个点。把它们画成三角形,圆心,然后在图像边缘画两个点。这是一个很好的答案。谢谢但是我想知道你是否能帮我解决剩下的疑问(关于障碍物的疑问)。比如光线被障碍物阻挡了,阴影投射了吗?这是一个很好的答案。谢谢但是我想知道你是否能帮我解决我还有的疑问(关于障碍物的疑问)。比如说,光线被障碍物阻挡了,阴影投射了吗?