Найти привязку ограничивающей коробки в пути

Скажем, у нас есть этот путь:

введите описание изображения здесь

Как найти границы ящика, которые вписываются внутрь?

Да, я знаю, что пути могут быть сколь угодно сложными и не должны быть закрыты. Все еще интересуются предложениями по решению этой проблемы.

Ответ 1

Наверное, я начинаю с простого ответа. Выступление на дне явно не повлияет на размер самого большого внутреннего прямоугольника, поэтому мы можем просто предположить, что вы можете его опустить. Как только это будет опущено, мне кажется, что это что-то вроде двух RectangleGeometries, которые были объединены, у которых свойства RadiusX и RadiusY отличны от нуля.

Аппроксимация, которую я сделал, задается следующим образом: x/m >

<Path Fill="Black">
    <Path.Data>
        <CombinedGeometry GeometryCombineMode="Xor">
            <CombinedGeometry.Geometry1>
                <RectangleGeometry Rect="10,10,100,50" RadiusX="5" RadiusY="5" />
            </CombinedGeometry.Geometry1>
            <CombinedGeometry.Geometry2>
                <RectangleGeometry Rect="15,15,90,40" RadiusX="5" RadiusY="5"/>
            </CombinedGeometry.Geometry2>
        </CombinedGeometry>
    </Path.Data>
</Path>

Для меня ваш вопрос сводится к тому, как в общем случае найти самый большой прямоугольник, который будет вписываться внутри интерьера RectangleGeometry, не перекрывая его границу. Для этого мы должны иметь дело с значениями RadiusX и RadiusY.

Чтобы упростить ситуацию, я буду предполагать, что RadiusX= RadiusY!= 0, и если вас заинтересовал случай RadiusX!= RadiusY!= 0, то мы можем пересечь этот мост когда мы доберемся до него.

Когда радиусы x и y равны, криволинейный угол просто прорисовывается с использованием круга. Этот круг сократит внутреннее пространство, заданное так, как он работает, и учитывая, что значения радиуса малы относительно ширины и высоты вашего изображения, вы, вероятно, ищете ограничивающий прямоугольник, который подходит, касается 45-градусного угла изогнутых углов.

Чтобы достичь этого, нам просто нужно выяснить ширину и высоту, которые мы теряем для одного угла. Поскольку мы говорим о круге и учитывая угол 45 градусов, потери будут одинаковыми в обоих направлениях. Используя некоторую простую тригонометрию, я придумал следующую сумму потерь, учитывая значение радиуса R:

потеря для одного направления в углу = R (1 - sqrt (2)/2)

Это было получено путем определения расстояния от угла не округленной версии до 45-градусного края окружности закругления. Эту длину можно просто собрать, используя теорему Пифагора, чтобы определить длину радиуса круга плюс "отсутствующую" часть, а затем просто вычесть известный радиус, чтобы определить длину гипотенузы для этой "отсутствующей" части, которая равна равным R (1 - sqrt (2)).

Как только это расстояние было собрано, я снова использовал тригонометрию, чтобы собрать размер ног полученного равнобедренного треугольника, который вышел на R (1 - sqrt (2)/2), который является уравнением, которое я ранее упоминал.

Итак, предположим, что исходный прямоугольник без округления будет иметь x = x_o, y = y_o, width = w_o, height = h_o и R = RadiusX = RadiusY!= 0, мы получим следующее для нашего вписанного прямоугольника

x = x_o + R (1 - sqrt (2)/2)
y = y_o + R (1 - sqrt (2)/2)
width = w_o - 2R (1 - sqrt (2)/2)
height = h_o - 2R (1 - sqrt (2)/2)

Я тестировал это со следующим xaml:

<Path Stroke="Black">
    <Path.Data>
         <RectangleGeometry Rect="10,10,100,50" RadiusX="5" RadiusY="5"/>
    </Path.Data>
</Path>
<Path Stroke="Orange">
     <Path.Data>
         <RectangleGeometry Rect="11.47,11.47,97.07,47.07" RadiusX="0" RadiusY="0"/>
    </Path.Data>
</Path>

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

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