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

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

09.03.2023, 22:51. Показов 29056. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru