Всем доброго времени суток! Я по ходу изучения AS3, делаю мини программки для закрепления прочитанного!
Вот решил создать графический редактор! Пока осуществил только рисование квадрата, а вот с рисованием окружности столкнулся с проблемой. Задача в том: Пользователь нажимает на мышь и растягивая её создает окружность которое не заходит за границы там где он нажал на мышь и там где он её отпустил! вот код:
Но радиус не получается. Подскажите решение проблемы. Или может есть решение попроще. Если я что либо не уточнил, или забыл сообщить, то извините и спрашивайте я объясню! Вот на всякий случай полный код программки но без комментарий:

Код 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;
}
}
}