※ このページは SVG 画像を含んでいるので、 Firefox など SVG を表示できるブラウザーで見て下さい。
C または Java 言語から(文庫本サイズの)ブックカバー用の
SVG ファイルを作成するための特定用途専用の自家製グラフィックスライブラリーです。
Processing (https://processing.org/
) という言語と
できるだけ同じ名前で描画関数を用意しています。
しかし、いくつかの関数は簡略化されていますし、当然ながら、
アニメーションやインタラクション関係の関数はありません。
初期状態では、紙の左上が原点で、x 軸は右向き、y 軸は下向きにのびています。 (ふつう数学で使う座標系と y 軸の向きが逆です。) 長さの単位は mm(ミリメートル)です。
サイズは A4 紙横向きがデフォルトになっています。 A4 紙のサイズは 横 297mm × 縦 210mmです。 ブックカバーにしたとき、描いた図形が本の表面に現れるようにするには、 だいたい (43, 31)—(253, 179) の座標の範囲 (横 210mm × 縦 148mm)に図形がおさまるようにして下さい。
Java版では、
import static util.SVGUtil.*;
としてください。
C 版では、
#include "svg.h"
としてください
/* 間違い */ #include <svg.h>
ではありませんので気を付けてください。
基本的に C, Java とも関数名は共通です。
ただし、C で unsigned int
型の引数は、Java ではただの
int
型に、
char*
型は String
型になります。
逆に Java 版の boolean
型 は C ではただの int
型になります。
C 版 | Java 版 | この文書 |
---|---|---|
unsigned int |
int |
unsigned int |
char* |
String |
char* |
int |
boolean |
boolean |
void setPageSize(double width, double height);
start()
の前に呼び出します。
紙のサイズを幅 width
, 高さ height
に設定します。
A4 サイズの場合は void a4Portrait()
,
void a4Landscape()
を使ってください。
void start(void);
void finish(void);
void rulers(void);
void trimMark(void);
初期状態は、線なし・塗潰し黒です。
void stroke(unsigned int color);
void strokeWeight(double w);
void strokeOpacity(double opacity);
void noStroke(void);
void fill(unsigned int color);
void fillOpacity(double opacity);
void noFill(void);
void textFont(char*(Java では String) fontName, double size);
void line(double x1, double y1, double x2, double y2);
void rect(double x, double y, double w, double h);
void ellipse(double x, double y, double w, double h);
void triangle(double x1, double y1, double x2, double y2, double x3, double y3);
void quad(double x1, double y1, double x2, double y2,
double x3, double y3, double x4, double y4);
void arc(double x, double y, double w, double h, double start, double stop);
(x, y) 円弧の楕円の中心の座標 (w, h) 円弧の楕円の幅と高さ start 円弧を開始する角(単位はラジアン) stop 円弧を終了する角(単位はラジアン)
void arc360(double x, double y, double w, double h, double start, double stop);
(x, y) 円弧の楕円の中心の座標 (w, h) 円弧の楕円の幅と高さ start 円弧を開始する角(単位は度) stop 円弧を終了する角(単位は度)
void bezier(double ax0, double ay0, double cx0, double cy0,
double cx1, double cy1, double ax1, double ay1);
(ax0, ay0) 1つめのアンカーポイントの座標 (cx0, cy0) 1つめのコントロールポイントの座標 (cx1, cy1) 2つめのコントロールポイントの座標 (ax1, ay1) 2つめのアンカーポイントの座標
void text(char* str, double x, double y, ...);
(C 版)
void text(String str, double x, double y, Object... args);
(Java 版)
C 版 C/FirstSample.c |
Java 版 Java/FirstSample.java |
上記のプログラムが生成する図形 |
void beginShape(void);
void vertex(double x, double y);
void bezierVertex(double cx0, double cy0, double cx1, double cy1, double ax1, double ay1);
(cx0, cy0) 1つめのコントロールポイントの座標 (cx1, cy1) 2つめのコントロールポイントの座標 (ax1, ay1) 2つめのアンカーポイントの座標
void endShape(int close);
(C 版)void endShape(boolean close);
(Java 版)beginShape と endShape の間に vertex と bezierVertex 以外の描画関係の関数を呼び出さないようにして下さい。
void image(char*String url, double x, double y, double w, double h);
unsigned int hsb1(double h, double s, double v);
unsigned int hsb100(double h, double s, double v);
unsigned int hsb360(double h, double s, double v);
unsigned int hsb255(double h, double s, double v);
unsigned int hsl1(double h, double s, double l);
unsigned int hsl100(double h, double s, double l);
unsigned int hsl360(double h, double s, double l);
unsigned int hsl255(double h, double s, double l);
unsigned int rgb1(double r, double g, double b);
unsigned int rgb100(double r, double g, double b);
unsigned int rgb255(double r, double g, double b);
unsigned int bw1(double v);
unsigned int bw100(double v);
unsigned int bw255(double v);
unsigned int rotateH360(unsigned int color, double a);
unsigned int rotateH(unsigned int color);
void randomSeed(unsigned int seed);
void randomizeByTime(void);
double randomInRange(double min, double max);
double radians(double deg);
“亀”は最初ページの真ん中 (148.5, 105)
に
ペンを下げた状態で 0 度の向き(右)を向いています。
void forward(double len);
len
だけ移動します。void backward(double len);
len
だけ移動します。void turn(double angle);
angle
度回転します。
(左方向に回転する時は負の数を渡します。)void penUp(void);
void penDown(void);
void direction(double dir);
direction
度の方向を向きます。void go(double x, double y);
void center(void);
double getX(void);
double getY(void);
double getAngle(void);
void pushTurtle(void);
void popTurtle(void);
pushTurtle
でバックアップしたものに戻します。void say(char* str, ...);
(C 版)void say(String str, Object... args);
(Java 版)str
を描画します。このとき、“亀”は移動しません。
C 版 C/TurtleSample.c |
Java 版 Java/TurtleSample.java |
上記のプログラムが生成する図形 |
void translate(double x, double y);
void rotate(double theta);
void scale(double sx, double sy);
void pushMatrix(void);
void popMatrix(void);
void resetMatrix(void);
ペーパークラフトで正多面体を作成するための関数群です。
public static void setRegularPolyhedronNet(int n)
n
は 4, 6, 8, 12, 20 のいずれかです。
展開図の大きさは (10, 10) — (287, 200)
(A4 サイズでマージンを 1cm取った大きさ)
の範囲にフィットするように調節します。
public static void fitPolyhedronNet(double xmin, double ymin, double xmax, double ymax)
(xmin, ymin) — (xmax, ymax)
の範囲にフィットするように調節します。public static void drawBackgroundPolyhedron()
public static void lineSpherical(double x1, double y1, double z1, double x2, double y2, double z2)
(x1, y1, z1) — (x2, y2, z2)
を単位球に内接する正多面体に射影した線分を展開図中に描きます。
展開図は、以下の関数で利用されます。 通常の二次元描画関数は展開図を無視しますが、 タートルグラフィックス関係は、展開図の“端”で、 “つながっている”辺にジャンプします.
public static void circleSpherical(double x1, double y1, double z1, double r)
(x1, y1, z1)
、半径: r
)
を単位球に内接する正多面体に射影した曲線を展開図中に描きます。
public static void triangleSpherical(double x1, double y1, double z1,
double x2, double y2, double z2,
double x3, double y3, double z3)
(x1, y1, z1) — (x2, y2, z2) —
(x3, y3, z3)
を単位球に内接する正多面体に射影した三角形を展開図中に描きます。
Java 版 Java.old/RandTest2.java |
Java 版 Java.old/PolyhedronTest.java |
|
|
import static util.SVGUtil.*;
の代わりに、
import static util.SphericalUtil.*;
として下さい。
平面上のタートルと命令は同じですが、球面上を動きます。
ただし、forward
の単位は角度になります。
また、direction
, go
, center
, getX
,
getY
, getAngle
などの関数は次の関数に置き換えられます。
public static void go(double x, double y, double z)
(x, y, z)
(を球面上に射影した点)に移動します。public static double[] getTurtle()
public static double[] getDirection()
Java 版 Java.old/SphericalTest.java |
上記のプログラムが生成する図形 |