Форум 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)

silin 07.09.2013 00:07

перечитай посты maxkar,
в его раскладе все 'само собой' учитывается
Код AS3:

package
{
        import flash.display.Graphics;
        import flash.display.Sprite;
        import flash.geom.Point;
 
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        var a:Point = new Point(150, 50);
                        var b:Point = new Point(250, 200);
                        var c:Point = new Point(100, 300);
                        var d:Point = new Point(50, 150);
                        var e:Point = new Point(150, 200);
                        var f:Point = new Point(150, 150);
 
                        //var points:Vector.<Point> = Vector.<Point>([a, b, c]);
                        //var points:Vector.<Point> = Vector.<Point>([a, c, b]);
                        var points:Vector.<Point> = Vector.<Point>([a, f, b, e, c, d]);
                        //var points:Vector.<Point> = Vector.<Point>([a, d, c, b]);
 
                        graphics.lineStyle(0);
                        drawRoundedPoly(graphics, points);
                        graphics.lineStyle(0, 0xFF0000);
                        drawRoundedPoly(graphics, points, 20);
 
                }
                public static function drawRoundedPoly(g:Graphics, points:Vector.<Point>, radius:Number = 0, tol:Number = 0.1):void
                {
 
                        if (radius <= 0) radius = 1e-3;
 
                        var len:int = points.length;
                        for (var i:int = 0; i < len; i++)
                        {
                                var p0:Point = points[i];
                                var p1:Point = points[(i + 1) % len];
                                var p2:Point = points[(i + 2) % len];
 
                                const norm1 : Point = p0.subtract(p1);
                                norm1.normalize(1);
                                const norm2 : Point = p2.subtract(p1);
                                norm2.normalize(1);
                                const bisectrix : Point = norm1.add(norm2);
 
 
                                const normRatio : Number = radius / Math.abs(bisectrix.x * norm1.y - bisectrix.y * norm1.x);
                                bisectrix.x *= normRatio;
                                bisectrix.y *= normRatio;
                                const center : Point = p1.add(bisectrix);
                                const touchRatio : Number = bisectrix.x * norm1.x + bisectrix.y * norm1.y;
                                const touch1 : Point = new Point(p1.x + touchRatio * norm1.x, p1.y + touchRatio * norm1.y);
                                const touch2 : Point = new Point(p1.x + touchRatio * norm2.x, p1.y + touchRatio * norm2.y);
 
                                if (!i)
                                {
                                        var firstP:Point = touch1;
                                        g.moveTo(touch1.x, touch1.y);
 
                                }else
                                {
                                        g.lineTo(touch1.x, touch1.y);
                                }
                                // arc
                                var d1:Point = touch1.subtract(center);
                                var d2:Point = touch2.subtract(center);
                                var a1:Number = Math.atan2(d1.y, d1.x);
                                var a2:Number = Math.atan2(d2.y, d2.x);
                                if (a2 - a1 > Math.PI) a2 -= 2 * Math.PI;
                                if (a2 - a1 < -Math.PI) a2 += 2 * Math.PI;
 
 
 
                                var n:int = Math.abs(a2 - a1) / tol;
                                var da:Number = (a2 - a1) / n;
                                for (var j:int = 1; j < n; j++)
                                {
 
                                        var arcP:Point = center.add(Point.polar(radius, a1 + j * da));
                                        g.lineTo(arcP.x, arcP.y);
 
                                }
 
                        }
                        g.lineTo(firstP.x, firstP.y);
 
                }
        }
 
}


Akopalipsis 07.09.2013 14:55

silin Спасибо Вам за помощь! У меня странно как то мозг устроен, я читал целую неделю учебники и статьи на сайтах по геометрии и алгебре и ноль результатов. я пока воочию не увижу реализацию, не могу не чего сделать. А по примерам смотрю - ага, здесь вот то правило, здесь вот то.
Цитата:

перечитай посты maxkar
Обязательно! Честно сказать я даже не разбирал его код, но теперь обязательно буду учить.

Akopalipsis 24.09.2013 17:36

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

var p:Number = (a + b + c) / 2;
var radiusMax:Number = Math.sqrt( (p - a) * (p - b) * (p - c) / p);


Wolsh 24.09.2013 17:55

Окружность можно вписать только в треугольник, ромб и правильный полигон (с одинаковыми сторонами и углами). Ну а для полигона найти радиус не проблема, он же симметричен в отличие от треугольника.
Про эту волшебную формулу — ну проверьте для квадрата, это ж так просто))

Akopalipsis 27.09.2013 22:06

У меня вот какой вопрос - если сложить а1 и а2, то значение будет ровняться углу между двумя сторонами?
Мне понадобилось узнать угол и я вспомнил этот пример. Сделал так же, и оказалось, что семь градусов лишних...
Код AS3:

var p0:Point = points[i];
var p1:Point = points[(i + 1) % len];
var p2:Point = points[(i + 2) % len];
var d1:Point = p1.subtract(p0);
var d2:Point = p1.subtract(p2);
//  углы лучей
var a1:Number = Math.atan2(d1.y, d1.x);
var a2:Number = Math.atan2(d2.y, d2.x);



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

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