Class ImageEvolutionDemoView
- All Implemented Interfaces:
IFeedbackProvider,IImageEvolutionResettable,ISimulationHost,SimulationListener,IFileDropHandler,ComponentListener,FocusListener,MouseListener,ImageObserver,MenuContainer,Serializable,EventListener,Accessible,RootPaneContainer,WindowConstants
SimulationView that evolves a population of semi-transparent
triangles to approximate a target image using the MDI genetic algorithm
framework.
Layout
The view's world container is replaced by a custom
ImageEvolutionPanel installed as the CENTER component. It renders
three regions side-by-side:
- Left — best individual found so far, at full display resolution.
- Center — thumbnail grid of the entire current population.
- Right — the fixed target image.
Fitness and diversity diagnostic plots are installed on the right side of a
split pane via the SimulationView diagnostics mechanism.
Threading
The GA runs on the simulation thread. On each refresh callback (EDT), the
view asks the simulation for its best individual, renders it at display
resolution, renders all population thumbnails, then hands both to
ImageEvolutionPanel and calls repaint().
Reset
The view implements IImageEvolutionResettable so the control panel
can request a fresh run with different parameters without knowing the view's
concrete type. Reset is delegated to
SimulationView.requestEngineReset(java.util.function.Supplier<edu.cnu.mdi.sim.Simulation>, java.util.function.Consumer<edu.cnu.mdi.sim.SimulationEngine>, boolean, boolean).
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class edu.cnu.mdi.sim.ui.SimulationView
SimulationView.ControlPanelFactory, SimulationView.DiagnosticFactoryNested classes/interfaces inherited from class javax.swing.JInternalFrame
JInternalFrame.AccessibleJInternalFrame, JInternalFrame.JDesktopIconNested classes/interfaces inherited from class javax.swing.JComponent
JComponent.AccessibleJComponentNested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainerNested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intDefault number of triangles per chromosome.static final intDefault population size.Fields inherited from class edu.cnu.mdi.sim.ui.SimulationView
controlPanel, diagnostics, diagnosticsSplitPane, engineFields inherited from class edu.cnu.mdi.view.BaseView
container, desktop, infoDialog, properties, scrollPane, statusWP, viewPopupMenu, VIEWPROPNAME, virtualItemFields inherited from class javax.swing.JInternalFrame
closable, CONTENT_PANE_PROPERTY, desktopIcon, FRAME_ICON_PROPERTY, frameIcon, GLASS_PANE_PROPERTY, iconable, IS_CLOSED_PROPERTY, IS_ICON_PROPERTY, IS_MAXIMUM_PROPERTY, IS_SELECTED_PROPERTY, isClosed, isIcon, isMaximum, isSelected, LAYERED_PANE_PROPERTY, maximizable, MENU_BAR_PROPERTY, resizable, ROOT_PANE_PROPERTY, rootPane, rootPaneCheckingEnabled, title, TITLE_PROPERTYFields inherited from class javax.swing.JComponent
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOWFields inherited from class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENTFields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTHFields inherited from interface javax.swing.WindowConstants
DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, EXIT_ON_CLOSE, HIDE_ON_CLOSE -
Constructor Summary
ConstructorsConstructorDescriptionImageEvolutionDemoView(Object... keyVals) Create the image evolution demo view. -
Method Summary
Modifier and TypeMethodDescriptionvoidfilesDropped(List<File> files) Called on the EDT when one or more accepted files are dropped on this view.Override to supply structured information for the info dialog.protected voidCalled on the EDT before the view repaints in response to a refresh.protected voidonSimulationStateChange(SimulationContext ctx, SimulationState from, SimulationState to, String reason) Called on the EDT after any engine state transition.voidrequestReset(int numTriangles, int populationSize, ImageFitnessMode fitnessMode) Request a reset with the given parameters.Methods inherited from class edu.cnu.mdi.sim.ui.SimulationView
getDiagnosticsComponent, getSimulationEngine, onCancelRequested, onDone, onFail, onInit, onMessage, onPause, onProgress, onReady, onRefresh, onResume, onRun, onSimulationCancelRequested, onSimulationDone, onSimulationFail, onSimulationInit, onSimulationMessage, onSimulationPause, onSimulationProgress, onSimulationReady, onSimulationResume, onSimulationRun, onStateChange, replaceEngine, requestEngineReset, startAndRunMethods inherited from class edu.cnu.mdi.view.BaseView
addWestPanel, applyFocusFix, center, checkBooleanProperty, componentHidden, componentMoved, componentResized, componentShown, enableFileDrop, enableFileDrop, focusGained, focusLost, getAnnotationLayer, getCenterComponent, getConfigurationProperties, getConnectionLayer, getDefaultLayer, getFeedbackStrings, getFileFilter, getIContainer, getImageComponent, getInfoButton, getInsets, getIntProperty, getName, getParentFrame, getProperties, getPropertyName, getScrollPane, getSpecialClip, getToolBar, getViewPopupMenu, getVirtualItem, handleMagnify, hoverClosed, hoverUpdate, initFeedback, initFeedback, isOnTop, isScrollable, isViewVisible, mouseClicked, mouseEntered, mouseExited, mousePressed, mouseReleased, offset, onFirstRealize, prepareForExit, refresh, resolveContainer, rightClicked, setAfterDraw, setBeforeDraw, setBooleanProperty, setFileFilter, setFromProperties, setIntProperty, setVirtualItem, viewInfoMethods inherited from class javax.swing.JInternalFrame
addImpl, addInternalFrameListener, createRootPane, dispose, doDefaultCloseAction, fireInternalFrameEvent, getAccessibleContext, getContentPane, getDefaultCloseOperation, getDesktopIcon, getDesktopPane, getFocusCycleRootAncestor, getFocusOwner, getFrameIcon, getGlassPane, getInternalFrameListeners, getJMenuBar, getLastCursor, getLayer, getLayeredPane, getMenuBar, getMostRecentFocusOwner, getNormalBounds, getRootPane, getTitle, getUI, getUIClassID, getWarningString, hide, isClosable, isClosed, isFocusCycleRoot, isIcon, isIconifiable, isMaximizable, isMaximum, isResizable, isRootPaneCheckingEnabled, isSelected, moveToBack, moveToFront, pack, paintComponent, paramString, remove, removeInternalFrameListener, reshape, restoreSubcomponentFocus, setClosable, setClosed, setContentPane, setCursor, setDefaultCloseOperation, setDesktopIcon, setFocusCycleRoot, setFrameIcon, setGlassPane, setIcon, setIconifiable, setJMenuBar, setLayer, setLayer, setLayeredPane, setLayout, setMaximizable, setMaximum, setMenuBar, setNormalBounds, setResizable, setRootPane, setRootPaneCheckingEnabled, setSelected, setTitle, setUI, show, toBack, toFront, updateUIMethods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, updateMethods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, transferFocusDownCycle, validate, validateTreeMethods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycleMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface edu.cnu.mdi.sim.ISimulationHost
cancelSimulation, getSimulationContext, getSimulationState, pauseSimulation, resumeSimulation, runSimulation, startSimulation, stopSimulationMethods inherited from interface edu.cnu.mdi.sim.SimulationListener
onCompleted
-
Field Details
-
DEFAULT_NUM_TRIANGLES
public static final int DEFAULT_NUM_TRIANGLESDefault number of triangles per chromosome.- See Also:
-
DEFAULT_POPULATION_SIZE
public static final int DEFAULT_POPULATION_SIZEDefault population size.- See Also:
-
-
Constructor Details
-
ImageEvolutionDemoView
Create the image evolution demo view.- Parameters:
keyVals- standardBaseViewkey-value args
-
-
Method Details
-
onSimulationRefresh
Called on the EDT before the view repaints in response to a refresh.On each refresh:
- Ask the simulation for a copy of the best individual.
- Render it at
DISPLAY_SIZE×DISPLAY_SIZEfor the left panel. - Render all current population individuals as
THUMB_SIZE×THUMB_SIZEthumbnails for the grid. - Push both to
ImageEvolutionPaneland repaint.
All rendering here uses
PolygonChromosome.render(int, int), which allocates a new image — this is intentional for display paths. Fitness evaluation uses the allocation-freePolygonChromosome.renderInto(java.awt.image.BufferedImage, double)path via thread-local buffers.- Overrides:
onSimulationRefreshin classSimulationView
-
onSimulationStateChange
protected void onSimulationStateChange(SimulationContext ctx, SimulationState from, SimulationState to, String reason) Description copied from class:SimulationViewCalled on the EDT after any engine state transition.- Overrides:
onSimulationStateChangein classSimulationView- Parameters:
ctx- simulation contextfrom- previous stateto- new statereason- human-readable transition reason
-
filesDropped
Description copied from class:BaseViewCalled on the EDT when one or more accepted files are dropped on this view.The default implementation is a no-op. Subclasses that have called
BaseView.enableFileDrop(Predicate)should override this method to handle the dropped files. The list is nevernulland is never empty; the filter (if any) has already been applied.- Specified by:
filesDroppedin interfaceIFileDropHandler- Overrides:
filesDroppedin classBaseView- Parameters:
files- the accepted dropped files; nevernull, never empty
-
getViewInfo
Description copied from class:BaseViewOverride to supply structured information for the info dialog. The default returnsnull(no info available).- Overrides:
getViewInfoin classBaseView- Returns:
- view info, or
null
-
requestReset
Request a reset with the given parameters.Implementations should stop the current engine, build a new simulation with the supplied parameters, and restart. This should only be called when the simulation is in a safe state (READY, PAUSED, TERMINATED, or FAILED); the control panel is responsible for enforcing this via button enable/disable logic.
Stops the current engine, builds a new simulation with the supplied parameters, swaps the engine, and restarts against the current target image.
- Specified by:
requestResetin interfaceIImageEvolutionResettable- Parameters:
numTriangles- number of triangles per chromosome (must be > 0)populationSize- number of individuals in the population (must be > 0)fitnessMode- fitness metric for the new run
-