Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/103: Рейтинг темы: голосов - 103, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 09.03.2023
Сообщений: 4

turtle подсчет целочисленных точек внутри и на границе фигуры

09.03.2023, 22:51. Показов 31302. Ответов 8

Студворк — интернет-сервис помощи студентам
Дается фигура в декартовой системе координат и нужно посчитать количество целочисленных координат внутри фигуры и на границе. Написал вот такой код, но он считает только точки внутри фигуры. Как сделать чтобы считались точки не только внутри фигуры, но и на ее границах?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from turtle import *
 
color("red")
k = 20
speed(0)
hideturtle()
 
begin_fill()
for i in range(6):
    forward(10*k)
    right(60)
end_fill()
 
c = 0
canvas = getcanvas()
 
for x in range(-100*k, 100*k, k):
    for y in range(-100*k, 100*k, k):
        s = canvas.find_overlapping(x, y, x, y)
        if len(s) == 1 and s[0] == 5:
            c += 1
 
print(c)
done()
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2023, 22:51
Ответы с готовыми решениями:

Вывести количество точек, которые находятся внутри окружности либо на ее границе
Вводится x0,y0,r,n Координаты n точак x0,y0-центр окружности r-радиус n-количество точак Координаты n точак ВЫвести...

Для заданных точек определите, лежат ли они внутри полосы или на её границе
Имя входного файла: input.txt Имя выходного файла: output.txt Ограничения по времени: 0,2с Ограничения по памяти: 64 мегабайта В...

Для заданных точек определите, лежат ли они внутри круга или на его границе
Имя входного файла: input.txt Имя выходного файла: output.txt Ограничения по времени: 0,2с Ограничения по памяти: 64 мегабайта ...

8
4 / 2 / 2
Регистрация: 09.03.2023
Сообщений: 6
10.03.2023, 14:23
Слушай, не уверен, что понял точно задание, но сделал исходя из своего понимания
def count_points_in_figure(coords):
"""
Подсчитать количество целых координат внутри данной фигуры.

Аргументы:
Координаты: список пар координат, представляющих вершины фигуры.

возвращает:
Количество целочисленных координат внутри фигуры и на ее границе.
"""
min_x = min(x for x, y in coords)
max_x = max(x for x, y in coords)
min_y = min(y for x, y in coords)
max_y = max(y for x, y in coords)

count = 0
for x in range(min_x, max_x+1):
for y in range(min_y, max_y+1):
if is_inside_figure(x, y, coords):
count += 1
elif is_on_boundary(x, y, coords):
count += 1

return count

def is_inside_figure(x, y, coords):
"""
Проверить, находится ли заданная точка внутри фигуры.

Аргументы:
x: x - координата точки.
y: Y - координата точки.
Координаты список пар координат, представляющих вершины фигуры.

Возвращает:
True, если точка находится внутри фигуры, False в противном случае.
"""
num_vertices = len(coords)
j = num_vertices - 1
odd_nodes = False
for i in range(num_vertices):
if (coords[i][1] < y and coords[j][1] >= y) or (coords[j][1] < y and coords[i][1] >= y):
if coords[i][0] + (y - coords[i][1]) / (coords[j][1] - coords[i][1]) * (coords[j][0] - coords[i][0]) < x:
odd_nodes = not odd_nodes
j = i
return odd_nodes

def is_on_boundary(x, y, coords):
"""
Проверить, находится ли заданная точка на границе.

Аргументы:
x: x - координата точки.
y: Y - координата точки.
Координаты: список пар координат, представляющих вершины фигуры.

Возвраты:
True, если точка находится на определенной фигуре, False в противном случае.
"""
for i in range(len(coords)):
x1, y1 = coords[i]
x2, y2 = coords[(i + 1) % len(coords)]
if x == x1 and y == y1:
return True
elif x == x2 and y == y2:
return True
elif (y - y1) * (x2 - x1) == (y2 - y1) * (x - x1):
if min(x1, x2) <= x <= max(x1, x2) and min(y1, y2) <= y <= max(y1, y2):
return True
return False

# Пример использования
coords = [(0,0), (0,5), (5,5), (5,0)]
num_points = count_points_in_figure(coords)
print(f"Количество целых точек внутри или на границе фигуры: {num_points}")
1
0 / 0 / 0
Регистрация: 09.03.2023
Сообщений: 4
10.03.2023, 17:08  [ТС]
Спасибо за помощь, отступы можно сохранить если написать код между строками
Code
1
[PYTHON][/PYTHON]
0
4 / 2 / 2
Регистрация: 09.03.2023
Сообщений: 6
10.03.2023, 17:18
Блин, сейчас не за ноутом
Скоро приеду домой - постараюсь всё сделать)
0
0 / 0 / 0
Регистрация: 09.03.2023
Сообщений: 4
10.03.2023, 17:33  [ТС]
Я попробовал расставить отступы и вроде все работает, только в задаче даются координаты вершин с плавающей запятой и с этой прогой не получится решение. Вот так выглядит список координат если что:
(0.00,10.00)
(8.66,15.00)
(17.32,10.00)
(17.32,0.00)
(8.66,-5.00)
(0.00,0.00)
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
10.03.2023, 17:52
Лучший ответ Сообщение было отмечено ganspuzzles как решение

Решение

Цитата Сообщение от ganspuzzles Посмотреть сообщение
Как сделать чтобы считались точки не только внутри фигуры, но и на ее границах?
похоже, что граница и заливка это отдельные объекты с уникальными id, и ты условием len(s) == 1 and s[0] == 5 специально ищешь точки только на заливке. Как вообще узнать, что нужно id=5 искать? Собственно, просто проверяй, что список find_overlapping не пустой и все:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from turtle import *
 
color("red")
k = 20
speed(0)
hideturtle()
 
pd()
begin_fill()
for i in range(6):
    forward(10*k)
    right(60)
end_fill()
 
c = 0
canvas = getcanvas()
penup(); tracer(0)
for x in range(-20*k, 20*k, k):
    for y in range(-20*k, 20*k, k):
        if canvas.find_overlapping(x, y, x, y):
            c += 1
            goto(x,-y); dot(5, 'blue')
        else:
            goto(x,-y); dot(3, 'gray')
 
print(c)
done()
ПС можно получить полигон который черепашка нарисовала и по нему сузить границы поиска, что-то такое:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from math import ceil, floor
from turtle import *
 
color("red")
k = 20
speed(0)
hideturtle()
 
pd()
begin_poly()
begin_fill()
for i in range(6):
    forward(10*k)
    right(60)
end_fill()
end_poly()
 
xs, ys = zip(*get_poly())
x1 = floor(min(xs)) // k * k - 2*k
x2 = ceil(max(xs))  // k * k + 2*k
y1 = floor(min(ys)) // k * k - 2*k
y2 = ceil(max(ys))  // k * k + 2*k
 
c = 0
canvas = getcanvas()
penup(); tracer(0)
for x in range(x1, x2, k):
    for y in range(y1, y2, k):
        if canvas.find_overlapping(x, -y, x, -y):
            c += 1
            goto(x,y); dot(5, 'blue')
        else:
            goto(x,y); dot(3, 'gray')
 
print(c)
done()
1
4 / 2 / 2
Регистрация: 09.03.2023
Сообщений: 6
10.03.2023, 18:03
Ага, всё понял!
Подебажу её и пришлю вновь
0
0 / 0 / 0
Регистрация: 09.03.2023
Сообщений: 4
10.03.2023, 18:17  [ТС]
Спасибо. Тот, кто мне помогал эту программу делать сказал, что id 5 это id красного цвета, вот я и долго не мог понять как сделать эту программу под условие задачи
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
10.03.2023, 18:43
Цитата Сообщение от ganspuzzles Посмотреть сообщение
id 5 это id красного цвета
это id'шники объектов которые лежат в canvas, их добавляет черепашка, кроме тех которые мы явно рисуем она туда еще кучу всего кладет, и сколько их - не ясно. Если прямо рисовать через tkinter (без черепашки), то можно получить полный контроль над объектами. Могу предложить запоминать какие id лежат до и после рисования фигуры, и искать "новые" потом:
Python
1
2
3
4
5
6
7
8
9
10
my_ids = set(canvas.find_all())
begin_fill()
...
end_fill()
my_ids.symmetric_difference_update(canvas.find_all())
 
 
ids = canvas.find_overlapping(x, y, x, y)
if my_ids.issubset(ids):
    ...
либо, действительно, получать RGB значения цветов . В любом случае, имхо, на егэ лучше пальцем еще раз пересчитать точки, т.к. в таком подходе много что может пойти не так
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.03.2023, 18:43
Помогаю со студенческими работами здесь

Для заданных точек определите, лежат ли они внутри квадрата или на его границе
Имя входного файла: input.txt Имя выходного файла: output.txt Ограничения по времени: 0,2с Ограничения по памяти: 64 мегабайта ...

Вычисление 2 точек на границе прямоугольника, зная точку внутри прямоугольника и Тангенс угла наклона
Помогите понять общий алгоритм....( Вычисление 2 точек на границе прямоугольника, зная точку внутри прямоугольника и Тангенс угла...

Нахождение точек внутри фигуры
Не хотелось бы изобретать велосипед, может есть более внятные способы нежели многократный проход циклами по точкам... Есть два набора...

Найти минимальный по площади выпуклый многоугольник, что все N точек лежат либо внутри, либо на его границе
N точек на плоскости заданы своими координатами. Найти такой минимальный по площади выпуклый многоугольник, что все N точек лежат либо...

Найти количество точек лежащих внутри 2D фигуры
Условие задачи: 5.18 Запрещено размещать задания и решения в виде картинок и других файлов с их текстом. Подскажите, куда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru