0
Сен 13
В общем, такая штука. Есть множество точек типа (X,Y,0). Как создать в Petrel вокруг этого множества полигон-оболочку заданного радиуса R?
Либо так, есть произвольный полигон, весьма кривой и невыпуклый. Как создать вокруг него невыпуклую оболочку радиуса R?
Опубликовано
16 Сен 2013
Активность
28
ответов
8196
просмотров
10
участников
1
Рейтинг
Контекст
Petrel x248
Знаю, как создать полигон фиксированного радиуса. Это то?
1. изолайн, полуавтомат - минимум редакции
2. городить достаточно сложный огород в экселе
3. в петрле руками )
Похоже, придется по 3-му варианту...
А зачем нужна НЕвыпуклая оболочка (может все-таки выпуклая)? и что понимается под радиусом оболочки?
лушче расскажите зачем вообще это? =))
Ну мало-ли надо и надо... Кстати, вспомнилось из прошлой жизни, на первых курсах уннивера на одной из олимпиад по программированию решали похожую задачу, только там заданное произвольное множество точек нужно было окружить окружностью с минимально возможным радиусом.
Множество выпуклое, если для любых двух точек этого множества все точки, лежащие на отрезке, соединяющем эти две точки, также лежат в этом множестве.
Пусть есть множество X. Определим "Невыпуклую оболочку множества X радиуса R" как совокупность точек y, таких что существует какая-то x из X, такая что расстояние от x до y меньше либо равно R. Определим "Выпуклую оболочку множества X радиуса R" как "наименьшее" выпуклое множество, содержащее невыпуклую оболочку.
Почему я уточнил что не выпуклую, так это потому что выпуклую Petrel умеет создавать через Create Boundary.
Откуда взялась "постановка задачи". Есть целевые регионы-полигоны, выделенные по ряду критериев (в основном запасы), куда перспективно зарезать боковой ствол. Задача найти скважины-кандидаты, соответственно их текущие забои должны быть не дальше, чем расстояние R (определяется полуинтуитивно, зависит от предполагаемого станка). Надо построить полигоны, чтобы отфильтровать возможные скважины-кандидаты, прежде чем перебирать их вручную, потому что ФОНД ОГРОМНЫЙ.
Увеличь целевой регион-полигон на радиус поиска и наложи на скважины (?).
Пока писал вроде понял.
Определи центр полигона (среднее Х, среднее Y), расчитай дистанцию от центра до произвольной (каждой) точки полигона, увеличь дистанцию на расстояние R и расчитай координату новой точки (уравнение линии)
Про это?
Или так. Через серию аффинных преобразований.
Перемести центр полигона в ноль (X - Xc, Y - Yc)
Умножь новую координату на скалируйщий фактор (X * f, Y * f)
И верни назад (X + Xc, Y + Yc)
Посчитай площадь исходного полигона и нового. Посчитай условный радиус R = S / (3.1415)**0.5 и подбирай итеративно масштабируйщий фактор так, чтобы новый радиус был больше на заданую величину.
Мне кажется я решил какую-то свою выдуманную задачу.
Для решения таких задач и предназначен SDK для Petrel (Ocean называется). Люди что только не делают с ним...
Например, не используют
К сожалению, это не аффинное преобразование (и не "увеличение"). Например, полигон в форме Pacman-а с размером рта меньше R должен перейти в круг.
Если знаете готовое решение, welcome. Если нет, то я скорее руками все нарисую, чем буду разбираться в SDK, у меня конкретная задача не терпящая отлагательств.
Так тебе не деформированный круг нужен? Нарисуй в паинте, что надо.
PacMan - это найти центр полигона, максимальное расстояние от центра до точки полигона есть радиус - нарисовать окружность
В этом, то и проблема, что оконтурить однозначно невыпуклой оболочкой не получится, тут нет единственного решения. В отличие от выпуклого.
Я же формализовал определение невыпуклой оболочки, есть признак, по которому точка либо лежит в оболочке, либо не лежит, значит можно оконтурить однозначно.
В общем, хочу автоматизировать построение таких вот полигонов:
Ну так, увеличить каждый исходный полигон, пересечение всех увеличенных полигонов и будет картинка.
Только если каждый исходный полигон выпуклый, для этого надо исходные полигоны разбить на выпуклые. Вручную...
Давай с другой стороны - расчитай расстояние от забоя скважины до каждой точки каждого полигона? Кто выполняет условие тот и папа
Пойдет. Как в Petrel посчитать расстояние от точки до полигона?
Если надо просто посчитать расстояние от точки до полигона то я так обычно делаю:
Делается Refine полигонам с шагом метров в 10, выгрузаю их текстом (IRAP classic lines).
Потом в экселе посчитай расстояние от забоев до всех точек полигонов. Либо макросом либо обычной формулой.
Решение в лоб, поэтому может долго считаться, но результат будет )
Попробуй Geometrical Modeling=>Distance to object вроде это оно.
А для чего refine?
В общем ладно с математикой надо заканчивать))
Вот тебе простое и элегантное решение, для создания полигонов. В Петреле с помощью create surface edge строишь полигон оконтуривающий карту остаточных толщин (обрезанную по минимальному значению). Затем делаешь split, и вуаля, есть куча полигонов. Единственное, что это не будет полигон с нужным радиусом)
Я делал так. Натягивал на полигон грид. Вычислял расстояние от узлов грида до ближайшей грани полигона. Строил линии уровня в получившемся гриде по заданному радиусу. Есть исходник на С++, если надо.
Завязывайте с математикой, объясни по-человечески:
тебе надо сделать полигон, оконтуривающий грид? при это полигон больше грида на некоторое постоянное расстояние? или тебе надо сделать полигоны постоянного радиуса, вокруг разреженного набора точек (скважин)?
чтобы быть уверенным в том что у тебя достаточно точек в полигоне для расчета расстояния. Считай что ты полигон аппроксимируешь точками. И чем больше точек будет описывать твой полигон, тем точнее будет расчет расстояния до него.
Вообще первое, но второе тоже сводится к первому.
С помощью Create Surface Edge в принципе, получилось почти то что надо, за исключением глюков:
Да-да, я тоже чот не понял... Но спинной мозг говорит, что все можно сделать просто без матана и тройного интеграла по замкнутому контуру...