Blok bertenaga memiliki beberapa koneksi input / output, tetapi pada titik awal, kita tidak tahu kapan itu input atau output.
Setiap blok memiliki "Tegangan" yang merupakan energi yang sampai padanya dikurangi yang hilang / digunakan.
Blok bertenaga akan memberikan daya ke semua blok sekitarnya, dan setiap blok mengambil sebagai input tegangan yang lebih tinggi dari blok sekitarnya. Anda juga dapat menyulitkan sistem dengan mendefinisikan Intensitas, tetapi saya akan tetap menggunakan Voltage hanya untuk kesederhanaan.
Setiap kali perubahan dilakukan ke sirkuit, dengan menambahkan / menghapus blok, atau oleh sirkuit itu sendiri, perubahan harus disebarkan ke semua sirkuit sampai stabilitas.
Saya sarankan Anda untuk mendesain antarmuka untuk objek bertenaga apa pun (kubus dalam MC):
class PowerInterface
{
protected:
std::vector<shared_ptr<PowerInterface>> sibling;
double energy=0;
bool isActive = false;
virtual void propagate(double inEnergy) = 0;
virtual void addSibling(shared_ptr<PowerInterface> newSibling) = 0;
virtual void removeSibling( shared_ptr<PowerInterface> remSibling) =0;
};
Jadi seandainya Anda menerapkan addSibling dan removeSibling, bagian terpenting adalah fungsi merambat:
void PoweredCube::propagate( double inEnergy )
{
// Define the behaviour
energy = inEnergy-1.0; // Normal device
energy = inEnergy-0.1; // Normal cable
energy = 10.0; // Normal source of power.
if (energy<0.0)
{
energy = 0.0;
isActive = false;
// No energy, so do not propagate anymore
return;
}
isActive = true;
// Propagate
for (auto &s: sibling)
{
// Only propagate to sibling with less energy.
if (energy > s->energy) s->propagate( energy);
}
}
Sebagai solusi rekursif, setiap blok harus mengurangi sedikit energi, tidak pernah meningkatkannya. Sumber daya dapat menetapkan nilai tetap, tetapi tidak pernah meningkat berdasarkan input. Itu seharusnya tidak menjadi masalah karena semua sistem "nyata" bekerja dengan cara ini.