方眼紙

テキストづくりで方眼紙の画像が必要になったので、訓練兼ねてプログラミングで作ってみた。

def setup():
    size(600,600)
    background(255)

    borderColor = color(200)
    borderColorBold = color(0)
    
    fontSize = 10
    # fontName = u"M PLUS 1  Code Regular"
    fontName = u"HiraMaruPro-W4"

    lineHeight = fontSize + 2
    maxX = 500
    maxY = 500
    stepX = 10
    stepY = 10
    labelStepX = 50
    labelStepY = 50
    labelOffset = -5
    margin = 50

    # フォントの設定
    font = createFont(fontName, fontSize, False)
    textFont(font)
    
    # 余白分ずらす
    translate(margin, margin)

    # 罫線
    stroke(borderColor)
    for x in range(0, maxX+1, stepX):
        line(x, 0, x, maxY)
    for y in range(0, maxY+1, stepY):
        line(0, y, maxX, y)

    # 罫線(太)
    stroke(borderColorBold)
    for x in range(0, maxX+1, labelStepX):
        line(x, 0, x, maxY)
    for y in range(0, maxY+1, labelStepY):
        line(0, y, maxX, y)

    # 目盛りラベル
    fill(0)
    textAlign(RIGHT) # 原点
    text(0, labelOffset, labelOffset)
    textAlign(CENTER) # 縦
    for x in range(labelStepX, maxX+1, labelStepX):
        text(x, x, labelOffset)
    textAlign(RIGHT) # 横
    for y in range(labelStepX, maxY+1, labelStepY):
        text(y, labelOffset, y + fontSize / 2)
        
    # 軸ラベル
    textSize(fontSize*1.5)
    fill(150)
    textAlign(LEFT) # 軸ラベルX
    text(u"X", maxX + 20, 0 + fontSize / 2)
    textAlign(CENTER) # 軸ラベルY
    text(u"Y", 0, maxY + 20 + fontSize / 2)

改良版

点線を導入した

def line2(x1, y1, x2, y2):
    lineLength = dist(x1, y1, x2, y2)
    step = 10 # 一つの点線セットの長さ
    ratio = 0.5 # 実線と透明の比率
    repeat = int(lineLength / step)
    w = (x2 - x1) / repeat
    h = (y2 - y1) / repeat
    for i in range(repeat):
        px1 = x1 + (i * w)
        py1 = y1 + (i * h)
        px2 = px1 + (w * ratio)
        py2 = py1 + (h * ratio)
        line(px1, py1, px2, py2)

def setup():
    size(1200,1200)
    background(255)
    zoom = 2

    borderColor = color(200)
    borderColorMedeum = color(100)
    borderColorBold = color(0)
    strokeWeight(1*zoom)
    
    fontSize = 10 * zoom
    # fontName = u"M PLUS 1  Code Regular"
    fontName = u"HiraMaruPro-W4"


    lineHeight = fontSize + 2 * zoom
    maxX = 500 * zoom
    maxY = 500 * zoom
    stepX = 10 * zoom
    stepY = 10 * zoom
    labelStepX = 50 * zoom
    labelStepY = 50 * zoom
    labelOffset = -5 * zoom
    margin = 50 * zoom

    # フォントの設定
    font = createFont(fontName, fontSize, False)
    textFont(font)
    
    # 余白分ずらす
    translate(margin, margin)

    # 罫線
    stroke(borderColor)
    for x in range(0, maxX+1, stepX):
        line(x, 0, x, maxY)
    for y in range(0, maxY+1, stepY):
        line(0, y, maxX, y)

    # 罫線(太)を上書き
    for x in range(0, maxX+1, labelStepX):
        if x % (labelStepX*2) == 0:
            stroke(borderColorBold)
            line(x, 0, x, maxY)
        else:
            stroke(borderColorMedeum)
            line2(x, 0, x, maxY)
    for y in range(0, maxY+1, labelStepY):
        if y % (labelStepY*2) == 0:
            stroke(borderColorBold)
            line(0, y, maxX, y)
        else:
            stroke(borderColorMedeum)
            line2(0, y, maxX, y)

    # 目盛りラベル
    fill(0)
    textAlign(RIGHT) # 原点
    text(0, labelOffset, labelOffset)
    textAlign(CENTER) # 縦
    for x in range(labelStepX, maxX+1, labelStepX):
        text(x / zoom, x, labelOffset)
    textAlign(RIGHT) # 横
    for y in range(labelStepX, maxY+1, labelStepY):
        text(y / zoom, labelOffset, y + fontSize / 2)
        
    # 軸ラベル
    textSize(fontSize*1.5)
    fill(150)
    textAlign(LEFT) # 軸ラベルX
    text(u"X", maxX + 20, 0 + fontSize / 2)
    textAlign(CENTER) # 軸ラベルY
    text(u"Y", 0, maxY + 20 + fontSize / 2)
    save("hougan.png")

改良版2(スクラッチ座標)

点線を導入した

def line2(x1, y1, x2, y2):
    lineLength = dist(x1, y1, x2, y2)
    step = 10 # 一つの点線セットの長さ
    ratio = 0.5 # 実線と透明の比率
    repeat = int(lineLength / step)
    w = (x2 - x1) / repeat
    h = (y2 - y1) / repeat
    for i in range(repeat):
        px1 = x1 + (i * w)
        py1 = y1 + (i * h)
        px2 = px1 + (w * ratio)
        py2 = py1 + (h * ratio)
        line(px1, py1, px2, py2)

def setup():
    size(1200,1200)
    background(255)
    zoom = 2

    borderColor = color(200)
    borderColorMedeum = color(100)
    borderColorBold = color(0)
    strokeWeight(1*zoom)
    
    fontSize = 10 * zoom
    # fontName = u"M PLUS 1  Code Regular"
    fontName = u"HiraMaruPro-W4"


    lineHeight = fontSize + 2 * zoom
    maxX = 240 * zoom
    maxY = 180 * zoom
    stepX = 10 * zoom
    stepY = 10 * zoom
    labelStepX = 50 * zoom
    labelStepY = 50 * zoom
    labelOffset = -5 * zoom
    margin = 50 * zoom

    # フォントの設定
    font = createFont(fontName, fontSize, False)
    textFont(font)
    
    # 余白分ずらす
    translate(margin + maxX, margin + maxY)

    # 罫線
    stroke(borderColor)
    for x in range(0, maxX+1, stepX):
        line(x, -maxY, x, maxY)
        line(-x, -maxY, -x, maxY)
    for y in range(0, maxY+1, stepY):
        line(-maxX, y, maxX, y)
        line(-maxX, -y, maxX, -y)

    # 罫線(太)を上書き
    for x in range(0, maxX+1, labelStepX):
        if x % (labelStepX*2) == 0:
            stroke(borderColorBold)
            line(x, -maxY, x, maxY)
            line(-x, -maxY, -x, maxY)
        else:
            stroke(borderColorMedeum)
            line2(x, -maxY, x, maxY)
            line2(-x, -maxY, -x, maxY)
    for y in range(0, maxY+1, labelStepY):
        if y % (labelStepY*2) == 0:
            stroke(borderColorBold)
            line(-maxX, y, maxX, y)
            line(-maxX, -y, maxX, -y)
        else:
            stroke(borderColorMedeum)
            line2(-maxX, y, maxX, y)
            line2(-maxX, -y, maxX, -y)

    # 目盛りラベル
    fill(0)
    textAlign(RIGHT) # 原点
    text(0, labelOffset, labelOffset)
    textAlign(CENTER) # 縦
    for x in range(0, maxX+1, labelStepX):
        text(x / zoom, x, labelOffset - maxY)
        if x != 0:
            text(-x / zoom, -x, labelOffset - maxY)
    textAlign(RIGHT) # 横
    for y in range(0, maxY+1, labelStepY):
        text(y / zoom, labelOffset - maxX, y + fontSize / 2)
        if y != 0:
            text(-y / zoom, labelOffset - maxX, -y + fontSize / 2)
        
    # 軸ラベル
    textSize(fontSize*1.5)
    fill(150)
    textAlign(LEFT) # 軸ラベルX
    text(u"X", maxX + 20, 0 + fontSize / 2)
    textAlign(CENTER) # 軸ラベルY
    text(u"Y", 0, maxY + 20 + fontSize / 2)
    save("hougan.png")

改良版3(茅野市テキスト用)

もともとのデザインに寄せるようにした。雑な作りですまん。

def line2(x1, y1, x2, y2):
    lineLength = dist(x1, y1, x2, y2)
    step = 10 # 一つの点線セットの長さ
    ratio = 0.5 # 実線と透明の比率
    repeat = int(lineLength / step)
    w = (x2 - x1) / repeat
    h = (y2 - y1) / repeat
    for i in range(repeat):
        px1 = x1 + (i * w)
        py1 = y1 + (i * h)
        px2 = px1 + (w * ratio)
        py2 = py1 + (h * ratio)
        line(px1, py1, px2, py2)

def text2(t, x, y, align, fontSize):
    rectMargin = 5
    tw = textWidth(str(t))
        
    fill(255,255,255,200)
    noStroke()
    if align == CENTER:
        rect(x - tw/2 - rectMargin, y - fontSize/2 - rectMargin, tw + rectMargin*2, fontSize + rectMargin*2)
    elif align == RIGHT:
        rect(x - tw, y - fontSize/2, tw + 5, fontSize + 5)

    fill(0)
    textAlign(align)
    text(t, x, y + rectMargin+4)

def setup():
    size(1200,960)
    background(255)
    zoom = 2

    borderColor = color(200)
    borderColorMedeum = color(100)
    borderColorBold = color(0)
    strokeWeight(1*zoom)
    
    fontSize = 10 * zoom
    # fontName = u"M PLUS 1  Code Regular"
    fontName = u"HiraKakuPro-W4"


    lineHeight = fontSize + 2 * zoom
    maxX = 240 * zoom
    maxY = 180 * zoom
    stepX = 10 * zoom
    stepY = 10 * zoom
    labelStepX = 50 * zoom
    labelStepY = 50 * zoom
    labelOffset = -5 * zoom
    margin = 50 * zoom

    # フォントの設定
    font = createFont(fontName, fontSize, False)
    textFont(font)
    
    # 余白分ずらす
    translate(margin + maxX, margin + maxY)

    # 罫線
    stroke(borderColor)
    for x in range(0, maxX+1, stepX):
        line(x, -maxY, x, maxY)
        line(-x, -maxY, -x, maxY)
    for y in range(0, maxY+1, stepY):
        line(-maxX, y, maxX, y)
        line(-maxX, -y, maxX, -y)

    # 罫線(太)を上書き
    for x in range(0, maxX+1, labelStepX):
        if x % (labelStepX*2) == 0:
            stroke(borderColorBold)
            line(x, -maxY, x, maxY)
            line(-x, -maxY, -x, maxY)
        else:
            stroke(borderColorMedeum)
            line2(x, -maxY, x, maxY)
            line2(-x, -maxY, -x, maxY)
    for y in range(0, maxY+1, labelStepY):
        if y % (labelStepY*2) == 0:
            stroke(borderColorBold)
            line(-maxX, y, maxX, y)
            line(-maxX, -y, maxX, -y)
        else:
            stroke(borderColorMedeum)
            line2(-maxX, y, maxX, y)
            line2(-maxX, -y, maxX, -y)

    # 外枠
    stroke(0)
    noFill()
    rect(-maxX, -maxY, maxX*2, maxY*2)
    line(-maxX, 0, -maxX-50, 0)
    line(maxX, 0, maxX+50, 0)
    line(0, -maxY, 0, -maxY-50)
    line(0, maxY, 0, maxY+50)

    # 目盛りラベル

    text2("(0,0)", 0, fontSize, CENTER, fontSize) # 原点

    fill(0)
    textAlign(CENTER) # X
    for x in range(labelStepX, maxX+1, labelStepX):
        text2(x / zoom, x, fontSize, CENTER, fontSize)
        if x != 0:
            text2(-x / zoom, -x, fontSize, CENTER, fontSize)
    textAlign(RIGHT) # Y
    for y in range(labelStepY, maxY+1, labelStepY):
        text2(-y / zoom, labelOffset, y, RIGHT, fontSize)
        if y != 0:
            text2(y / zoom, labelOffset, -y, RIGHT, fontSize)
    text2(-240, -maxX, fontSize, CENTER, fontSize)
    text2(240, maxX, fontSize, CENTER, fontSize)
    text2(180, labelOffset, -maxY, RIGHT, fontSize)
    text2(-180, labelOffset, maxY, RIGHT, fontSize)
    # 軸ラベル
    textAlign(LEFT) # 軸ラベル+X
    text("X", maxX + 30, 0 + fontSize + 10)
    # textAlign(RIGHT) # 軸ラベル-X
    # text(u"({},{})".format(-maxX/2, 0), -maxX - 10, 0 + fontSize / 2 -3)
    textAlign(CENTER) # 軸ラベル+Y
    text("Y", -20, -maxY - 20 - fontSize / 2)
    # textAlign(CENTER) # 軸ラベル-Y
    # text(u"({},{})".format(0, -maxY/2), 0, maxY + 20 + fontSize / 2)
    
    # 保存    
    save("hougan.png")

コメントする