2014-11-05 36 views
-1

我有一個問題,我想要在圖像中的某個位置繪製一個圓/對象,然後我想繪製從該圖像發出的光線 - 每條光線相隔1度。儘管如此,這些射線只能投射在145度的線段上 - 所以它不會形成一個完整的圓形。我正在使用Python PIL(我是新手)來完成這項任務 - 儘管我對語言要求並不嚴格。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度?
  • 編輯有沒有辦法讓這些「光線」被黑色像素打斷?
+0

繪製它們作爲代替三角形,圓的中心,然後兩點關閉圖像的邊緣。 – will 2014-11-05 00:20:11

回答

2

這裏有一個小函數可以調整;

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") 

enter image description here

+0

這是一個很好的答案。謝謝。但我想知道你能否幫我解決我的疑問(關於障礙的問題)。 – arkate 2014-11-05 01:11:41

+0

由於有射線被障礙物阻擋並且投射了陰影嗎? – will 2014-11-05 12:25:47