|
|
|||||
Регистрация: Apr 2008
Сообщений: 211
|
треугольник с закругленными углами
для прямоугольника есть встроенная функция, а как быть с треугольником?
треугольник должен иметь те же свойства, что и прямоугольник, то есть, толщина границы, цвет границы, цвет заливки и радиус закругления. С помощью чего это можно реализовать?curveTo? |
|
|||||
С помощью геометрии...
Дано: вершины треугольника, радиус закругления. Решение: 1) Ищем точку пересечения бисектрис треугольника. 2) Ищем расстояние то этой точки к одной из сторон (оно будет одинаково для всех сторон) 3) Сравниваем найденое расстояние с заданым радиусом. Если радиус больше, то меняем его на значение расстояния. 4) Ищем на каждой бисектрисе точку , расстояние от сторон угла которой будет равно радиусу закругления. Это будут центры дуг закругления. 5) Опускаем перпендикуляры с найденых центров на соседние стороны. Пересечения будут началом и концом дуги закругления. 6) Используя вершыну, с которой проведена бисектриса, решаем в какую сторону рисовать дугу (по часовой или против часовой). Полученых данных достаточно для рисования фигуры. ЗЫ: Не завидую Вам, если возьметесь это делать и очень порадуюсь, если Вам все же это удасться... |
|
|||||
Регистрация: Apr 2008
Сообщений: 211
|
okouser
спасибо, вроде то, что надо GBee радиус произволен( elder_Nosferatu выбора нет)) |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Как то делал для полигонов, лень переписывать под кастомные треугольники..
package { import flash.display.GraphicsPath; /* * * * * * * * * * * * * @author wolsh * * * \* * * * * * * * * */ public class RoundPoly { private static const RAD180:Number = Math.PI; private static const RAD:Number = Math.PI / 180; private static const RAD90:Number = Math.PI / 2; public function RoundPoly() { } public static function getPath(sides:uint, centerX:Number, centerY:Number, radius:Number, round:Number, rotation:Number):GraphicsPath { rotation *= RAD; var c:Vector.<int> = new Vector.<int>(); var d:Vector.<Number> = new Vector.<Number>(); var roundCenterR:Number = radius - round; var sideAngle:Number = 2 * RAD180 / sides; var roundAngle:Number = RAD90 - sideAngle / 2; //// move to start coordinates var startX:Number = centerX + roundCenterR * Math.cos(rotation); var startY:Number = centerY + roundCenterR * Math.sin(rotation) var startArc:GraphicsPath = RoundPoly.getArc(startX, startY, round, rotation - sideAngle / 2, sideAngle); c = startArc.commands; d = startArc.data; //// lines to anchors for (var i:uint = 1; i < sides; i++) { var angle:Number = rotation + sideAngle * i; var roundCenterX:Number = centerX + roundCenterR * Math.cos(angle); var roundCenterY:Number = centerY + roundCenterR * Math.sin(angle); var arcStartAngle:Number = angle - sideAngle / 2; var arc:GraphicsPath = RoundPoly.getArc(roundCenterX, roundCenterY, round, arcStartAngle, sideAngle); arc.commands[0] = 2; c = c.concat(arc.commands); d = d.concat(arc.data); } //// Close contur line c.push(2); d.push(startArc.data[0], startArc.data[1]); return new GraphicsPath(c, d); } private static function getArc(centerX:Number, centerY:Number, radius:Number, rotation:Number, arc:Number, startCommand:int = 1) : GraphicsPath { if (arc == 0) { return null; // ? // } // alias arc to 360 gradians arc = arc % (RAD180 * 2); // 18 gradians max at one step var frags:Number = Math.abs( Math.ceil(arc * 10 / RAD180) ); if (arc < 0) { frags += 1; } var fragAngle:Number = arc / frags; var controlR:Number = radius / Math.cos( -fragAngle / 2); var c:Vector.<int> = Vector.<int>([ startCommand ]); var d:Vector.<Number> = new Vector.<Number>(); d.push(centerX + radius * Math.cos(rotation)); d.push(centerY + radius * Math.sin(rotation)); for (var i:uint = 1; i < frags + 1; i++) { var aA:Number = rotation + fragAngle * i; var aX:Number = centerX + radius * Math.cos(aA); var aY:Number = centerY + radius * Math.sin(aA); var cA:Number = aA - fragAngle / 2; var cX:Number = centerX + controlR * Math.cos(cA); var cY:Number = centerY + controlR * Math.sin(cA); c.push(3); d.push(cX, cY, aX, aY); } return new GraphicsPath(c, d); } } } var gPath:GraphicsPath = RoundPoly.getPath( 5, // кол-во сторон 150, // х центра полигона 150, // у центра полигона 120, // радиус полигона 20, // радиус скругления 72 // угол поворота полигона ); var gData:Vector.<IGraphicsData> = Vector.<IGraphicsData> ([ new GraphicsSolidFill(0x000000, 0.5), gPath, new GraphicsEndFill() ]); var s:Shape = new Shape(); super.addChild(s); s.graphics.drawGraphicsData(gData);
__________________
Reality.getBounds(this); |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Помогите пожалуйста с определениями, а то читая я запутался...
Как правильно называется - точка пересечения биссектрис?) Вот если вписать в треугольник окружность, то центр этой окружности и будет точка пересечения биссектрис? Когда только увидел эту тему, то подумал, что это все очень просто. Думая, что раз я и углы научился находить и косинусы с синусами, подумал, что решить эту задачу будет не лишней. За целый день нашёл только цент вписанной окружности, да и то пока сомневаюсь, что она точная)) И вот сейчас я сижу и думаю - а является ли этот центр тем что мне нужно? |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Цитата:
Настоящее скругление выглядит так (в отличие от дичайшего способа, когда в вершину треугольника помещается контрольная точка кривой). Если угол АСВ известен, то ОСВ составляет его половину. Так же известен катет ОВ (заданный радиус скругления), и значит можно спокойно решить весь прямоугольный треугольник ОСВ (то есть найти все его стороны и углы). Вопрос только в том, что Вы будете делать дальше — нужны то не какие-то длины сторон и непонятные углы, а координаты точек)) И тут (по крайней мере я) не знаю, как обойтись без полярных координат. Можно центр полярки как раз и поместить в центр треугольника и потом оттранслировать точки в "настоящий" центр координат, может так будет проще, чем строить углы прямо из него.
__________________
Reality.getBounds(this); |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Определиться с треугольником в системе координат можно так.
Зная только точки вершин, мы достраиваем прямоугольные треугольники гипотенузами к сторонам нашего треугольника и по проекциям на оси координат узнаем все их катеты. Теперь мы можем узнать углы ACN и BCM, а угол С треугольника будет (90-ACN-BCM). Теперь решаем скругление, как в посте выше, и узнаем длину CD. Угол MCD нам тоже известен, и значит мы можем узнать длину DF, а значит и Х-координату D: (Cx - DF). Аналогично с Y-координатой D (Cy - ED). Так мы нашли точку D. Точно так же можно найти и центр скругления.
__________________
Reality.getBounds(this); |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
okouser буду в десятом.
Wolsh Спасибо Вам огромное за разъяснение или даже, за трату времени! Для меня самое сложное в геометрии во флеш, это то, что... даже не знаю как обьяснить, что по отдельности я знаю как находить те или иные отрезки и координаты... читать пойду.. |
|
|||||
В общем случае (для треугольника) все же есть необходимость в центре пересечения бисектрис! Но не для построения самих скруглений, а для сравнения радиуса скругления с максимально возможным значением - радиусом вписаной окружности. Так же себя ведет и стандартный Адобовский скругленый прямоугольник - если радиус скругления превышает макс. значение для текуших размеров фигуры, радиус уменьшается.
|
Часовой пояс GMT +4, время: 19:15. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|