【Processing】Processingメモ

Windowを作成・表示する

size(幅, 高さ);

線を引く

line(開始点x座標, 開始点y座標, 終点x座標, 終点y座標);

長方形(矩形)を描く

rect(左上x座標, 左上y座標, 幅, 高さ);
//または
quad(第1点x座標, 第1点y座標, 第2点x座標, 第2点y座標, 第3点x座標, 第3点y座標, 第4点x座標, 第4点y座標);

楕円形を描く

ellipse(中心x座標, 中心y座標, 幅, 高さ);

円弧を描く

arc(中心x座標, 中心y座標, 幅, 高さ, 開始角度[ラジアン]、終了角度[ラジアン]);

ラジアンは中心点から右側水平が0で時計回りに増加。最大値は2π

三角形を描く

triangle(第1点x座標, 第1点y座標, 第2点x座標, 第2点y座標, 第3点x座標, 第3点y座標);

塗り潰し(開始)

fill(#000000~#FFFFFF);		//前2桁:赤、真中2桁:緑、後ろ2桁:青
//または
fill(赤,緑,青);				//各値の範囲は0~255

塗り潰し(停止)

noFill();

線の色を指定

stroke(#000000~#FFFFFF);		//前2桁:赤、真中2桁:緑、後ろ2桁:青
//または
stroke(赤,緑,青);				//各値の範囲は0~255

線を描画しない

noStroke();

背景色を指定する

background(#000000~#FFFFFF);		//前2桁:赤、真中2桁:緑、後ろ2桁:青
//または
background(赤,緑,青);				//各値の範囲は0~255

backgroundを最後に指定するとそれまでに描画した図形がすべて塗り潰されてしまうので注意すること


【C#】デリゲートの処理イメージ

下記のようにデリゲートを宣言したとします。

public delegate void MyProcess(string msg);

また、実際の処理を行う関数をMyClassのRealProcessというメソッドに実装したとします。

public class MyClass
{
    public void RealProcess(string msg)
    {
        MessageBox.Show(msg);
    }
}

それらをボタンクリックで次のようにして使用したとします。

private void button3_Click(object sender, EventArgs e)
{
    var myCls = new MyClass();
    var process = new MyProcess(myCls.RealProcess);
    process("あいうえお");
}

上記は、『process(“あいうえお”);』という場所でMyClassのRealProcessメソッドが処理されます。

【上記処理の内部動作イメージ】

デリゲートの宣言、『public delegate void MyProcess(string msg);』は、下記のクラスを作ることになるようです。

public class MyProcess : System.MulticastDelegate
{
    private Object _target;
    private IntPtr _methodPtr;

    public MyProcess(Object obj, IntPtr method)
    {
        this._target = obj;
        this._methodPtr = method;
    }

    public overide void Invoke(string msg)
    {
        _targetインスタンスの_methodPtrが示す関数を呼び出す処理
    }
}

ボタンクリック時のコードの中で『var process = new MyProcess(myCls.RealProcess);』と書いてMyClassのRealProcessメソッドと関連付けました。
これは、下記のコードを書いたイメージになるようです・

var process = new MyProcess(myClass,RealProcessメソッドへのポインタ);

また、『process(“あいうえお”);』というコードは下記のコードを書いたことになるようです。

process.Invoke("あいうえお");

内部的な処理の概要を知るまで、JavaScriptのように関数を変数に代入して使うやり方と混ざり合っていまいち理解できていませんでしたが、やっと頭の中が整理できました。


【C#】JANコード13桁タイプのチェックデジットを算出する関数

/// <summary>
/// JANコード13桁タイプのチェックディジットを算出する
/// </summary>
/// <param name="code">JANコード</param>
/// <returns></returns>
private int calcJAN13CheckDigit(string code)
{
    if (!Regex.IsMatch(code, @"^[0-9]{12,13}$"))
    {
        throw new Exception("対象のJANコードが数字12桁または数字13桁になっていません。");
    }

    //先頭12桁を取得
    var val = code.Substring(0, 12);

    //① 偶数桁合計を求める
    int gusuGokei = val.Where((c, index) =>
            index % 2 == 1).Select(c =>
                int.Parse(c.ToString())).Sum();
    //② 奇数桁合計を求める
    int kisuGokei = val.Where((c, index) =>
            index % 2 == 0).Select(c =>
                int.Parse(c.ToString())).Sum();
    //③ 『偶数桁合計×3+奇数桁合計』を算出する
    int gokei = gusuGokei * 3 + kisuGokei;
    //④ ③で算出した値の1の位を取得する
    int subVal = gokei % 10;
    //⑤ チェックデジットは『10から④で取得した値を引いた結果の1の位』
    int digit = (10 - subVal) % 10;

    return digit;
}

【C#】WinFormsの印刷プレビュー(GDI)

下記を参照設定に追加する必要があります

  • System.Drawing

private void button1_Click(object sender, EventArgs e)
{
    var printDoc = new PrintDocument();
    printDoc.DocumentName = "線の印刷サンプル";
    printDoc.PrintPage += PrintDoc_PrintPage;

    PrintPreviewDialog previewDialog = new PrintPreviewDialog();
    previewDialog.Height = 600;
    previewDialog.Width = 800;
    previewDialog.Document = printDoc;
    previewDialog.Show(this);
}

private void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    e.Graphics.PageUnit = GraphicsUnit.Millimeter;
    var pen = new Pen(System.Drawing.Color.Black, 1);
    e.Graphics.DrawLine(pen, new Point(20, 20), new Point(180, 20));
}

【C#】WPFで印刷プレビュー(XPS)

前回『ミリメートル指定で線を印刷してみる』で作成した印刷ドキュメントを、プレビュー画面で表示するようにしてみました。

下記を参照設定に追加する必要があります

  • System.Printing

  • ReachFramework

private void btnPreviewXPS_Click(object sender, RoutedEventArgs e)
{
    try
    {
        //1インチをミリメートルに換算した値
        const double MmPerInch = 25.40;
        //FixedPageの解像度
        const double DPI = 96;

        var canvas = new Canvas();

        //線を作成する
        var line = new Line();
        line.Stroke = Brushes.Black;

        //ピクセルで太さ、始点、終点を指定
        //※ Pixel = ミリメートル ÷ インチへの換算係数 × 解像度
        line.StrokeThickness = 1 / MmPerInch * DPI;
        line.X1 = 20 / MmPerInch * DPI;
        line.Y1 = 20 / MmPerInch * DPI;
        line.X2 = 180 / MmPerInch * DPI;
        line.Y2 = 20 / MmPerInch * DPI;

        //作成した線をキャンバスに追加
        canvas.Children.Add(line);

        //印刷ドキュメントにキャンバスを追加
        FixedPage page = new FixedPage();
        page.Children.Add(canvas);
        PageContent content = new PageContent();
        content.Child = page;
        FixedDocument doc = new FixedDocument();
        doc.Pages.Add(content);

        //ドキュメントビューアコントロールを作成
        var viewer = new DocumentViewer();
        viewer.HorizontalAlignment = HorizontalAlignment.Left;
        viewer.VerticalAlignment = VerticalAlignment.Top;
        viewer.Margin = new Thickness(0, 0, 0, 0);
        viewer.Document = doc;

        //プレビュー用のウインドウを作成
        var previewWindow = new Window();
        previewWindow.Owner = this;
        previewWindow.Height = 600;
        previewWindow.Width = 800;

        //プレビュー用ウインドウにドキュメントビューアをセット
        previewWindow.Content = viewer;

        //プレビュー画面を表示
        previewWindow.ShowDialog();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}