private void drawFans(Graphics2D g) {
		List<Fan> fans = model.getFans();
		if (fans.isEmpty())
			return;
		Stroke oldStroke = g.getStroke();
		Color oldColor = g.getColor();
		Symbol.FanIcon fanIcon = new Symbol.FanIcon(Color.GRAY, Color.BLACK, false);
		synchronized (fans) {
			for (Fan f : fans) {
				if (f.isVisible()) {
					Rectangle2D r = f.getShape().getBounds2D();
					int x = convertPointToPixelX((float) r.getX());
					int y = convertPointToPixelY((float) r.getY());
					int w = convertLengthToPixelX((float) r.getWidth());
					int h = convertLengthToPixelY((float) r.getHeight());
					fanIcon.setIconWidth(w);
					fanIcon.setIconHeight(h);
					fanIcon.setAngle(f.getAngle());
					fanIcon.setSpeed(f.getSpeed());
					fanIcon.setRotation(fanRotationSpeedScaleFactor * f.getSpeed() * model.getTime());
					fanIcon.setStroke(moderateStroke);
					fanIcon.setBorderColor(f == selectedManipulable ? Color.YELLOW : Color.BLACK);
					fanIcon.paintIcon(this, g, x, y);
					Shape s = f.getShape();
					if (s instanceof Rectangle2D.Float) {
						Rectangle2D.Float r2 = (Rectangle2D.Float) s;
						x = convertPointToPixelX(r2.x);
						y = convertPointToPixelY(r2.y);
						w = convertLengthToPixelX(r2.width);
						h = convertLengthToPixelY(r2.height);
						String label = f.getLabel();
						if (label != null)
							drawLabelWithLineBreaks(g, label, x + 0.5f * w, y + 0.5f * h, w < h * 0.25f);
						if (selectedManipulable == f) {
							g.setStroke(longDashed);
							g.drawRect(x, y, w, h);
						}
					}
				}
			}
		}
		g.setStroke(oldStroke);
		g.setColor(oldColor);
	}