EmEditorみんなでまとめサイト

Spiralマクロ

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集
マクロ
選択文字列を渦巻状に整形する。 2ちゃんねるの書き込みより。 悪用厳禁。

function Spiral(dr, reverseY) {
    this.dr = dr;
    this.reverseY = reverseY;
}
Spiral.prototype.setAngle = function(angle) {this.angle = angle}
Spiral.prototype.r = function(angle) {return this.dr * angle / (2 * Math.PI);}
Spiral.prototype.x = function(angle) {
    return this.r(angle) * Math.cos(angle);
}
Spiral.prototype.y = function(angle) {
    var reg = this.reverseY ? -1 : 1;
    return this.r(angle) * Math.sin(angle) * reg;
}
Spiral.prototype.angleAtLength = function(l) {
    return Math.sqrt(4 * Math.PI * l / this.dr);
}
//冒頭の例はdr=3, pitch=2, reverse=true, ratio=1.5
var dr = 3; //1周あたりの半径の変化量
var pitch = 2; //文字同士の間隔
var reverseY = true; //Y軸方向を反転するか否か
var ratio = 1.5; //横/縦の比率(1より大きいと横長)
       
var sp = new Spiral(dr, reverseY);
       
document.selection.SelectLine();
document.selection.Text = getSpiralString(document.selection.Text, sp, pitch, ratio);
       
function getSpiralString(str, spiral, pitch, ratio) {
    str = str.replace(/\r|\n/g, "");
    var lineCount = Math.floor(spiral.r(spiral.angleAtLength(str.length * pitch)) * 2) + 2;
    var lineLength = Math.floor(lineCount * ratio);
    var centerX = Math.floor(lineLength / 2);
    var centerY = Math.floor(lineCount / 2);

    var lines = new Array(lineCount);
    for(var i = 0; i < lineCount; i++) {
        lines[i] = "";
        for(var j = 0; j < lineLength; j++) {lines[i] += " " ;}
    }
    var adjuster = 1; //0から始めるとちょっと汚いので、調整用に。
    for(var i = 0; i < str.length; i++) {
        var angle = spiral.angleAtLength(i * pitch + adjuster);
        var x = Math.round(spiral.x(angle) * ratio) + centerX;
        var y = Math.round(spiral.y(angle)) + centerY;
        lines[y] = lines[y].substring(0, x - 1) + str.charAt(i) + lines[y].substring(x);
    }
    var ret = ""
    for(var i = 0; i < lineCount; i++) {
        ret += lines[i] + "\n";
    }
    ret = ret.replace(/^( +\n)*/, "");
    ret = ret.replace(/\n( +\n)*$/, "");
    return ret + "\n";
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

目安箱バナー