Форум сайта python.su
Нужна помощь со следующей задачкой. 1) В квадрат 100*100 вписать n окружностей со случайным радиусом и координатами, так чтобы окружности не пересекались и не вылезали за пределы поля. 2) В каждую окружность вписать стрелку, повернутую на случайный угол от 0 до 360 гр.
1-ую часть написал, но в функции proverka, Pyscripter ругается на строчку:
if sqrt((x[i] - x[i+1])**2 + (y[i] - y[i+1])**2) > r[i] + r[i+1]:
import matplotlib.pyplot as plt import random from math import sqrt k = 100 # число прогонов n = 10 # нужное чилсо окружностей x = [0]*k y = [0]*k r = [0]*k def proverka(): for i in range(k+1): if sqrt((x[i] - x[i+1])**2 + (y[i] - y[i+1])**2) > r[i] + r[i+1]: True else: False def main(): ii = 0 for i in range(k): x[i] = random.uniform(0,100) y[i] = random.uniform(0,100) r[i] = random.uniform(1,15) if x[i]+r[i]-100 <= 0 and y[i]+r[i]-100 <= 0 and r[i]-x[i] <= 0 and r[i]-y[i] <= 0: if proverka(): circle=plt.Circle((x[i],y[i]),r[i],color='black',fill=False) fig = plt.gcf() fig.gca().add_artist(circle) ii = ii + 1 if ii == n: break plt.axis([0,100,0,100]) plt.show() if __name__ == '__main__': main()
Офлайн
import matplotlib.pyplot as plt import random from math import sqrt, sin, cos n = 10 def proverka(c, x, y, r): for i in c: if sqrt((i[0] - x)**2 + (i[1] - y)**2) <= i[2] + r: return False return True def main(): c = [] while len(c) < n: x, y = random.uniform(3,93), random.uniform(3,93) r = min(x, y, 100-x, 100-y) r = random.uniform(3, 15 if r > 15 else r) if proverka(c, x, y, r): c += [[x, y, r]] plt.gcf().gca().add_artist(plt.Circle((x,y),r,color='black',fill=False)) a = random.uniform(1,360) plt.arrow(x, y, r*sin(a), r*cos(a), width = 0.06, edgecolor = 'black', facecolor = 'black', length_includes_head = True) plt.axis([0,100,0,100]) plt.show() if __name__ == '__main__': main()
Офлайн