-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dot.pde
126 lines (115 loc) · 2.44 KB
/
Dot.pde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
class Dot {
PVector[] brain;
int len;
PVector pos;
PVector vel;
PVector acc; //May not need - brain kinda covers this
int clock;
boolean dead;
float fitness;
float mutRate;
int mode;
Dot(int l) {
len = l;
brain = new PVector[len];
for (int i=0; i<len; i++)
{
float x = random(-1,1);
float y = random(-1,1);
brain[i] = new PVector(x,y);
}
pos = new PVector(50,50);
vel = new PVector(0,0);
acc = new PVector(0,0);
clock = 0;
dead = false;
fitness = 0;
mutRate = 0.05;
mode = 0;
}
private void move() {
if (clock >= len)
{
dead = true;
acc.set(0,0);
vel.set(0,0);
} else {
acc = brain[clock];
vel = vel.add(acc);
pos = pos.add(vel);
}
}
private void checkCollision() {
if (pos.x > width*.99 || pos.y > height*.99 || pos.x < width*.01 || pos.y < height*.01)
{
dead = true;
} else if (colliding(o)) {
dead = true;
}
}
void step() {
if (!dead)
{
move();
checkCollision();
/*if (mode == 0) {
fitness += pos.y;
} else {
fitness += 800 - pos.y;
}*/
clock += 1;
} else {
acc.set(0,0);
vel.set(0,0);
//fitness--;
//fitness = max(0,fitness);
//fitness = 0;
}
}
void draw() {
if (mode == 1) {
fill(255,0,0);
stroke(255,0,0);
} else {
fill(0);
stroke(0);
}
ellipse(pos.x,pos.y,2,2);
}
void mutate() {
int i;
for (i=0; i<brain.length; i++)
{
float rand = random(0,1);
if (rand < mutRate)
{
float mutx = random(-.1,.1);
float muty = random(-.1,.1);
PVector mut = new PVector(mutx, muty);
brain[i] = brain[i].add(mut);
//float x = random(-1,1);
//float y = random(-1,1);
//brain[i] = new PVector(x,y);
}
} //<>//
}
void calculateFitness() {
fitness = 1/dist(pos.x, pos.y, width, height);
}
Dot clone() {
Dot newDot = new Dot(brain.length);
for (int i=0; i<brain.length; i++)
{
newDot.brain[i] = brain[i].copy();
}
return newDot;
}
boolean colliding(Obstacle[] o) {
for (int i=0; i<o.length; i++)
{
if (o[i].inside(this))
return true;
}
return false;
}
}