![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Dec 2012
Адрес: Россия
Сообщений: 57
|
Всем доброго времени суток! Я по ходу изучения 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(); 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; } } }
__________________
Я слышу и забываю.Я вижу и запоминаю.Я делаю и понимаю. |
|
|||||
|
Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
|
Как-то так:
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(); } } } |
|
|||||
|
Регистрация: Mar 2007
Сообщений: 319
|
теорема пифагора ненужна, так как радиус вписанной в прямоугольник окружности - это половина ширины или высоты прямоугольника, и возведение в степень не ^, а Math.pow
|
|
|||||
|
Регистрация: Dec 2012
Адрес: Россия
Сообщений: 57
|
Спасибо большое! Блин, я бы даже не связывался с теоремой пифагора, если бы знал про такой замечательный метод как Point.distance ==)
Вот этим и решил проблему))) Спасибо большое! Тема закрыта!
__________________
Я слышу и забываю.Я вижу и запоминаю.Я делаю и понимаю. |
|
|||||
|
Цитата:
Цитата:
Запоминайте сразу по конвенциям. |
|
|||||
|
Все намного проще и удобнее делается, не нужно ничего из того, что вы описали. Рисуешь линию да и только от точки до точки - вот тебе и радиус. После того как мышь отпускаешь - обычным drawCirlce рисуешь круг на основе полученного радиуса - и красиво и удобно
__________________
Марк Tween |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:42. |
|
|
« Предыдущая тема | Следующая тема » |
|
|