Java �O���t�B�b�N�X�T���v��

�ڎ�

���ǂ�


�^�[�g���O���t�B�b�N�X

���߂�ꂽ�_���猈�߂�ꂽ�p�x�Ō��߂�ꂽ�����i�ށA�Ƃ������Ƃ��J��Ԃ��ċȐ��i�����̏W�܂�j��`���Z�@���^�[�g���O���t�B�b�N�X�Ƃ����B���Ƃ��΁A����_����X�^�[�g���āu�P�i���90�x�E��]����v�Ƃ���������4��J��Ԃ��ƒP�ʐ����`���`����B

���́A�^�[�g���O���t�B�b�N�X����������N���X�̗�ł���B

class Turtle {
	double direction; // �p�x�A�x���\��
	Vector2 now; // ���ݒn

	Turtle() {
		direction = 0;
		now = new Vector2(0, 0);
	}

	public void reset() {
		direction = 0;
		now = new Vector2(0, 0);
	}
	public Vector2 getPoint() {
		return now;
	}
	public double getdirection() {
		return direction;
	}

	// ���W�̐ݒ�i�ړ��j
	public void setPoint(Vector2 z) {
		now = z;
	}

	// �����̐ݒ�idirection �̒P�ʂ̓��W�A���ł͂Ȃ��āu�x�v�j
	public void setDirection(double direction) {
		this.direction = direction;
	}

	// �����]���itheta �̒P�ʂ̓��W�A���ł͂Ȃ��āu�x�v�j
	public void turn(double theta) {
		direction = mod360(direction + theta);
	}

	// �w�肵���������ړ��i�����͕ς��Ȃ��j
	public void walk(double step) {
		now = new Vector2(step*Math.cos(radian(direction)) + now.x, 
				step*Math.sin(radian(direction)) + now.y);
	}

	// �x�����烉�W�A���ɕϊ�
	public double radian(double angle) {
		return 2 * Math.PI * angle / 360;
	}

	// �������O�x����360�x�͈̔͂Ɏ��߂�
	double mod360(double angle) {
		while (angle < 0) {
			angle += 360;
		}
		while (angle >= 360) {
			angle -= 360;
		}
		return angle;
	}
}

class Vector2 { double x, y; Vector2(double x, double y) { this.x = x; this.y = y; } }

�Ⴆ�΁A��8�p�`��`���ɂ́A�u��苗���i���45�x�E��]����v�Ƃ������Ƃ�8��J��Ԃ��Ηǂ��̂ŁA���̂悤�ɂ���BgetPoint �͌��݂̍��W�_���擾���郁�\�b�h�ł���B

Turtle t = new Turtle();
t.reset();
Vector2 v = t.getPoint();
for(int i=0; i<8; i++) {
t.walk(1);
// v �� t.getPoint() �����Ԑ�����`��
v = t.getPoint();
t.turn(45);
}
}

�����`��

�T�̓�������ʂɎ��߂邽�߂ɂ́A�S�������I��������ƁA���̋O�Ղ���͈͂��v�Z���ĕ`�������Ȃ��B���̂��߂ɁA�����z�� ArrayList �f�[�^�\���𗘗p����B

Turtle t = new Turtle();
ArrayList<Vector2> ar = new ArrayList<Vector2>();
t.reset();
ar.add(t.getPoint());
for(int i=0; i<8; i++) {
t.walk(1);
ar.add(t.getPoint()); t.turn(45);
}
draw(ar);
}
// �S���̃f�[�^����͈͂��v�Z���A��ʂɎ��܂�悤�ȏk�ڗ����v�Z����
void draw(ArrayList<Vector2> r) { Graphics g = getGraphics();
// �͈͂��v�Z
double xa = r.get(0).x, xz = r.get(0).x, ya = r.get(0).y, yz = r.get(0).y; for(int i=1; i<r.size(); i++) { if(r.get(i).x < xa) xa = r.get(i).x;
if(r.get(i).x > xz) xz = r.get(i).x; if(r.get(i).y < ya) ya = r.get(i).y; if(r.get(i).y > yz) yz = r.get(i).y; } double z = Math.max(xz - xa, yz - ya);
// (40,40)- (440,440) �͈̔͂ŕ`��
int ax = 40 + (int)(400 * (r.get(0).x - xa) / z); int ay = 40 + (int)(400 * (r.get(0).y - ya) / z); for(int i=1; i<r.size(); i++) { int bx = 40 + (int)(400 * (r.get(i).x - xa) / z); int by = 40 + (int)(400 * (r.get(i).y - ya) / z); g.drawLine(ax,ay, bx, by); ax = bx; ay = by; } g.dispose(); }

�R�b�z�Ȑ�

������3�������āA�^�񒆂̕������A������ӂƂ��鐳�O�p�`��2�ӂŒu��������i�����}�j�B�������{�}�`�Ƃ��A���̐}�`�̊e�Ӂi���̏ꍇ�͂S�j���k��������{�}�`�Œu��������i�����}�j�B����ɂ��̐}�`�̊e�Ӂi16�‚���j���k��������{�}�`�Œu��������i���E�}�j�B

�@�@�@�@�@koch

���̑����K���ȉ񐔌J��Ԃ��ƁA���̂悤�Ȑ}��������B���̂悤�ɂ��ē�����܂�����R�b�z�Ȑ��A�J��Ԃ��̉񐔂����̋Ȑ��̎����Ƃ����B

�@�@�@�@�@5koch

��{�}�`�͎��̂悤�ɂ��ĕ`�����Ƃ��ł���B

  1. ����_���猈�߂�ꂽ�����Ɉ�苗���i��
  2. ����60�x������ς��A����������i��
  3. �E��120�x������ς��A����������i��
  4. ����60�x������ς��A����������i��

�e�X�e�b�v�ŁA��苗���i�ށi����������i�ށj�̕������u��{�}�`��`���v�ɒu�������邱�ƂŁA�R�b�z�Ȑ���`�����Ƃ��o����B

���́A��ō쐬����Turtle�N���X�̃N���X���\�b�h���g���Ď���������ł���B��{�}�`�̈ꕔ����{�}�`�Œu��������Ƃ�������́A�ċA�Ăяo�����g���Ď����ł���Bdegree �͍ċA�̉񐔂�\���B

public void Kochsub(int degree, double step) {
	if (degree == 0) {
		t.walk(step);
		// walk �̎n�_�ƏI�_�����Ԑ�����`��
	} else {
		Kochsub(degree - 1, step/3);
		t.turn(-60);
		Kochsub(degree - 1, step/3);
		t.turn(120);
		Kochsub(degree - 1, step/3);
		t.turn(-60);
		Kochsub(degree - 1, step/3);
	}
}

���邢�́A��‚̒[�_(x1, y1), (x5, y5) �����Š�{�}�`��3�‚̐܂���̒��_���w�肵�Ă��`�����Ƃ��ł���Bu = (x5 - x1)/3, v = (y5 - y1)/3, t = tan-1((y5 - y1)/(x5 - x1)) �Ƃ��āAx2 = x1+ u, y2 = y1 + v; x4 = x1+ 2u, y4 = y1 + 2v; x3 = x1+ (x5 - x1) cos(t+��/6) / cos(t) / ��3, y3 = y1+ (y5 - y1) sin(t+��/6) / sin(t) / ��3 �ƒu���ƁA(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x5, y5) �����Ɍ��񂾂��̂���{�}�`�ɂȂ�B

�����̗אڂ���2�_�Ԃ𒼐��Ō��ԑ���Ɋ�{�}�`�ɒu��������Ə�̐^�񒆂̐}�̂悤�ɂȂ�B���̎菇���J��Ԃ��΁A�R�b�z�Ȑ����`����B�ċA�֐��ŕ\������ƁA�Ⴆ�Ύ��̂悤�ɕ\�����B

// �ċA�֐�
public void koch(double x1, double y1, double x5, double y5, int m) {
if(m == 0) {
// ���� (x1,y1) - (x5,y5) ������
return;
}
double u = (x5 - x1) / 3;
double v = (y5 - y1) / 3;
double t = Math.atan((y5-y1) / (x5-x1)); double x3 = x1 + (x5-x1) * Math.cos(t+Math.PI/6) / Math.cos(t) / Math.sqrt(3.0);
double y3 = x1 + (y5-y1) * Math.sin(t+Math.PI/6) / Math.sin(t) / Math.sqrt(3.0); koch(x1, y1, x1+u, y1+v, m-1);
koch(x1+u, y1+u, x3, y3, m-1);
koch(x3, y3, x1+2*u, y1+2*v, m-1);
koch(x1+2*u, y1+2*v, x5, y5, m-1);
}

�p�x��i�ދ����������_���ɂ���ƁA���ۂ̊C�ݐ��̂悤�Ȏ��R�E�̋Ȑ��ɋ߂����̂�������B���Ƃ��΁A����0����90�܂ł̃����_���Ȑ��� x, y �Ƃ��āAx �x���ɁA-x-y �x�E�ɁAy �x���ɕ����]������A�ƒu�������ăR�b�z�Ȑ����ǂ���`�������̂ł���B

�@�@�@�@�@_ȃRbz

���ǂ�


�h���S���Ȑ�

�����̒��_���‚܂�ŏ�Ɉ����グ�A�����}�̂悤�Ȓ��p�񓙕ӎO�p�`��2�ӂƂȂ�悤�ɂ������̂���{�}�`�Ƃ��A�R�b�z�Ȑ��Ɠ����悤�ɁA�V���ɏo������������{�Ȑ��Œu��������i�������A�������t�j�Ƃ���������J��Ԃ��Ăł����܂�����h���S���Ȑ��ƌĂԁB

�@�@�@�@�@hS

�Ⴆ�΁A���͂��̑����12��J��Ԃ������ʓ���ꂽ���̂ł���i12���̃h���S���Ȑ��j�B

�@�@�@�@�@12hS

 �@�@�u����_����45�x���֌�����ς��āA�P�P�ʐi�݁A90�x�E�֌�����ς���1�P�ʐi�݁A45�x���Ɍ�����ς���v

�Ƃ����������h�^�Ƃ��AI�^�́u�E�v�Ɓu���v����ꊷ����

�@�@�u����_����45�x�E�֌�����ς��āA�P�P�ʐi�݁A90�x���֌�����ς���1�P�ʐi�݁A45�x�E�Ɍ�����ς���v

�Ƃ���������II�^�Ƃ���B

�h�^�ɑ����āu90�x�E�֌�����ς��v�Ă���II�^�����s����Ə�̐^�񒆂̐}���`����B����ɁA�h�^�A�h�h�^�̋L�q�Ɋ܂܂��ŏ��́u1�P�ʐi�݁v���uI�^�����s���v�ɒu�������A2�Ԗڂ́u1�P�ʐi�݁v���u�hI�^�����s���v�ɒu������ƁA��̉E�̐}��������B

��ō쐬���� Turtle�N���X�̃N���X���\�b�h���g���Ă�������������̂����̃v���O������ł���Bdegree �͍ċA�̉񐔂�\���B

public void dragonsub(int degree, double step, int rot) {
	if (degree == 0) {
		t.walk(step);
// walk �̎n�_�ƏI�_�����Ԑ�����`�� } else { t.turn(-45*rot); dragonsub(degree - 1, step/Math.sqrt(2), 1); t.turn(90*rot); dragonsub(degree - 1, step/Math.sqrt(2), -1); t.turn(-45*rot); } }

a, b �������_���Ȑ��Ɏ��A�u45�x�A90�x�A45�x�v�̑���Ɂua �x�Aa+b �x�Ab �x�v�ɒu��������ƁA���̂悤�Ȏ��R�E�Ɍ�����}�`�̂悤�Ȃ��̂��`����B

�@�@�@�@�@_hS


���ǂ�


�V�F���s���X�L�[�̃K�X�P�b�g

�h��‚Ԃ������O�p�`����A�e�Ђ̒��_������ŏo���鐳�O�p�`�́i�ӂ��c���āj������؂���B��ӂ������̎O�‚̐��O�p�`���ꂼ��ɑ΂��ē���������{���A�Ƃ������Ƃ��i�����Ɂj�J��Ԃ��ƁA���̐}�̂悤�Ȍ����炯�̎O�p�`���ł���B���̐}�`�̓V�F���s���X�L�[�̃K�X�P�b�g�ƌĂ΂��B�ǂ�ȓ_�̋߂��ł��g�傷��ƌ��̐}�`���o������Ƃ����Ӗ��ŁA�R�b�z�Ȑ��Ɠ����悤�Ȑ����������Ă���B

������^�[�g���O���t�B�b�N�X���g���Ď��̂悤�ɍċA�I�ɕ`�����Ƃ��ł���B��{�}�`�͐��O�p�`�ŁA�u1�P�ʐi���120�x�����񂷂�v�Ƃ������Ƃ�3��J��Ԃ��B�i�ޑO�ɂ��̓_���������Ƃ���傫���������̃K�X�P�b�g��`���Ƃ�����Ƃ�lj����Ă��Ηǂ��B

�@�@�@�@�@VFsXL[

���́A�V�F���s���X�L�[�̃K�X�P�b�g��`���v���O�����̗�ł���B

public void sierpsub(int m, double step) {
	if(m == 0) return;
	sierpsub(m-1, step/2);		// ��ӂ������̃K�X�P�b�g��`��
	t.walk(step);			// ���߂�ꂽ�����i��	
	// �������Ղ̒�����`��
	t.turn(-120);			// 12�x�����񂷂�A����������2��J��Ԃ�
	sierpsub(m-1, step/2);
	t.walk(step);
	// �������Ղ̒�����`��
	t.turn(-120);
	sierpsub(m-1, step/2);
	t.walk(step);
	// �������Ղ̒�����`��
	t.turn(-120);
}

���ǂ�


���`�}

�؂̎}������̂悤�ȉ����}����{�}�`�Ƃ��A���̕ʂꂽ�Q�{�̎}����{�}�`�ɒu��������Ɖ����}�̂悤�ɂȂ�A��[�̂S�{�̎}����{�}�`�ɒu��������Ɖ��E�}��������B���̑���𑱂���ƁA�؂̌`�������}������}��������B���̂悤�Ȑ}�`�����`�} tree �Ƃ����B

�@�@�@�@�@`}

�R�b�z�Ȑ���`���̂Ɠ��l�ɁA�^�[�g���O���t�B�b�N�X���ċA�I�Ɏg���ƁA���̎��`�}��������Ba, b �����ꂼ�ꍶ�}�A�E�}�̎}������̊p�x�Ƃ��Ac, d �����ꂼ��A���Ǝ}�̒����Ƃ���ƁA��{�}�`�͎��̂悤�ɂ��ĕ`����B

�@�@�@c �i�݁A���� a �x�����񂵂� d �i�݁A�}������n�_�ɖ߂�Aa+b �x�E���񂵂� d �i�݁A�i�}������n�_�̖߂�jb �x�����񂷂�

�ud �i�ށv�Ƃ������{�}�`�ɒu��������Ə�̒��}�������A����ɂ��̐�[�̎}����{�}�`�ɒu��������Ə�̉E�}��������B���́A�}�̒������ċA�̎����Ƃ����ꍇ�̃v���O������ł���Ba, b �����ꂼ�� angle, angle2 �Ƃ����BsetPoint �͌��ݒn��ύX���郁�\�b�h�ł���B

public void treesub(int degree, double angle, double angle2) {
	t.walk(degree);
	// �����Ŏ}�̎n�_�ƏI�_�����Ԑ���`��
	Vector2 v = t.getPoint();
	if (degree == 1) {
		return;
	}
	t.turn(-angle);
	treesub(degree - 1, angle, angle2);
	t.setPoint(v);
	t.turn(angle+angle2);
	treesub(degree - 1, angle, angle2);
	t.setPoint(v);
	t.turn(-angle2);
}

�Ⴆ�΁A���� a = 20, b = 15 �Ƃ��āA���̑����12��J��Ԃ������ʓ���ꂽ���̂ł���B

�@�@�@�@�@12̎`}

�}�̒����������_���ɂ���ƁA���̂悤�Ȏ��R�E�̖؂̂悤�Ȑ}��������B

�@�@�@�@�@_`}


���ǂ�

�����`�̃����_������

�����`���A���̒Z�ӂɕ��s�ȃ����_���Ȓ����ɂ���ē�‚̒����`�ɕ�����A�Ƃ���������A�V���ɐ�������钷���`�ɑ΂��Ă��K�p����ƁA���}�̂悤�Ȑ}�`���o����B����4��̑����24�‚̒����`�ɁA�E��8��̑����28�‚̒����`�ɕ�������Ă���B

�@�@�@�@�@_ȕ

��{����͎��ŗ^������B�����`�̖k�����̍��W�� (x1, y1)�A�쓌���̍��W�� (x2, y2) �Ƃ���B

���̊�{�菇���A�������ꂽ��‚̒����`�ɓK�p����A�Ƃ����ċA�Ăяo�����g���΁A��̂悤�Ȑ}�`��`�����Ƃ��o����B�ċA���I��点�邽�߂ɁA�ċA�̐[�����p�����[�^�Ƃ��Ēlj�����Ηǂ��B��������������̂����̃v���O������ł���BVector2 �́A2�����̍��W�_�idouble�^�j��\���f�[�^�^�ł���Bm �͍ċA�̃��x�����L������B

// �ċA�֐�
public void rectsub(Vector2 u, Vector2 w, int m) { if(m == 0) return; if(w.x - u.x > w.y - u.y) { double x = Math.random()*(w.x-u.x) + u.x;
// �_(x, u.y)�Ɠ_(x, w.y)������ rectsub(u, new Vector2(x, w.y), m-1); rectsub(new Vector2(x, u.y), w, m-1); } else { double y = Math.random()*(w.y-u.y)+ u.y;
// �_(u.x, y)�Ɠ_(w.x, y)������ rectsub(u, new Vector2(w.x, y), m-1); rectsub(new Vector2(u.x, y), w, m-1); } }

���ǂ�


�}���f���u�� Mandelbrot �W��

c �𕡑f���Ƃ��āA���f���̑Q�����u zn+1 = zn2 + c, z0 = 0�v���v�Z�����Ƃ��Azn �����U���Ȃ��悤�� c �̑S�̂��}���f���u���W���Ƃ����B�����}�̍����h��ꂽ�������}���f���u���W���ł���i[-2, 0.5] x [-1, 1] �͈̔͂�������Ă���j�B���̈ꕔ���g�債�����̂�^�񒆂̐}�A����ɂ��̈ꕔ���g�債�����̂��E�}�Ɏ����B�ǂ�ȂɊg�債�Ă��A�����悤�Ȑ}�`�������B���̂悤�Ȑ������t���N�^���Ƃ����B

���ȊO�̕����ł͔��U���邪�A���̐F�̈Ⴂ�́A���U�̑����ɉ����ĕʁX�̐F��z�F�������ʂł���B�}���f���u���W���̎��ӂŊg�債���}�ɍׂ��ȐF�̈Ⴂ������̂́Ac �̂�����Ƃ����Ⴂ�ł��A���U�̃p�^�[�����ɒ[�ɈقȂ�Ƃ����t���N�^���������邱�Ƃ������Ă���B

�@�@}fuW

�}���f���u���W����`���ɂ́A�K���ɑ傫�Ȓl L �ƓK���ɑ傫�ȉ��} N ��^���A���f���ʂ̊e�_�� c �Ƃ��āA�Q�������v�Z���AzN �̐�Βl�� L �𒴂��Ȃ����̂����‚���Ηǂ��B���� n �� zn �� L �𒴂�����A���� n ��K���ȐF�R�[�h�ɕϊ����A���F����B

���́A���̃v���O�����̗�ł���BComplex �� double�^��2�����x�N�g������Ȃ�f�[�^�^�i���f����\���j�AComplex.add �͕��f���̑����Z�AComplex.mult �͕��f���̊|���Z�A Complex.abs2 �͕��f���̐�Βl��2����v�Z����Bsize �̓O���t�B�b�N�̈�̑傫����\���Afor-(i,j) ���ŁA�e�s�N�Z�����ɕ��f����Ή������A�Q�����̎������U���v�Z���Ă���Bfor-k �\���� if ���Ŕ��U�����Ƃ��Ƀ��[�v���甲����悤�ɂ��Ă���B���[�v���甲�����Ƃ��� k �̒l�� r,g,b �֕ϊ�����v�Z���@�ɂ���āA��ۂ̈Ⴄ�}��������B

public void Mandelblotsub(Complex zmin, Complex zmax, int lim, double cov) {
	double dx = (zmax.re - zmin.re) / size.width;
	double dy = (zmax.im - zmin.im) / size.height;
	Complex z, w, c;
	for(int i=0; i<size.width; i++) {
		for(int j=0; j<size.height; j++) {
			c = zmin.add(new Complex(i*dx, j*dy));
			z = new Complex(0,0);
			int k;
			for(k=0; k<lim; k++) {
				w = c.add(z.mult(z));			// z = z^2 + c
				if(w.abs2() > cov*cov) break;
				z = w;
			}
			int r = (k % 11) * (256/11);
			int G = (k % 8) * (256/8);
			int b = (k % 19) * (256/19);
			if(k == lim) {r = G = b = 0;}
			gr.setColor(new Color(r,G,b));
			gr.drawOval(i, j, 1, 1);
		}
	}
	repaint();
}

�Q������K���ɑւ��邱�Ƃɂ��A�}���f���u���W���Ɠ����悤�ȃt���N�^���}�`��`�����Ƃ��ł���B

���ǂ�

2���Q����

�K���ȏ����l����n�߂āA�Q�����Fxn+1 = a xn + b yn + c; yn+1 = d xn + e yn + f �ɂ���ē_�� {(xn, yn)} �����o���B�Ⴆ�΁Aa = d = r cos(t), c = -b = r sin(t), c = f = 0 �Ƃ���ƁA��]���Ȃ���g��ir > 1 �̏ꍇ�j�A���邢�͏k���ir < 1 �̏ꍇ�j���Ă����_�񂪕`�����Bt = 2��/ �Ӂi�������A�ӂ͉�����i1.618...�j�j, r = 0.999 �Ƃ���ƁA���̍��̐}��������B�E�̐}�͂Ђ܂��̉Ԃ̎ʐ^�ł���B

�@�@�@�@�@Ђ܂




���ǂ�