.. _PhysiCell_java_CancerBiorobots_Visualizer_java: Visualizer.java =============== .. role:: raw-html(raw) :format: html .. raw:: html .. code-block:: console import java.awt.Color; import ru.biosoft.physicell.core.Cell; import ru.biosoft.physicell.core.CellDefinition; import ru.biosoft.physicell.core.Model; import ru.biosoft.physicell.core.SignalBehavior; import ru.biosoft.physicell.ui.AgentColorer; public class Visualizer extends AgentColorer { private SignalBehavior signals; public Visualizer(Model model) { signals = model.getSignals(); } @Override public Color findBorderColor(Cell cell) { return Color.black; } @Override public Color[] findColors(Cell cell) { double damage = signals.getSingleSignal( cell, "damage" ); double maxDamage = 1.0 * signals.getSingleSignal( cell, "custom:damage_rate" ) / ( 1e-16 + signals.getSingleSignal( cell, "custom:repair_rate" ) ); CellDefinition pCD_cargo = cell.getModel().getCellDefinition( "cargo cell" ); CellDefinition pCD_worker = cell.getModel().getCellDefinition( "worker cell" ); if( cell.type == pCD_cargo.type ) return new Color[] {Color.blue, Color.blue}; if( cell.type == pCD_worker.type ) return new Color[] {Color.red, Color.red}; Color[] output = new Color[] {Color.black, Color.black, Color.black, Color.black}; if( signals.getSingleSignal( cell, "apoptotic" ) > 0.5 ) // Apoptotic - cyan { output[0] = Color.cyan; output[2] = Color.cyan.darker(); return output; } if( signals.getSingleSignal( cell, "necrotic" ) > 0.5 ) { output[0] = new Color( 250, 138, 38 ); output[2] = new Color( 139, 69, 19 ); return output; } // live tumor -- shade by level of damage if live: color by damage if( signals.getSingleSignal( cell, "dead" ) < 0.5 ) { int damageInt = (int)Math.round( damage * 255.0 / maxDamage ); Color c = new Color( damageInt, 255 - damageInt, damageInt ); Color c2 = new Color( damageInt / 4, ( 255 - damageInt ) / 4, damageInt / 4 ); return new Color[] {c, c, c2, c2}; } return output; } }