頂点をドラッグ可能。
辺の距離と面積を表示。

ヘロンの公式(Heron's formula)は、Heron's formula - Wikipedia, the free encyclopedia を参考にした。

以下、ソースコード。

HeronsFormulaCanvas.as


package {
 
  import flash.display.*;
  import flash.events.*;
  import flash.text.*;
  import flash.utils.*;
  
  public class HeronsFormulaCanvas extends Sprite {
 
    private var vertex:Array = new Array(3);
    private var   line:Array = new Array(3);
    private var   area:ComputedArea;
 
    public function HeronsFormulaCanvas() {
 
      this.vertex[0] = new DraggableVertex(this, 60, 60);
      this.vertex[1] = new DraggableVertex(this, 180, 120);
      this.vertex[2] = new DraggableVertex(this, 120, 180);
 
      this.line[0] = new ComputedLine(vertex[0], vertex[1]);
      this.line[1] = new ComputedLine(vertex[1], vertex[2]);
      this.line[2] = new ComputedLine(vertex[2], vertex[0]);
 
      // 高階関数(関数を引数にとる関数)を使う。
      doLines(addChild);
      doVertices(addChild);
      doLines(updateLine);
      doVertices(updateVertex);
 
      area = new ComputedArea(line);
      addChild(area);
    }
 
    public function update():void{
      doLines(updateLine);
      doVertices(updateVertex);
      area.update();
    }
 
    private function updateLine(x:ComputedLine):void{
      x.update();
    }
 
    private function updateVertex(x:DraggableVertex):void{
      x.update();
    }
 
    // ComputedLine を処理する高階関数 (higher-order function)
    public function doLines(f:Function):void{
      var i:int;
      for(i=0; i

DraggableVertex.as


package {
 
  import flash.display.*;
  import flash.events.*;
 
  public class DraggableVertex extends Sprite{
 
    //private var _x:Number;
    //private var _y:Number;
 
    private var canvas:HeronsFormulaCanvas;
 
    public function DraggableVertex(canvas:HeronsFormulaCanvas, x:Number, y:Number){
 
      this.canvas = canvas;
 
      // 親 DisplayObjectContainer のローカル座標を基準にした
      // DisplayObject インスタンスの xy 座標
      this.x = x;
      this.y = y;
 
      addEventListener(MouseEvent.MOUSE_DOWN, mousedown);
      addEventListener(MouseEvent.MOUSE_UP,   mouseup);
 
      // ゆっくりドラッグしないとついてこないバージョン用
      //addEventListener(MouseEvent.MOUSE_OUT,  mouseout);
    }
 
    private function mousedown(evt:MouseEvent):void {
 
      // マウスで操作しやすいように、z順序の一番上に移動
      canvas.removeChild(this);
      canvas.addChild(this);
 
      addEventListener(MouseEvent.MOUSE_MOVE, mousemove);
      startDrag();
    }
 
    private function mouseup(evt:MouseEvent):void {
      removeEventListener(MouseEvent.MOUSE_MOVE, mousemove);
      stopDrag();
      canvas.update();
    }
 
    // ゆっくりドラッグしないとついてこないバージョン用
    //private function mouseout(evt:MouseEvent):void {
    //  removeEventListener(MouseEvent.MOUSE_MOVE, mousemove);
    //  stopDrag();
    //  canvas.update();
    //}
 
    private function mousemove(evt:MouseEvent):void {
      canvas.update();
      evt.updateAfterEvent();
    }
 
    public function update():void{
      graphics.clear();
      graphics.lineStyle(1.0, 0xFF0000);
      graphics.beginFill(0x00FF00);
       //graphics.moveTo(x, y);
      //graphics.drawCircle(posx, posy, 5.0);
      graphics.drawCircle(0, 0, 5.0);
      graphics.endFill();
    }
 
  }

}

ComputedLine.as


package {
 
  import flash.display.*;
  import flash.text.*;
 
    public class ComputedLine extends Sprite{
 
    public var begin:DraggableVertex;
    public var   end:DraggableVertex;
 
    private var  distanceText:TextField;
 
    public function ComputedLine(begin:DraggableVertex, end:DraggableVertex){
 
      this.begin = begin;
      this.end   = end;
 
      // 親 DisplayObjectContainer のローカル座標を基準にした
      // DisplayObject インスタンスの xy 座標
      this.x = begin.x;
      this.y = begin.y;
 
      // 点と点の距離
      distanceText = createDistanceText();
      updateDistanceText();
      addChild(distanceText);
    }
 
    public function update():void{
      this.x = this.begin.x;
      this.y = this.begin.y;
      graphics.clear();
      // drawing line
      graphics.lineStyle(2.0, 0x0000FF);
       graphics.moveTo(0, 0);
      graphics.lineTo(end.x - begin.x, end.y - begin.y);
      // displaying distance
      updateDistanceText();
    }
 
    private function updateDistanceText():void{
      distanceText.text = getDistance().toString();
      distanceText.x = (end.x - begin.x) / 2 - distanceText.width  / 2;
      distanceText.y = (end.y - begin.y) / 2 - distanceText.height / 2;
    }
 
    private static function createDistanceText():TextField{
 
      // 表示メッセージのスタイル
      var format:TextFormat = new TextFormat();
      format.bold = false;
      format.italic = false;
      format.size = 10;
      format.underline = false;
      format.font = "_等幅";
 
      // 表示メッセージ
      var text:TextField = new TextField();
      text.autoSize = TextFieldAutoSize.LEFT;
      text.selectable = false;
      text.setTextFormat(format);
 
      return text;
    }
 
    public function getDistance():Number{
      return Math.sqrt(
        Math.pow(end.x - begin.x, 2) +
        Math.pow(end.y - begin.y, 2));
    }
 
  }
 
}

ComputedArea.as


package {
 
  import flash.display.*;
  import flash.text.*;
 
    public class ComputedArea extends Sprite {
 
    private var line:Array;
    private var areaText:TextField;
 
    public function ComputedArea(line:Array){
 
      this.line = line;
 
      // 点と点の距離
      areaText = createText();
      addChild(areaText);
      update();
    }
 
    public function update():void{
      areaText.text = "area : " + getArea().toString();
    }
 
    private static function createText():TextField{
 
      // 表示メッセージのスタイル
      var format:TextFormat = new TextFormat();
      format.bold = false;
      format.italic = false;
      format.size = 10;
      format.underline = false;
      format.font = "_等幅";
 
      // 表示メッセージ
      var text:TextField = new TextField();
      text.autoSize = TextFieldAutoSize.LEFT;
      text.selectable = false;
      text.setTextFormat(format);
 
      return text;
    }
 
    private function getArea():Number{
      // ヘロンの公式(Heron's formula)で面積を計算
      // Ref. - Heron's formula - Wikipedia, the free encyclopedia
      //        http://en.wikipedia.org/wiki/Heron%27s_formula
      var a:Number = line[0].getDistance();
      var b:Number = line[1].getDistance();
      var c:Number = line[2].getDistance();
      var s:Number = (a + b + c) / 2;
      var ss:Number = Math.sqrt(s * (s - a) * (s - b) * (s - c));
      return ss;
    }
 
  }
 
}

コンパイルオプション


mxmlc -default-size 240 240 -default-frame-rate 30 -default-background-color 0xFFFFFF HeronsFormulaCanvas.as

tags: zlashdot Flash Flash Flex

Posted by NI-Lab. (@nilab)