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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.08.2013, 16:25
ther вне форума Посмотреть профиль Отправить личное сообщение для ther Найти все сообщения от ther
  № 1  
Ответить с цитированием
ther

Регистрация: Apr 2008
Сообщений: 211
По умолчанию треугольник с закругленными углами

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

Старый 29.08.2013, 18:18
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 2  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Насколько закруглен? Может поиграть с joints в graphics.lineStyle?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 29.08.2013, 18:25
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 3  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
С помощью геометрии...
Дано: вершины треугольника, радиус закругления.

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

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

Старый 29.08.2013, 18:32
ther вне форума Посмотреть профиль Отправить личное сообщение для ther Найти все сообщения от ther
  № 4  
Ответить с цитированием
ther

Регистрация: Apr 2008
Сообщений: 211
okouser
спасибо, вроде то, что надо
GBee
радиус произволен(
elder_Nosferatu
выбора нет))

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Как то делал для полигонов, лень переписывать под кастомные треугольники..
Код 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 Кб)
Вложения
Тип файла: swf Poly.swf (2.6 Кб, 282 просмотров)
__________________
Reality.getBounds(this);

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

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

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Как правильно называется - точка пересечения биссектрис?)
Вот если вписать в треугольник окружность, то центр этой окружности и будет точка пересечения биссектрис?
Да.
Цитата:
а является ли этот центр тем что мне нужно?
Да по разному можно. Но необходимости в нем точно нет, если это не равносторонний треугольник//правильный полигон.
Название: RoundAngle.png
Просмотров: 2852

Размер: 10.0 Кб
Настоящее скругление выглядит так (в отличие от дичайшего способа, когда в вершину треугольника помещается контрольная точка кривой). Если угол АСВ известен, то ОСВ составляет его половину. Так же известен катет ОВ (заданный радиус скругления), и значит можно спокойно решить весь прямоугольный треугольник ОСВ (то есть найти все его стороны и углы). Вопрос только в том, что Вы будете делать дальше — нужны то не какие-то длины сторон и непонятные углы, а координаты точек)) И тут (по крайней мере я) не знаю, как обойтись без полярных координат. Можно центр полярки как раз и поместить в центр треугольника и потом оттранслировать точки в "настоящий" центр координат, может так будет проще, чем строить углы прямо из него.
__________________
Reality.getBounds(this);

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Определиться с треугольником в системе координат можно так.
Название: triangle-in-coords.png
Просмотров: 3147

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

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

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

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

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
Цитата:
Сообщение от Wolsh Посмотреть сообщение
...
Да по разному можно. Но необходимости в нем точно нет, если это не равносторонний треугольник//правильный полигон.
...
В общем случае (для треугольника) все же есть необходимость в центре пересечения бисектрис! Но не для построения самих скруглений, а для сравнения радиуса скругления с максимально возможным значением - радиусом вписаной окружности. Так же себя ведет и стандартный Адобовский скругленый прямоугольник - если радиус скругления превышает макс. значение для текуших размеров фигуры, радиус уменьшается.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:15.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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