Залить часть геометрической фигуры

157
17 апреля 2022, 15:50

Нужна помощь коллективного разума на тему: как залить часть произвольной замкнутой геометрической фигуры?

Usecase:

  1. Пользователь рисует фигуру (эллипс/прямоугольник/замкнутый многоугольник)
  2. Пользователь вводит процент, насколько фигура заполнена (0-100)
  3. Мы делаем .Fill() куска фигуры

Зачем это нужно: пользователю скажем, что это вид сбоку на какие-то ёмкости. Ёмкости могут быть не только прямоугольные/круглые, но и сложного сечения, отсюда и проблема.

Получить площадь замкнутого многоугольника я могу, как и вычислить условные 25% от неё. А вот дальше-то что? Примем, что у нас многоугольник выпуклый, с одним "дном". Как на картинке.

Есть мысль идти тупо по точкам внутри контура, снизу вверх и влево-вправо, пока количество залитых пикселей не будет равно 25% от площади, но на большом поле это займёт кучу времени. А Paint() вызывается довольно часто.

Ниже пример, как если-бы пользователь нарисовал фигуру и ввёл 25% заполненности (в реале заливка будет снизу вверх, я в Paint нарисовал некорректно, но смысл не меняется)

Работаю в C# WinForms .net 3.5

Answer 1

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

Для каждой строчки заливаем цветом "серёдку" между двумя точками фигуры - крайней слева и крайней справа):

Поскольку мы договорились, что фигура выпуклая, то точек будет либо две, либо (в вырожденном случае) одна.

В процессе считаем нужный процентаж от высоты фигуры, чтобы остановиться вовремя.

Если фигура начинается не с самого низа картинки (а это вероятно так будет), то сначала нужно досчитать до первой горизонтальной линии

(как вариант это может быть точка):

И только после этого начинать заливать.

Есть мысль идти тупо по точкам внутри контура ... но на большом поле это займёт кучу времени.

Чертите не точками, а сразу горизонтальными линиями.

READ ALSO
Cоздание истории в Инстаграм c помощью Selenium C# gecko

Cоздание истории в Инстаграм c помощью Selenium C# gecko

Я пытаюсь разместить историю в Инстаграмм с компьютераИспользую Selenium + C# + geckodriver (Console Application)

123
Visual Studio 2019 Professional не видит установленный ASP.NET .NET Framework

Visual Studio 2019 Professional не видит установленный ASP.NET .NET Framework

На машине x64 Windows 7 установил MS VS 2019 Professional, вместе установил и "ASPNET

128
Как хранить графики работы?

Как хранить графики работы?

Пишу программу вывода графика работы врачей на телевизорГрафик работы сохраняю в БД

111