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

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

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

Регистрация: Dec 2012
Адрес: Россия
Сообщений: 57
Question Програмное рисование окружности

Всем доброго времени суток! Я по ходу изучения AS3, делаю мини программки для закрепления прочитанного!
Вот решил создать графический редактор! Пока осуществил только рисование квадрата, а вот с рисованием окружности столкнулся с проблемой. Задача в том: Пользователь нажимает на мышь и растягивая её создает окружность которое не заходит за границы там где он нажал на мышь и там где он её отпустил! вот код:
Код AS3:
/* 
test_gr - shape
test_start - point | координаты там где пользователь  начал создание окружности
test_start - point | координаты там где пользователь  закончил создание окружности
*/
var ha_x:Number = test_start.x + ((test_finish.x - test_start.x)/2);// это середина по линии x
var ha_y:Number = test_start.y + ((test_finish.y - test_start.y)/2);//это середина по линии y
// далее теорема пифагора! я попытался узнать радиус окружности
var ha_w:Number = Math.sqrt((test_finish.x - ha_x)^2+(test_finish.y - ha_y)^2);		
test_gr.graphics.drawCircle(ha_x, ha_y, ha_w); 
test_gr.graphics.endFill();
Но радиус не получается. Подскажите решение проблемы. Или может есть решение попроще. Если я что либо не уточнил, или забыл сообщить, то извините и спрашивайте я объясню! Вот на всякий случай полный код программки но без комментарий:
Код AS3:
package
{
	import TestFile;
 
	import flash.display.Loader;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.*;
	import flash.geom.Point;
 
	public class oneProject extends Sprite
	{
		private var foc_MouseDown_B:Boolean = new Boolean(false);
		private var foc_MouseUp_B:Boolean = new Boolean(true);
		private var foc_Start_B:Boolean = new Boolean(false);
		private var foc_Finish_B:Boolean = new Boolean(true);
 
 
		private var _StartGraphics_P:Point = new Point();
		private var _FinishGraphics_P:Point = new Point();
 
		private var _Method_S:String = new String("RECT");
 
		private var _Panel_SPR:Sprite = new Sprite();
		private var pan_Panel_SPR:Sprite = new Sprite();
		private var pan_Graph_SPR:Sprite = new Sprite();		
		private var pan_pan_Method_SH:Sprite = new Sprite();
		private var test_gr:Shape = new Shape();
		private var _GRAPHICS_AS:TestFile = new TestFile();
		public function oneProject()
		{
				func_OneStart();
		}
		public function func_OneStart():void{
			addChild(_Panel_SPR);
			_Panel_SPR.addChild(pan_Panel_SPR);
			_Panel_SPR.addChild(pan_Graph_SPR);
			pan_Panel_SPR.addChild(pan_pan_Method_SH);
			pan_Graph_SPR.graphics.lineStyle(4,0x020202,1,true);
			pan_Graph_SPR.graphics.beginFill(0xEEEEEE, 1);
			pan_Graph_SPR.graphics.drawRect(30, 30, 1110, 600);
			pan_Graph_SPR.graphics.endFill();
			pan_Panel_SPR.graphics.lineStyle(4,0x121212,1,true);
			pan_Panel_SPR.graphics.beginFill(0xAFBECD, 1);
			pan_Panel_SPR.graphics.drawRect(30, 0, 1110, 30);
			pan_Panel_SPR.graphics.endFill();
			pan_Panel_SPR.graphics.moveTo(70, 0);
			pan_Panel_SPR.graphics.lineTo(70,30);
			pan_Panel_SPR.graphics.endFill();
 
			var el_Rect:Sprite = new Sprite();
			el_Rect = func_element_panel(1);
			el_Rect.x = 40;
			el_Rect.y = 5;
			el_Rect.name = "RECT";
 
			var el_Circle:Sprite = new Sprite();
			el_Circle = func_element_panel(2);
			el_Circle.x = 85;
			el_Circle.y = 15;
			el_Circle.name = "CIRCLE";			
 
			addChild(el_Circle);
			addChild(el_Rect);
			el_Circle.addEventListener(MouseEvent.CLICK, func_element_click);
			el_Rect.addEventListener(MouseEvent.CLICK, func_element_click);
 
			pan_Graph_SPR.addEventListener(MouseEvent.MOUSE_DOWN, func_graphics_on);
			pan_Graph_SPR.addEventListener(MouseEvent.MOUSE_UP, func_graphics_of);
			pan_Graph_SPR.addEventListener(MouseEvent.MOUSE_MOVE, func_graphics_proc);
		}
		public function func_test(test_start:Point, test_finish:Point):void{
			test_gr.graphics.clear();
			test_gr.graphics.lineStyle(1, 0x000000, 1, true);
			test_gr.graphics.beginFill(0xFF0000, 1);
			var width:Number = new Number(test_finish.x - test_start.x);
			var height:Number = new Number(test_finish.y - test_start.y);
			switch(_Method_S){
				case "RECT" :
					test_gr.graphics.drawRect(test_start.x, test_start.y, width, height);
					test_gr.graphics.endFill();
				break;
				case "CIRCLE" :
					var ha_x:Number = test_start.x + ((test_finish.x - test_start.x)/2);
					var ha_y:Number = test_start.y + ((test_finish.y - test_start.y)/2);
					var ha_w:Number = Math.sqrt((test_finish.x - ha_x)^2+(test_finish.y - ha_y)^2);
					trace("     - " + Math.sqrt(5));
					test_gr.graphics.drawCircle(ha_x, ha_y, ha_w);
					test_gr.graphics.endFill();
				break;
			}
 
		}
		public function func_graphics_proc(e:MouseEvent):void{
			if(foc_Start_B == true){
				switch(_Method_S){
					case "RECT" :
						_FinishGraphics_P = new Point(e.localX, e.localY);
						trace(_StartGraphics_P.x + " | " + _StartGraphics_P.y)
						func_test(_StartGraphics_P, _FinishGraphics_P);
					break;
					case "CIRCLE" :
						_FinishGraphics_P = new Point(e.localX, e.localY);
						trace(_StartGraphics_P.x + " | " + _StartGraphics_P.y)
						func_test(_StartGraphics_P, _FinishGraphics_P);
					break;
				}
			}	
		}
		public function func_graphics_on(e:MouseEvent):void{
			switch(_Method_S){
				case "RECT" :
					foc_MouseDown_B = true;
					foc_MouseUp_B = false;
					foc_Start_B = true;
					foc_Finish_B = false;
					_StartGraphics_P = new Point(e.localX, e.localY);
					trace(_StartGraphics_P.x + " | " + _StartGraphics_P.y)
					pan_Graph_SPR.addChild(test_gr);
				break;
				case "CIRCLE" :
					foc_MouseDown_B = true;
					foc_MouseUp_B = false;
					foc_Start_B = true;
					foc_Finish_B = false;
					_StartGraphics_P = new Point(e.localX, e.localY);
					trace(_StartGraphics_P.x + " | " + _StartGraphics_P.y)
					pan_Graph_SPR.addChild(test_gr);
				break;
			}		
		}
		public function func_graphics_of(e:MouseEvent):void{
			if(foc_Start_B = true){
				switch(_Method_S){
					case "RECT" :
						foc_MouseDown_B = false;
						foc_MouseUp_B = true;
						foc_Start_B = false;
						foc_Finish_B = true;
						_FinishGraphics_P = new Point(e.localX, e.localY);
						trace(_StartGraphics_P.x + " | " + _StartGraphics_P.y)
					break;
					case "CIRCLE" :
						foc_MouseDown_B = false;
						foc_MouseUp_B = true;
						foc_Start_B = false;
						foc_Finish_B = true;
						_FinishGraphics_P = new Point(e.localX, e.localY);
						trace(_StartGraphics_P.x + " | " + _StartGraphics_P.y)
					break;
				}
			}
		}
		public function func_element_click(e:MouseEvent):void{
			_Method_S = e.target.name;
		}
		public function func_element_panel(ff_ind:uint):Sprite{
			var f_shape:Sprite = new Sprite();
			switch (ff_ind){
				case 1:
				f_shape.graphics.lineStyle(1,0x000000,0.7,true);
				f_shape.graphics.beginFill(0xF44100, 1);
				f_shape.graphics.drawRect(0,0,20,20);
				f_shape.graphics.endFill();
				break;
				case 2:
					f_shape.graphics.lineStyle(1,0x000000,0.7,true);
					f_shape.graphics.beginFill(0xF44100, 1);
					f_shape.graphics.drawCircle(0,0,10);
					f_shape.graphics.endFill();
				break;
			}
			return f_shape;
		}
	}
}
Заранее очень Вам блогадарен!
__________________
Я слышу и забываю.Я вижу и запоминаю.Я делаю и понимаю.

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

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
Как-то так:
Код AS3:
package {
 
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
 
	public class Main extends Sprite {
 
		private var circleShape:Shape;
 
		public function Main():void {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			circleShape = new Shape();
			addChild(circleShape);
 
			stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseEvent);
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseEvent);
		}
 
		private function onMouseEvent(e:MouseEvent):void {
			if (e.type == MouseEvent.MOUSE_DOWN) {
				circleShape.x = mouseX;
				circleShape.y = mouseY;
				addEventListener(Event.ENTER_FRAME, onEnterFrame);
			} else {
				removeEventListener(Event.ENTER_FRAME, onEnterFrame);
			}
		}
 
		private function onEnterFrame(e:Event):void {
			var radius:Number = Point.distance(new Point(circleShape.x, circleShape.y), new Point(mouseX, mouseY));
 
			circleShape.graphics.clear();
			circleShape.graphics.lineStyle(2, 0x808000);
			circleShape.graphics.beginFill(0x0, .1);
			circleShape.graphics.drawCircle(0, 0, radius);
			circleShape.graphics.endFill();
		}
 
	}
}

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

Регистрация: Mar 2007
Сообщений: 319
Код AS3:
var radius:Number = Math.max(test_finish.x - test_start.x, test_finish.y - test_start.y) * .5;
test_gr.graphics.drawCircle(test_start.x + radius, test_start.y + radius, radius);
test_gr.graphics.endFill();
теорема пифагора ненужна, так как радиус вписанной в прямоугольник окружности - это половина ширины или высоты прямоугольника, и возведение в степень не ^, а Math.pow

Старый 20.03.2013, 00:19
zomkoner вне форума Посмотреть профиль Отправить личное сообщение для zomkoner Посетить домашнюю страницу zomkoner Найти все сообщения от zomkoner
  № 4  
Ответить с цитированием
zomkoner
 
Аватар для zomkoner

Регистрация: Dec 2012
Адрес: Россия
Сообщений: 57
Спасибо большое! Блин, я бы даже не связывался с теоремой пифагора, если бы знал про такой замечательный метод как Point.distance ==)
Код AS3:
var ha_w:Number = Point.distance(new Point(test_finish.x, test_finish.y),new Point(ha_x, ha_y));
Вот этим и решил проблему))) Спасибо большое! Тема закрыта!
__________________
Я слышу и забываю.Я вижу и запоминаю.Я делаю и понимаю.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от zomkoner Посмотреть сообщение
Спасибо большое! Блин, я бы даже не связывался с теоремой пифагора, если бы знал про такой замечательный метод как Point.distance ==)
Код AS3:
var ha_w:Number = Point.distance(new Point(test_finish.x, test_finish.y),new Point(ha_x, ha_y));
Вот этим и решил проблему))) Спасибо большое! Тема закрыта!
Ну, метод Point.distance() использует ту же теорему.
Цитата:
делаю мини программки для закрепления прочитанного!
Тогда не надо сразу закреплять неправильное именование переменных и методов.
Запоминайте сразу по конвенциям.

Старый 20.03.2013, 00:35
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
Ответить с цитированием
in4core
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Все намного проще и удобнее делается, не нужно ничего из того, что вы описали. Рисуешь линию да и только от точки до точки - вот тебе и радиус. После того как мышь отпускаешь - обычным drawCirlce рисуешь круг на основе полученного радиуса - и красиво и удобно
__________________
Марк Tween

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

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

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


 


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


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