void Creature::toXml(QDomDocument& xml, QDomElement * parent) const { QDomElement creature = xml.createElement("Creature"); // creature.setAttribute("id", getId()); creature.setAttribute("name", QString(getName().c_str())); // creature.setAttribute("type", QString::number(getType())); creature.setAttribute("body-parts", getNumberOfBodyParts()); creature.setAttribute("constraints", getNumberOfConstraints()); creature.setAttribute("hidden-layers", getNeuralNetwork().getNumberOfLayers() - 2); creature.setAttribute("neurons-per-layer", getNeuralNetwork().getLayer(1).getNumberOfNeurons()); creature.setAttribute("initial-position", QString(( TO_STRING(getInitialPosition().x()) + " ; " + TO_STRING(getInitialPosition().y()) + " ; " + TO_STRING(getInitialPosition().z())).c_str())); creature.setAttribute("final-position", QString(( TO_STRING(getFinalPosition().x()) + " ; " + TO_STRING(getFinalPosition().y()) + " ; " + TO_STRING(getFinalPosition().z())).c_str())); creature.setAttribute("fitness", getFitness()); for (int i = 0; i < getNumberOfBodyParts(); ++i) { getBodyPart(i).toXml(xml, &creature); } for (int i = 0; i < getNumberOfConstraints(); ++i) { getConstraint(i).toXml(xml, &creature); } getNeuralNetwork().toXml(xml, &creature); if (parent) { parent->appendChild(creature); } else { xml.appendChild(creature); } }
bool NCollisionComponent::contains(sf::Vector2f const& point) { sf::Vector2f p = point - getFinalPosition(); for (std::size_t i = 0; i < mPoints.size(); i++) { sf::Vector2f a = getPoint(i); sf::Vector2f b = (i == getPointCount() - 1) ? getPoint(0) - a : getPoint(i + 1) - a; if (b.x * (p.y - a.y) - b.y * (p.x - a.x) < 0) { return false; } } return true; }
Creature * Creature::clone() const { Creature* result = new Creature(getNumberOfBodyParts(), getNumberOfConstraints(), getNeuralNetwork()); for (int i = 0; i < result->getNumberOfBodyParts(); ++i) { result->setBodyPart(i, getBodyPart(i).clone()); } for (int i = 0; i < result->getNumberOfConstraints(); ++i) { result->setConstraint(i, getConstraint(i).clone()); } result->setFinalPosition(getFinalPosition()); result->setInitialPosition(getInitialPosition()); result->setFitness(getFitness()); result->setName(getName()); return result; }
bool NCollisionComponent::intersect(NCollisionComponent* component) { if (component == nullptr) { return false; } for (std::size_t i = 0; i < mPoints.size(); i++) { if (component->contains(getPoint(i) + getFinalPosition())) { return true; } } for (std::size_t i = 0; i < component->getPointCount(); i++) { if (contains(component->getPoint(i) + component->getFinalPosition())) { return true; } } return false; }