Graphical Sequence
A sequence that generates a corresponding graph
sequence: n_1 n_2 ... n_k
graph: vertex j have n_j edges (1 <= j <= k)
(from The Art of Computer Programming Vol. 4A)
♥0 |
Line 93 |
Modified 2015-07-18 21:20:25 |
MIT License
archived:2017-03-20 13:52:40
ActionScript3 source code
/**
* Copyright wrotenodoc ( http://wonderfl.net/user/wrotenodoc )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/n8s9
*/
package {
import flash.display.Sprite
import flash.display.Graphics
import flash.text.TextField
import flash.text.TextFormat
public class FlashTest extends Sprite {
private var _sequence:Array
private var _tableau:Array
private var _debug:TextField
private var _canvas:Sprite
public function FlashTest() {
// data
var seq:Array = [8, 6, 6, 4, 4, 4, 4, 4, 4]
var i:int = -1
// init
_sequence = seq.concat()
_tableau = []
for(i=0; i<_sequence.length; i++){
_tableau[i] = new Array(_sequence[i])
for(var j:int=0; j<_sequence[i]; j++){
_tableau[i][j] = -1
}
}
// fill the tableau
var x:int
for(i=_sequence.length-1; i>0; i--){
while(_sequence[i] > 0){
x = pick(i)
push(i, x)
}
}
output(seq)
}
private function pick(i:int):int {
lbl : for(var j:int=0; j<i-1; j++){
for(var k:int=0; k<_tableau[j].length; k++){
if(_tableau[j][k] == i+1) continue lbl
}
if(_sequence[j] > _sequence[j+1]){
return j
}
}
return i-1
}
private function push(x:int, y:int):void {
_sequence[x] -= 1
_sequence[y] -= 1
_tableau[x][_sequence[x]] = y + 1
_tableau[y][_sequence[y]] = x + 1
}
private function output(input:Array):void {
var i:int, j:int
// print the tableau
var result:String = "sequence: " + input.join(" ") + "\n\n"
for(i=0; i<_tableau.length; i++) result += (i+1) + " | " + _tableau[i].join(" ") + "\n"
with(addChild(_debug = new TextField)){
text = result
autoSize = "left"
}
// render the tableau
var centerX:Number = stage.stageWidth / 2
var centerY:Number = stage.stageHeight / 2
var angle:Number
var x1:Number, y1:Number, x2:Number, y2:Number
addChild(_canvas = new Sprite)
var g:Graphics = _canvas.graphics
// render edges
g.lineStyle(1, 0x0)
for(i=0; i<_tableau.length; i++){
angle = Math.PI*2 * i/_tableau.length
x1 = centerX + 100 * Math.cos(angle)
y1 = centerY + 100 * Math.sin(angle)
for(j=0; j<_tableau[i].length; j++){
angle = Math.PI*2 * (_tableau[i][j]-1)/_tableau.length
x2 = centerX + 100 * Math.cos(angle)
y2 = centerY + 100 * Math.sin(angle)
g.moveTo(x1, y1)
g.lineTo(x2, y2)
}
}
g.lineStyle()
// render vertices
g.beginFill(0x6699cc)
for(i=0; i<_tableau.length; i++){
angle = Math.PI*2 * i/_tableau.length
x1 = centerX + 100 * Math.cos(angle)
y1 = centerY + 100 * Math.sin(angle)
g.drawCircle(x1, y1, 20)
var lbl:TextField = new TextField
lbl.autoSize = "center"
lbl.defaultTextFormat = new TextFormat(null, 16)
lbl.text = (i+1).toString()
lbl.x = x1 - lbl.width/2
lbl.y = y1 - lbl.height/2
_canvas.addChild(lbl)
}
g.endFill()
}
}
}