![]() |
|
|
![]() |
![]() |
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
listener
|
Нужно просто совместить по две вершины красной и черной фигур (как у вас А-А1,С-С1), изменяя линейные размеры одной из них, это вы называете "вписанием"? Тогда пропорционального изменения размеров при таком "вписании" в общем случае не добиться. Или надо, чтобы одна фигура полностью "поглотила" другую, лишь бы все точки одной фигуры попали внутрь другой?
|
|
|||||
[+4 08.09.13]
Регистрация: May 2012
Сообщений: 131
|
Если именно так, как на рисунке из начала топика, то по умолчанию должна выполняться такая вот штука:
a/b * x = c/d найти x тут не составит труда. а если она не выполняется - тогда решение другое. |
|
|||||
Да, нужно чтобы красная фигура поглотила черную, увеличившись в размерах
|
|
|||||
А вот интересно, при помощи BitmapData.threthold и BitmapData.getColorBoundsRect нельзя ли решить эту задачу ?
К примеру, сделать битмап дату черную с дыркой внутри нее такой же формы как и красный четырехугольник. Каким-либо образом получить прямоугольник дырки (прозрачных пикселей), но не описаный а вписаный На скрине у меня получилось сделать такую битмапу (черную) слева вверху (там масштаб в 10 раз уменьшен), но получается только вычислить прямоугольник описаный "вокруг ![]() Можно ли как-нибудь средствами битмап даты получить этот вписаный прямоугольник ? |
|
|||||
Modus ponens
|
Я все думаю, что можно как-то дополнить до чего-то попроще, возможно до треугольника, и уже поняв, как это сделать, "подправить" до четырехугольника.
И еще, лучше все-таки задать ограничения для четырехугольника, что он должен быть выпуклым и чтобы у него не было параллельных сторон (случай с параллельными сторонами рассматривать отдельно, т.как там бесконечно много эквивалентных решений). Я бы наверное на какой-нибудь mathoverflow.com запостил. Задачка, как бы совсем нетривиальная. Скорее всего, у нее есть аналитическое решение, но если нет... то тогда только "методом последовательных приближений"...
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 28.12.2012 в 13:54. |
|
|||||
Ну, допустим, увеличивать я научился, вполне может быть что этот алгоритм и не ошибется
pm.points - 4 точки красного четырехугольника // границы красного спрайта (четырехугольника) внутри сцены var rect:Rectangle=transformSprite.getRect(FlexGlobals.topLevelApplication.stage); var minHeight:Number=10000; var minWidth:Number=10000; var widthStartIndex:int; var heightStartIndex:int; // min height if(Math.abs(pm.points[0].y-pm.points[3].y)<minHeight) { minHeight=Math.abs(pm.points[0].y-pm.points[3].y); heightStartIndex=0; } if(Math.abs(pm.points[1].y-pm.points[2].y)<minHeight) { minHeight=Math.abs(pm.points[1].y-pm.points[2].y); heightStartIndex=1; } if(Math.abs(pm.points[0].y-pm.points[2].y)<minHeight) { minHeight=Math.abs(pm.points[0].y-pm.points[2].y); heightStartIndex=0; } if(Math.abs(pm.points[1].y-pm.points[3].y)<minHeight) { minHeight=Math.abs(pm.points[1].y-pm.points[3].y); heightStartIndex=1; } // min width if(Math.abs(pm.points[0].x-pm.points[1].x)<minWidth) { minWidth=Math.abs(pm.points[0].x-pm.points[1].x); widthStartIndex=0; } if(Math.abs(pm.points[0].x-pm.points[2].x)<minWidth) { minWidth=Math.abs(pm.points[0].x-pm.points[2].x); widthStartIndex=2; } if(Math.abs(pm.points[3].x-pm.points[2].x)<minWidth) { minWidth=Math.abs(pm.points[3].x-pm.points[2].x); widthStartIndex=3; } if(Math.abs(pm.points[3].x-pm.points[1].x)<minWidth) { minWidth=Math.abs(pm.points[3].x-pm.points[1].x); widthStartIndex=1; } trace("minWidth",minWidth,"minHeight",minHeight); trace("widthStartIndex",widthStartIndex,"heightStartIndex",heightStartIndex); var coeffWidth:Number=980/minWidth; var coeffHeight:Number=540/minHeight; if(coeffWidth>coeffHeight) { coeff=coeffWidth; } else { coeff=coeffHeight; } // позиционирование в лев верх экрана pm.points[1].x-=rect.x; pm.points[1].y-=rect.y; pm.points[2].x-=rect.x; pm.points[2].y-=rect.y; pm.points[3].x-=rect.x; pm.points[3].y-=rect.y; pm.points[0].x-=rect.x; pm.points[0].y-=rect.y; // scale pm.points[0].x=pm.points[0].x*coeff; pm.points[0].y=pm.points[0].y*coeff; pm.points[1].x=pm.points[1].x*coeff; pm.points[1].y=pm.points[1].y*coeff; pm.points[2].x=pm.points[2].x*coeff; pm.points[2].y=pm.points[2].y*coeff; pm.points[3].x=pm.points[3].x*coeff; pm.points[3].y=pm.points[3].y*coeff; |
|
|||||
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
Ещё в прошлом году пришла идея - если у вашего четырёхугольника не пересекаются противоположные стороны, можно взять и нарисовать два прямоугольника используя противоположные вершины вашего четырёхугольника. В результате пересечения этих двух прямоугольников у нас будет третий прямоугольник который всегда будет внутри вашего четырёхугольника, в него уже надо пытаться вписать ваш исходный прямоугольник.
Есть конечно неприятный момент (очень), когда ширина(высота) этого конечного прямоугольника будет очень маленькой(равна нулю) (это когда х или у противоположных вершин четырёхугольника будут ~ равны), тогда вам придётся увеличивать четырёхугольник до огромных размеров (бесконечности) чтобы получилось вписать ваш прямоугольник. В общем получить конечный прямоугольник в который нужно вписывать ваш, у меня получилось, а уже увеличивать всю эту конструкцию - уже праздник был на носу, может как-нибудь вечерком закончу. Кое-где вычисляю лишнее, но в общем как-то так ![]() Тыкаете 4 раза туда где должны быть вершины, на пятый клик всё отрисуется. Последний раз редактировалось AlexLucas; 02.01.2013 в 13:18. |
|
|||||
Если нужно общее решение, можно взять окружности вписанные в четырёхугольник (например вписанные в треугольники), выбрать наибольшую и смасштабировать в неё прямоугольник. Заполнение будет не оптимальным, но возможно достаточным.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 03:32. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|