|
Разделить треугольник на два контура по линии разреза | ☑ | ||
---|---|---|---|---|
0
DTX 4th
18.11.18
✎
21:33
|
Дано:
Vector2 p1, p2, p3; - три точки треугольника Vector2[] slice; - точки разреза (начало и конец принадлежат сторонам треугольника) Получить: Два контура, которые образуются в результате деления треугольника с помощью линии разреза. Пример: https://i.imgur.com/aBZ8dIj.png Тут 5 точек разреза. Голубым обозначил два выходных массива точек. Возможен и такой вариант: https://i.imgur.com/xf4t8Vz.png |
|||
1
RomanYS
18.11.18
✎
21:56
|
А в чём вопрос?
Берешь линию разреза как начало для обоих контуров, а дальше по часовой /против часовой. Для треугольника всего два варианта и ты их оба нарисовал. |
|||
2
DTX 4th
18.11.18
✎
22:01
|
(1) Как это закодить? Понятное дело, что нарисовать легко.
|
|||
3
RomanYS
18.11.18
✎
22:05
|
(2) определить на каких сторонах концы разреза, добавить вершины исходного треугольника к разрезам(или 1+2(первый рисунок) или 0+3(второй))
|
|||
4
DTX 4th
18.11.18
✎
22:13
|
(3) Хм, может сработать. Отпишусь, если получится провернуть
|
|||
5
jscript82
18.11.18
✎
22:47
|
(0) Что за чемпионат? Дай ссылку, тоже поучаствую.
|
|||
6
RomanYS
18.11.18
✎
22:54
|
(5) похоже на школьные задачи))
|
|||
7
DTX 4th
19.11.18
✎
14:56
|
(3) Для одной линии разреза всё ок. Но тут внезапно оказалось, что их может быть несколько) Пересекаться не могут.
(5) Задача возникла в процессе разработки) |
|||
8
RomanYS
19.11.18
✎
14:58
|
"Задача возникла в процессе разработки)"
Класс! А какая исходная прикладная задача? |
|||
9
RomanYS
19.11.18
✎
15:01
|
(7) "их может быть несколько" ну это уже гораздо интереснее.
Нужно обходить вершины треугольника и концы разрезов. |
|||
10
Garykom
гуру
19.11.18
✎
15:03
|
Точки внутри "Vector2[] slice" упорядочены?
Соседние точки образуют именно начало-конец отрезка реза? Если да то не вижу проблемы |
|||
11
Garykom
гуру
19.11.18
✎
15:04
|
(10)+ Намек - алгоритм заливки замкнутого контура
|
|||
12
Мимохожий Однако
19.11.18
✎
15:07
|
(8) Стёкла режут или мебель изготавливают, например.
|
|||
13
Малыш Джон
19.11.18
✎
15:25
|
(0)
1)делай соответсвующую структуру хранения данных, связанный список получится два списка: список точек треугольник и список точек линии разреза 2) тупо перебором определяй какой отрезок(пара соседних элементов из списка) треугольника пересекается с отрезком линии разреза. получается n точек пересечения, которые лежат и на треугольнике и на линии. 3) делишь список точек треугольника на несколько списков(в простейшем случае два), делишь список точек линии разреза(в простейшем случае вообще не делится) 4) объединяешь части списка точек треугольника с частями списка точек линии разреза |
|||
14
DTX 4th
19.11.18
✎
15:45
|
(11) Это?
http://expace.narod.ru/imageprocessing/algoritm.html Что-то вообще не то (12) Для игры) (13) Это с учетом (7)? 4й пункт пока не уложился в голове |
|||
15
Garykom
гуру
19.11.18
✎
16:22
|
(14) >Что-то вообще не то
Все то, заливаешь каждый из контуров своим цветом (отличным от цвета снаружи), а затем берешь и двигаешься от любой из точек по границе разных цветов - обойдешь все нужные граничные точки (включая исходные) контура (которому принадлежит начальная что взял). Найденные точки исключаешь и повторяешь обход контура, взяв за начальную точку любую оставшуюся. |
|||
16
Garykom
гуру
19.11.18
✎
16:24
|
(15)+ Когда двигаешься всегда сворачивать туда где основной цвет нужного контура, с другой стороны может быть смена цвета второго контура и наружного.
|
|||
17
Малыш Джон
19.11.18
✎
16:26
|
(14) https://ibb.co/nNLgUf
треугольник: A1,А2,А3 линия: В1,В2,В3,В4,В5,В6 точки пересечения: А1А2 х В1В2 = С1 А2А3 х В3В4 = С2 А2А3 х В4В5 = С3 А3А1 х В5В6 = С4 Итого: треугольник(список разбит в точках С): (А1,С1)+(С1,А2,С2)+(С2,С3)+(С3,А3,С4)+(С4,А1) линия: (В1,С1)+(С1,В2,В3,С2)+(С2,В4,С3)+(С3,В5,С4)+(С4,В6) (В1,С1) и (С4,В6) - концы снаружи треугольника, они по условиям не нужны. Остальное сращиваем, т.е по треугольнику идем до первой точки С, далее от неё - идем по линии разреза до след. точки С, далее по треугольнику и т.д., пока не замкнется цикл: (А1,С1)+(С1,В2,В3,С2)+(С2,С3)+(С3,В5,С4)+(С4,А1) = (А1,С1,В2,В3,С2,С3,В5,А1) второй кусок - соседний с первым, для него цепочки точек В идут в обратном порядке: (С1,А2,С2)+(С2,В3,В2,С1) = (С1,А2,С2,В3,В2,С1) третий кусок - не нужен, т.к внешний - (С2,В4,С3,С2) четвертый, опять соседний с первый, опять цепочка В в обратном порядке: (С3,А4,С4)+(С4,В5,С3) = (С3,А4,С4,В5,С3) |
|||
18
Garykom
гуру
19.11.18
✎
16:26
|
Я правильно понял что тебе нужно получить замкнутую последовательность точек каждого контура?
|
|||
19
RomanYS
19.11.18
✎
16:31
|
(15) Что-то не понял идею. Предлагается эти векторы где-то "визуализировать" в пикселях и потом что-то заливать?
|
|||
20
Garykom
гуру
19.11.18
✎
16:32
|
(0) Кстати у тебя два варианта:
1. точки начала и конца разреза принадлежат одной стороне треугольника 2. точки начала и конца разреза принадлежат разным сторонам треугольника |
|||
21
Вафель
19.11.18
✎
16:32
|
те нужно упорядочить массив разрезов?
|
|||
22
RomanYS
19.11.18
✎
16:32
|
(17) из (0): точки разреза (начало и конец принадлежат сторонам треугольника)
|
|||
23
Garykom
гуру
19.11.18
✎
16:33
|
(19) Ну да, причем для действительных чисел округлять можно (попадание в пиксель), главное чтобы все исходно заданные точки были целыми
|
|||
24
Garykom
гуру
19.11.18
✎
16:49
|
(21) Неа из 3 точек вершин треугольника и массива разрезов получить два новых разных массива контуров-фигур
|
|||
25
RomanYS
19.11.18
✎
16:52
|
(23) ну допустим они целые, в диапазоне 0-1000000. Вы будете закрашивать 10^12 точек чтобы 5 вершин обойти, это даже не из пушки по воробьям, это гораздо круче
|
|||
26
Garykom
гуру
19.11.18
✎
16:53
|
(20)+ Хм их этих двух вариантов и вытекает решение кста.
Точки начала/конца разреза на одной стороне треугольника. 1. Находим эту сторону 2. Находим ближайшие точки вершин треугольника к точкам начала/конца (определяем пары) 3. Добавляем третью вершину трегольника - готов один контур А второй контур это всего навсего исходный массив разрезов )) Вот для "точки начала и конца разреза принадлежат разным сторонам треугольника" чуть сложнее |
|||
27
Garykom
гуру
19.11.18
✎
16:56
|
(25) Да согласен глупость закрашивать это нафик не надо
|
|||
28
Garykom
гуру
19.11.18
✎
17:07
|
(26)+ Хотя нифига не сложнее, там просто на первом шаге надо понять какая вершина треугольника соединяет эти две разные стороны (на которых точки начала и конца разреза)
|
|||
29
Вафель
19.11.18
✎
17:23
|
Вот что бывает,когда нет базы по алгоритмике
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |