頂点をドラッグ可能。
辺の距離と面積を表示。
ヘロンの公式(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)