Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.09.2013, 00:07
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 51  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
перечитай посты 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);
 
		}
	}
 
}

Старый 07.09.2013, 14:55
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 52  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

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

Старый 24.09.2013, 17:36
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 53  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Wolsh у меня к Вам глупый вопрос - а вот такое правило, оно только для треугольников?
Код AS3:
var p:Number = (a + b + c) / 2;
var radiusMax:Number = Math.sqrt( (p - a) * (p - b) * (p - c) / p);

Старый 24.09.2013, 17:55
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 54  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Окружность можно вписать только в треугольник, ромб и правильный полигон (с одинаковыми сторонами и углами). Ну а для полигона найти радиус не проблема, он же симметричен в отличие от треугольника.
Про эту волшебную формулу — ну проверьте для квадрата, это ж так просто))
__________________
Reality.getBounds(this);

Старый 27.09.2013, 22:06
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 55  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
У меня вот какой вопрос - если сложить а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, время: 16:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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