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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.11.2012, 21:29
inozemcev вне форума Посмотреть профиль Отправить личное сообщение для inozemcev Найти все сообщения от inozemcev
  № 1  
Ответить с цитированием
inozemcev
[+ 1.0 08.10.14]
 
Аватар для inozemcev

блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
По умолчанию Требуется отрисовать трапецию

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

Старый 22.11.2012, 21:58
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 2  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
А вам что проще?
__________________
hauts.ru

Старый 22.11.2012, 22:03
inozemcev вне форума Посмотреть профиль Отправить личное сообщение для inozemcev Найти все сообщения от inozemcev
  № 3  
Ответить с цитированием
inozemcev
[+ 1.0 08.10.14]
 
Аватар для inozemcev

блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
Цитата:
Сообщение от Hauts Посмотреть сообщение
А вам что проще?
Лучше програмно

Старый 22.11.2012, 22:31
Simplifier вне форума Посмотреть профиль Отправить личное сообщение для Simplifier Найти все сообщения от Simplifier
  № 4  
Ответить с цитированием
Simplifier

Регистрация: Jun 2011
Сообщений: 60
Вроде бы не должно возникать каких-либо проблем с программной отрисовкой. Контрольные точки curveTo в углах будут стоять.

Старый 22.11.2012, 22:37
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 5  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Код AS3:
import flash.display.Graphics;
import flash.geom.Point;
import flash.events.MouseEvent;
 
function drawTrapezium(drawTo:Graphics, points:Array, cornerRaduis:Number = 0):void {
	// top line
	var angle_0_1:Number = Math.atan2(points[1].y - points[0].y,points[1].x - points[0].x);
	var x1:Number = points[0].x + Math.cos(angle_0_1) * cornerRaduis;
	var y1:Number = points[0].y + Math.sin(angle_0_1) * cornerRaduis;
	var angle_1_0:Number = Math.atan2(points[0].y - points[1].y,points[0].x - points[1].x);
	var x2:Number = points[1].x + Math.cos(angle_1_0) * cornerRaduis;
	var y2:Number = points[1].y + Math.sin(angle_1_0) * cornerRaduis;
	//
	drawTo.moveTo(x1, y1);
	drawTo.lineTo(x2, y2);
 
	// right line
	var angle_1_2:Number = Math.atan2(points[2].y - points[1].y,points[2].x - points[1].x);
	var x3:Number = points[1].x + Math.cos(angle_1_2) * cornerRaduis;
	var y3:Number = points[1].y + Math.sin(angle_1_2) * cornerRaduis;
	var angle_2_1:Number = Math.atan2(points[1].y - points[2].y,points[1].x - points[2].x);
	var x4:Number = points[2].x + Math.cos(angle_2_1) * cornerRaduis;
	var y4:Number = points[2].y + Math.sin(angle_2_1) * cornerRaduis;
	//
	drawTo.curveTo(points[1].x, points[1].y, x3,y3);
	drawTo.lineTo(x4, y4);
 
	// bottom line
	var angle_2_3:Number = Math.atan2(points[3].y - points[2].y,points[3].x - points[2].x);
	var x5:Number = points[2].x + Math.cos(angle_2_3) * cornerRaduis;
	var y5:Number = points[2].y + Math.sin(angle_2_3) * cornerRaduis;
	var angle_3_2:Number = Math.atan2(points[2].y - points[3].y,points[2].x - points[3].x);
	var x6:Number = points[3].x + Math.cos(angle_3_2) * cornerRaduis;
	var y6:Number = points[3].y + Math.sin(angle_3_2) * cornerRaduis;
	//
	drawTo.curveTo(points[2].x, points[2].y, x5,y5);
	drawTo.lineTo(x6, y6);
 
	// left line
	var angle_3_4:Number = Math.atan2(points[0].y - points[3].y,points[0].x - points[3].x);
	var x7:Number = points[3].x + Math.cos(angle_3_4) * cornerRaduis;
	var y7:Number = points[3].y + Math.sin(angle_3_4) * cornerRaduis;
 
	var angle_4_3:Number = Math.atan2(points[3].y - points[0].y,points[3].x - points[0].x);
	var x8:Number = points[0].x + Math.cos(angle_4_3) * cornerRaduis;
	var y8:Number = points[0].y + Math.sin(angle_4_3) * cornerRaduis;
	//
	drawTo.curveTo(points[3].x, points[3].y, x7,y7);
	drawTo.lineTo(x8, y8);
	drawTo.curveTo(points[0].x, points[0].y, x1,y1);
}
 
var points:Array = [new Point(20,20),new Point(200,30),new Point(200,250),new Point(20,240)];
 
 
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
 
function mouseMoveHandler(e:MouseEvent):void{
	this.graphics.clear();
	this.graphics.lineStyle(1);
	points[2].x = stage.mouseX;
	points[2].y = stage.mouseY;
	drawTrapezium(this.graphics, points, 20);
}
 
mouseMoveHandler(null)
Уф разминка мозга по геометрии. Пользуйтесь.

Добавлено через 13 минут
Я не хотел выносить основные методы в отдельную вспомогательную функцию, но, в принципе, с таким же успехом можно сделать рисование n-угольника со скругленными краями.
__________________
hauts.ru

Старый 23.11.2012, 00:48
inozemcev вне форума Посмотреть профиль Отправить личное сообщение для inozemcev Найти все сообщения от inozemcev
  № 6  
Ответить с цитированием
inozemcev
[+ 1.0 08.10.14]
 
Аватар для inozemcev

блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
Роскошно, спасибо

Старый 23.11.2012, 11:26
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 7  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Минимум геометрии - рисуем многоугольник с кругленными краями:
Код AS3:
package {
	import flash.display.Graphics;
	import flash.display.GraphicsPathCommand;
	import flash.display.Sprite;
	import flash.geom.Point;
 
    public class Main extends Sprite
    {
 
        public function Main() {
			graphics.lineStyle(1);
			drawRoundPoly(graphics, [
				new Point(100, 100), new Point(250, 100), 
				new Point(300, 200), new Point(50, 200)
			], 20);
        }
 
		private function drawRoundPoly(graphics:Graphics, points:Array, radius:Number):void {
			if (!points || points.length < 3 || radius <= 0) {
				throw new Error("...");
			}
			var commands:Vector.<int> = Vector.<int>([GraphicsPathCommand.MOVE_TO]);
			var data:Vector.<Number> = new Vector.<Number>();
			var n:Vector.<Number> = new Vector.<Number>();
			var len:int = points.length;
			points.push(points[0], points[1]); // последняя точка - замыкает, и нам понадобится еще и вторая точка, для вычисления дуги
			for (var i:int = 0; i < len; i++) {
				commands.push(GraphicsPathCommand.LINE_TO, GraphicsPathCommand.CURVE_TO);
				n.push(radius / Point.distance(points[i], points[i + 1]));
			};
			n.push(n[0]);
			//move_to
			var p:Point = Point.interpolate(points[1], points[0], n[0]);
			data.push(p.x, p.y);
			for (i = 0; i < len; i++) {
				//line_to
				p = Point.interpolate(points[i], points[i + 1], n[i]);
				data.push(p.x, p.y);
				// curve_to
				p = Point.interpolate(points[i + 2], points[i + 1], n[i + 1]);
				data.push(points[i + 1].x, points[i + 1].y, p.x, p.y);
			}
 
			graphics.drawPath(commands, data);
			points.splice(len, 2);
		}
    }
}

Старый 23.11.2012, 12:41
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 8  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
zuxul, ваш способ хорош тем, что может рисовать произвольные многоугольники. Но в случае с четырехугольниками, он дольше работает, чем мой
__________________
hauts.ru

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

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


Последний раз редактировалось Wolsh; 23.11.2012 в 14:17.
Старый 23.11.2012, 14:06
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 10  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Цитата:
Я так понял, на радиус все дружно забили?
Именно так!
__________________
hauts.ru

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

Теги
трапеция graphics

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

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


 


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


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