Reorganize Gene code

This commit is contained in:
Joscha 2017-05-07 19:02:33 +00:00
parent 92f1876aa2
commit a550f267df
3 changed files with 205 additions and 1 deletions

View file

@ -10,7 +10,7 @@ SRCDIR = src
TMPDIR = build TMPDIR = build
TARGET = gross TARGET = gross
#FILES = Chromosome Fitness Generation main #FILES = Chromosome Fitness Generation main
FILES = Chromosome Fitness Generation main FILES = Genes
#SOURCES = $(patsubst %,$(SRCDIR)/%.cpp,$(FILES)) #SOURCES = $(patsubst %,$(SRCDIR)/%.cpp,$(FILES))
OBJECTS = $(patsubst %,$(TMPDIR)/%.o,$(FILES)) OBJECTS = $(patsubst %,$(TMPDIR)/%.o,$(FILES))

142
src/Genes.cpp Normal file
View file

@ -0,0 +1,142 @@
#include "Genes.hpp"
#include <algorithm>
#if __GNUC__ < 7 // gcc 7 will support clamp
namespace std {
template<typename T>
T clamp(T v, T lo, T hi)
{
return std::min(hi, std::max(lo, v));
}
}
#endif
// Common to all genes
std::minstd_rand* Gene::re;
sf::Vector2f Gene::size;
Gene::~Gene()
{
}
// GeneCircle
sf::CircleShape GeneCircle::circle(0, 36);
float GeneCircle::stddev_position = .1; // in percent of min side length
float GeneCircle::stddev_radius = .1; // in percent of max radius
float GeneCircle::stddev_color = 20; // absolute value
GeneCircle::~GeneCircle()
{
}
void GeneCircle::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
this->circle.setPosition(this->position);
this->circle.setRadius(this->radius);
this->circle.setFillColor(this->color);
target.draw(this->circle, states);
}
void GeneCircle::randomize()
{
}
void GeneCircle::mutate()
{
std::uniform_int_distribution<> choicedist(0, 2);
switch (choicedist(*Gene::re)) {
case 0:
this->mutatePosition();
break;
case 1:
this->mutateRadius();
break;
case 2:
this->mutateColor();
break;
}
}
void GeneCircle::mutatePosition()
{
std::normal_distribution<> posdist(0, GeneCircle::stddev_position);
float min_side = std::min(Gene::size.x, Gene::size.y);
this->position.x = std::clamp<float>(
this->position.x + posdist(*Gene::re)*min_side,
0,
Gene::size.x
);
this->position.y = std::clamp<float>(
this->position.y + posdist(*Gene::re)*min_side,
0,
Gene::size.y
);
}
void GeneCircle::mutateRadius()
{
std::normal_distribution<> raddist(0, GeneCircle::stddev_radius);
float max_radius = this->maxRadius();
this->radius = std::clamp<float>(
// gene.radius + pow(raddist(*Gene::re)*sqrt(max_radius), 2),
this->radius + raddist(*Gene::re)*max_radius,
0,
max_radius
);
}
void GeneCircle::mutateColor()
{
std::normal_distribution<> coldist(0, GeneCircle::stddev_color);
this->color.r = std::clamp<unsigned int>(this->color.r + coldist(*Gene::re), 0, 255);
this->color.g = std::clamp<unsigned int>(this->color.g + coldist(*Gene::re), 0, 255);
this->color.b = std::clamp<unsigned int>(this->color.b + coldist(*Gene::re), 0, 255);
this->color.a = std::clamp<unsigned int>(this->color.a + coldist(*Gene::re), 0, 255);
}
float GeneCircle::maxRadius()
{
// return std::min(Gene::size.x, Gene::size.y);
return std::min(Gene::size.x, Gene::size.y)/2;
}
// GeneTriangle
GeneTriangle::~GeneTriangle()
{
}
void GeneTriangle::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
}
void GeneTriangle::randomize()
{
}
void GeneTriangle::mutate()
{
}

62
src/Genes.hpp Normal file
View file

@ -0,0 +1,62 @@
#pragma once
#include <random>
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
class Gene : public sf::Drawable
{
public:
static std::minstd_rand* re;
static sf::Vector2f size;
virtual ~Gene();
virtual void randomize() =0;
virtual void mutate() =0;
};
class GeneCircle : public Gene
{
public:
virtual ~GeneCircle();
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
virtual void randomize();
virtual void mutate();
private:
static sf::CircleShape circle;
static float stddev_position;
static float stddev_radius;
static float stddev_color;
sf::Vector2f position;
float radius;
sf::Color color;
void mutatePosition();
void mutateRadius();
void mutateColor();
float maxRadius();
};
class GeneTriangle : public Gene
{
public:
virtual ~GeneTriangle();
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
virtual void randomize();
virtual void mutate();
private:
// TODO: vertices
};