Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   треугольник с закругленными углами (http://www.flasher.ru/forum/showthread.php?t=203076)

ther 29.08.2013 16:25

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

GBee 29.08.2013 18:18

Насколько закруглен? Может поиграть с joints в graphics.lineStyle?

elder_Nosferatu 29.08.2013 18:25

С помощью геометрии...
Дано: вершины треугольника, радиус закругления.

Решение:
1) Ищем точку пересечения бисектрис треугольника.
2) Ищем расстояние то этой точки к одной из сторон (оно будет одинаково для всех сторон)
3) Сравниваем найденое расстояние с заданым радиусом. Если радиус больше, то меняем его на значение расстояния.
4) Ищем на каждой бисектрисе точку , расстояние от сторон угла которой будет равно радиусу закругления. Это будут центры дуг закругления.
5) Опускаем перпендикуляры с найденых центров на соседние стороны. Пересечения будут началом и концом дуги закругления.
6) Используя вершыну, с которой проведена бисектриса, решаем в какую сторону рисовать дугу (по часовой или против часовой).

Полученых данных достаточно для рисования фигуры.
ЗЫ: Не завидую Вам, если возьметесь это делать и очень порадуюсь, если Вам все же это удасться...

ther 29.08.2013 18:32

okouser
спасибо, вроде то, что надо
GBee
радиус произволен(
elder_Nosferatu
выбора нет))

Wolsh 29.08.2013 21:15

Вложений: 1
Как то делал для полигонов, лень переписывать под кастомные треугольники..
Код AS3:

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);
                }
        }
}

Usage:
Код AS3:

                        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);

Poly.swf   (2.6 Кб)

Akopalipsis 30.08.2013 02:58

Помогите пожалуйста с определениями, а то читая я запутался...
Как правильно называется - точка пересечения биссектрис?)
Вот если вписать в треугольник окружность, то центр этой окружности и будет точка пересечения биссектрис?
Когда только увидел эту тему, то подумал, что это все очень просто.
Думая, что раз я и углы научился находить и косинусы с синусами, подумал, что решить эту задачу будет не лишней. За целый день нашёл только цент вписанной окружности, да и то пока сомневаюсь, что она точная)) И вот сейчас я сижу и думаю - а является ли этот центр тем что мне нужно?

Wolsh 30.08.2013 03:46

Вложений: 1
Цитата:

Как правильно называется - точка пересечения биссектрис?)
Вот если вписать в треугольник окружность, то центр этой окружности и будет точка пересечения биссектрис?
Да.
Цитата:

а является ли этот центр тем что мне нужно?
Да по разному можно. Но необходимости в нем точно нет, если это не равносторонний треугольник//правильный полигон.
Вложение 29952
Настоящее скругление выглядит так (в отличие от дичайшего способа, когда в вершину треугольника помещается контрольная точка кривой). Если угол АСВ известен, то ОСВ составляет его половину. Так же известен катет ОВ (заданный радиус скругления), и значит можно спокойно решить весь прямоугольный треугольник ОСВ (то есть найти все его стороны и углы). Вопрос только в том, что Вы будете делать дальше — нужны то не какие-то длины сторон и непонятные углы, а координаты точек)) И тут (по крайней мере я) не знаю, как обойтись без полярных координат. Можно центр полярки как раз и поместить в центр треугольника и потом оттранслировать точки в "настоящий" центр координат, может так будет проще, чем строить углы прямо из него.

Wolsh 30.08.2013 11:58

Вложений: 1
Определиться с треугольником в системе координат можно так.
Вложение 29953
Зная только точки вершин, мы достраиваем прямоугольные треугольники гипотенузами к сторонам нашего треугольника и по проекциям на оси координат узнаем все их катеты. Теперь мы можем узнать углы ACN и BCM, а угол С треугольника будет (90-ACN-BCM). Теперь решаем скругление, как в посте выше, и узнаем длину CD. Угол MCD нам тоже известен, и значит мы можем узнать длину DF, а значит и Х-координату D: (Cx - DF). Аналогично с Y-координатой D (Cy - ED). Так мы нашли точку D. Точно так же можно найти и центр скругления.

Akopalipsis 30.08.2013 15:56

okouser буду в десятом.
Wolsh Спасибо Вам огромное за разъяснение или даже, за трату времени!
Для меня самое сложное в геометрии во флеш, это то, что... даже не знаю как обьяснить, что по отдельности я знаю как находить те или иные отрезки и координаты... читать пойду..

elder_Nosferatu 30.08.2013 23:54

Цитата:

Сообщение от Wolsh (Сообщение 1145090)
...
Да по разному можно. Но необходимости в нем точно нет, если это не равносторонний треугольник//правильный полигон.
...

В общем случае (для треугольника) все же есть необходимость в центре пересечения бисектрис! Но не для построения самих скруглений, а для сравнения радиуса скругления с максимально возможным значением - радиусом вписаной окружности. Так же себя ведет и стандартный Адобовский скругленый прямоугольник - если радиус скругления превышает макс. значение для текуших размеров фигуры, радиус уменьшается.


Часовой пояс GMT +4, время: 01:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.