Задача 06
В этой задаче предлагается найти количество точек внутри фигуры без граничных точек. Может быть также определение максимальной ординаты или абсциссы точки внутри фигуры.
Наилучший вариант подсчета точек :
- Построение самой фигуры
- Подсчет числа нужных точек вручную
Если использовать вариант построения фигуры и подсчета точек программой, то результат можно получить не всегда верный. Необходимо запрещать вывод точек на холсте.
Вывод точек нужен для подсчета вручную и проверки.
Программный подсчет числа точек основан на поиске числа пересечений малого прямоугольника (фактически точки) с закрашенной фигурой.
Всегда нужно контролировать правильность работы программы ручным пересчетом результата.
В большинстве случаев для получения результата достаточно и КУМИРа в варианте изменяемого масштаба сетки. Масштаб должен быть установлен в настройках как 1.
Основные алгоритмы проверок:
for x in range(-20,20):
for y in range(-20,20):
setpos(x*k,y*k)
dot(5)
#print(canvas.find_overlapping(x*k,y*k,x*k,y*k))
if canvas.find_overlapping(x*k,y*k,x*k,y*k)==(5,):
cnt+=1 или
for y in range(-100*m,100*m,m):
for x in range(-100*m,100*m,m):
item=canvas.find_overlapping(x,y,x,y)
if len(item)==1 and item[0]==5:
cnt+=1
Виды заданий:
- Определите, сколько точек с целыми положительными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом. Точки на линии не учитывать.
- Определите, сколько точек с целочисленными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом. Точки на линии не учитывать. Возможно нюансы алгоритма.
- Последние 6 заданий из 16 на Чертежника. Используем вновь Черепашку в Питоне. 2 задания из 6 не рисуют замкнутой фигуры.
- Ниже примерный код программы подсчета числа точек фигуры
'''
Определите, сколько точек с целыми положительными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом. Точки на линии не учитывать.
'''
from turtle import *
left(90)
color("blue","red")
tracer(0)
k=20
pendown()
begin_fill()
for i in range(6):
forward(2*k)
right(120)
for j in range(2):
right(330)
forward(4*k)
end_fill()
cnt=0
penup()
canvas=getcanvas()
for x in range(-20,20):
for y in range(-20,20):
#setpos(x*k,y*k)
#dot(5)
#print(canvas.find_overlapping(x*k,y*k,x*k,y*k))
if canvas.find_overlapping(x*k,y*k,x*k,y*k)==(5,):
cnt+=1
print(cnt)
done()
Ссылка на решенные задачи 06 из книги Евич и другие, содержащая 16 вариантов.