Да, поднакосячил маленько, еще оказалось что atan2(y, x), а подсказка во FlashBulder сказала x, y :(
Плюс в скалярном произведении идексы попутал (по определению (x0, y0) * (x1, y1) == x0 * x1 + y0 * y1).
Исправленное и дополненное:
Код AS3:
package
{
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
public class Main extends Sprite {
private static const WIDTH:int = 800;
private static const HEIGHT:int = 600;
private var tfAngle:TextField;
private var marker1:Marker;
private var marker2:Marker;
private var point0:Point;
private var save1:Point;
private var save2:Point;
private var angle:Number;
public function Main() {
point0 = new Point(200, 200);
drawPoint0();
tfAngle = new TextField();
tfAngle.autoSize = TextFieldAutoSize.LEFT;
addChild(tfAngle);
addChild(marker1 = new Marker());
addChild(marker2 = new Marker());
marker1.setPosition(point0);
marker2.setPosition(point0);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private function drawPoint0():void
{
var g:Graphics = graphics;
g.lineStyle(0, 0x000000);
g.moveTo(0, point0.y);
g.lineTo(WIDTH, point0.y);
g.moveTo(point0.x, 0);
g.lineTo(point0.x, HEIGHT);
}
private function onMouseDown(event:MouseEvent):void {
marker1.x = mouseX;
marker1.y = mouseY;
marker2.x = mouseX;
marker2.y = mouseY;
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
private function onMouseUp(event:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
updateAngle();
}
private function onMouseMove(event:MouseEvent):void {
updateAngle();
}
private function updateAngle():void {
marker2.x = mouseX;
marker2.y = mouseY;
var g:Graphics = graphics;
g.clear();
drawPoint0();
g.lineStyle(0, 0xff0000);
g.moveTo(point0.x, point0.y);
g.lineTo(marker1.x, marker1.y);
g.moveTo(point0.x, point0.y);
g.lineTo(marker2.x, marker2.y);
var angle:Number = angleBetwin2Vectors(point0, new Point(marker1.x, marker1.y), new Point(marker2.x, marker2.y));
tfAngle.text = "Последний посчитанный угол: " + angle + " градусов";
}
private function angleBetwin2Vectors(p0:Point, p1:Point, p2:Point):Number {
var p01:Point = p1.clone().subtract(p0);//01 - значит вектор от точки 0 к точке 1
var p02:Point = p2.clone().subtract(p0);
var modul01:Number = p01.length;
var modul02:Number = p02.length;
var a:Number = Math.atan2(
(p01.x * p02.y - p02.x * p01.y) / (modul01 * modul02),
(p01.x * p02.x + p01.y * p02.y) / (modul01 * modul02)
);
return a * 180 / Math.PI;
}
}
}
import flash.display.Sprite;
import flash.geom.Point;
// Только рисует квадратик - ничего больше
class Marker extends Sprite
{
public function Marker()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(-5,-5,10,10);
}
public function setPosition(point:Point):void
{
x = point.x;
y = point.y;
}
}
|