У меня есть набор точек на сетке, для которого я хочу создать разумный контур многоугольника. Точки будут выбираться пользователем, поэтому я не могу ожидать, что они будут точно соответствовать алгоритму Брезенхэма для линий со странным наклоном. Тем не менее, я все еще изо всех сил пытаюсь заставить что-то работать для очевидной «красивой» наклонной стороны:
#
###
#####
#######
#####
###
#
Я хочу превратить эти точки в многоугольник SVG (или путь, или ломаную линию и т. д.). Как и следовало ожидать, это должен быть красивый аккуратный треугольник.
Вот код, который я пробовал:
import cmath
s = """
#
###
#####
#######
#####
###
#
"""
pts = [complex(c, r)
for (r, rt) in enumerate(s.splitlines())
for (c, ch) in enumerate(rt)
if ch == "#"]
def centroid(pts: list[complex]) -> complex:
return sum(pts) / len(pts)
def sort_counterclockwise(pts: list[complex],
center: complex | None = None) -> list[complex]:
if center is None:
center = centroid(pts)
return sorted(pts, key=lambda p: cmath.phase(p - center))
def perimeter(pts: list[complex]) -> list[complex]:
out = []
for pt in pts:
for d in (-1, 1, -1j, 1j, -1+1j, 1+1j, -1-1j, 1-1j):
xp = pt + d
if xp not in pts:
out.append(pt)
break
return sort_counterclockwise(out, centroid(pts))
def example(all_points: list[complex], scale: float = 20) -> str:
p = perimeter(all_points)
p.append(p[0])
vbx = max(map(lambda x: x.real, p)) + 1
vby = max(map(lambda x: x.imag, p)) + 1
return f"""
"""
print(example(pts))
Это приводит к ужасному беспорядку:
Любые советы о том, как заставить алгоритм лучше реагировать на создание четко определенных наклонов и создать для этого только треугольник?
РЕДАКТИРОВАТЬ: Вот еще один тестовый треугольник, в основном с вертикальными линиями:
#
#
#
##
##
##
###
##
##
##
#
#
#
А вот изображение с обоими одновременно (очевидно, не треугольник):
#
#
#
##
##
##
###
######
#########
######
###
##
##
##
#
#
#
Подробнее здесь: https://stackoverflow.com/questions/791 ... nham-lines
Алгоритм отмены линий Брезенхема ⇐ Python
Программы на Python
1730917040
Anonymous
У меня есть набор точек на сетке, для которого я хочу создать разумный контур многоугольника. Точки будут выбираться пользователем, поэтому я не могу ожидать, что они будут точно соответствовать алгоритму Брезенхэма для линий со странным наклоном. Тем не менее, я все еще изо всех сил пытаюсь заставить что-то работать для очевидной «красивой» наклонной стороны:
#
###
#####
#######
#####
###
#
Я хочу превратить эти точки в многоугольник SVG (или путь, или ломаную линию и т. д.). Как и следовало ожидать, это должен быть красивый аккуратный треугольник.
Вот код, который я пробовал:
import cmath
s = """
#
###
#####
#######
#####
###
#
"""
pts = [complex(c, r)
for (r, rt) in enumerate(s.splitlines())
for (c, ch) in enumerate(rt)
if ch == "#"]
def centroid(pts: list[complex]) -> complex:
return sum(pts) / len(pts)
def sort_counterclockwise(pts: list[complex],
center: complex | None = None) -> list[complex]:
if center is None:
center = centroid(pts)
return sorted(pts, key=lambda p: cmath.phase(p - center))
def perimeter(pts: list[complex]) -> list[complex]:
out = []
for pt in pts:
for d in (-1, 1, -1j, 1j, -1+1j, 1+1j, -1-1j, 1-1j):
xp = pt + d
if xp not in pts:
out.append(pt)
break
return sort_counterclockwise(out, centroid(pts))
def example(all_points: list[complex], scale: float = 20) -> str:
p = perimeter(all_points)
p.append(p[0])
vbx = max(map(lambda x: x.real, p)) + 1
vby = max(map(lambda x: x.imag, p)) + 1
return f"""
"""
print(example(pts))
Это приводит к ужасному беспорядку:
Любые советы о том, как заставить алгоритм лучше реагировать на создание четко определенных наклонов и создать для этого только треугольник?
РЕДАКТИРОВАТЬ: Вот еще один тестовый треугольник, в основном с вертикальными линиями:
#
#
#
##
##
##
###
##
##
##
#
#
#
А вот изображение с обоими одновременно (очевидно, не треугольник):
#
#
#
##
##
##
###
######
#########
######
###
##
##
##
#
#
#
Подробнее здесь: [url]https://stackoverflow.com/questions/79163581/algorithm-for-undoing-bresenham-lines[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия