void setup(){
size(256,256);
stroke(255);
for(int i=0;i<65536;i++){
int x=i&255;
int y=i>>8;
float v=boh(x/127.5-1f,y/127.5-1f);
set(x,y,color(v*100,0,200-v*100));
}
float x1=1f;
float x2=-1f;
float c=1e30;
Rnd256 r=new Rnd256();
for(int i=0;i<1000;i++){
float m1=x1+r.mutate();
float m2=x2+r.mutate();
float cm=boh(m1,m2);
if(cm<c){
c=cm;
line((x1+1f)*127.5f,(x2+1f)*127.5f,(m1+1f)*127.5f,(m2+1f)*127.5f);
x1=m1;
x2=m2;
}
}
println(boh(x1,x2));
}
// Bohachevsky function
// min -5.9604645E-8 at 0,0
float boh(float x1,float x2){
return x1*x1+2f*x2*x2-0.3f*cos(3*PI*x1)-0.4f*cos(4*PI*x2)+0.7f;
}
final class Rnd256 {
final long PHI = 0x9E3779B97F4A7C15L;
private long s0, s1, s2, s3;
Rnd256() {
this(System.nanoTime());
}
Rnd256(long seed) {
s0=staffordMix13(seed+PHI);
s1=staffordMix13(seed+2*PHI);
s2=staffordMix13(seed+3*PHI);
s3=staffordMix13(seed+4*PHI);
}
long nextLong() {
long result = s1;
result = Long.rotateLeft(result + (result << 2), 7);
result += result << 3;
final long t = s1 << 17;
s2 ^= s0;
s3 ^= s1;
s1 ^= s2;
s0 ^= s3;
s2 ^= t;
s3 = Long.rotateLeft(s3, 45);
return result;
}
float nextFloat() {
return (nextLong() >>> 40) * 5.9604645E-8f;
}
boolean nextBoolean() {
return nextLong() < 0;
}
int nextIntEx(int ex) {
long r=(nextLong()>>>32)*ex;
return (int)(r>>>32);
}
int nextIntInc(int inc) {
long r=(nextLong()>>>32)*(inc+1L);
return (int)(r>>>32);
}
float mutate() {
int r=(int)nextLong();
r &=0xbfff_ffff;
r |=0x3000_0000;
return Float.intBitsToFloat(r);
}
long staffordMix13(long z) {
z = (z ^ (z >>> 30)) * 0xBF58476D1CE4E5B9L;
z = (z ^ (z >>> 27)) * 0x94D049BB133111EBL;
return z ^ (z >>> 31);
}
}