|
|
|||||
перечитай посты maxkar,
в его раскладе все 'само собой' учитывается 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); } } } |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
silin Спасибо Вам за помощь! У меня странно как то мозг устроен, я читал целую неделю учебники и статьи на сайтах по геометрии и алгебре и ноль результатов. я пока воочию не увижу реализацию, не могу не чего сделать. А по примерам смотрю - ага, здесь вот то правило, здесь вот то.
Цитата:
|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Wolsh у меня к Вам глупый вопрос - а вот такое правило, оно только для треугольников?
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Окружность можно вписать только в треугольник, ромб и правильный полигон (с одинаковыми сторонами и углами). Ну а для полигона найти радиус не проблема, он же симметричен в отличие от треугольника.
Про эту волшебную формулу — ну проверьте для квадрата, это ж так просто))
__________________
Reality.getBounds(this); |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
У меня вот какой вопрос - если сложить а1 и а2, то значение будет ровняться углу между двумя сторонами?
Мне понадобилось узнать угол и я вспомнил этот пример. Сделал так же, и оказалось, что семь градусов лишних... |
Часовой пояс GMT +4, время: 16:57. |
|
« Предыдущая тема | Следующая тема » |
|
|