class Cylinder implements SelectionArea {

    //Variables
    private static final float[] RECT_POINT = {1, 1};
    //Architecture
    private final GraphIO graphIO;
    private final GraphDrawable drawable;
    private final SelectionManager selectionManager;
    private final VizModel vizModel;
    private final float[] rectangle = new float[2];

    public Cylinder() {
        graphIO = VizController.getInstance().getGraphIO();
        drawable = VizController.getInstance().getDrawable();
        selectionManager = VizController.getInstance().getSelectionManager();
        vizModel = VizController.getInstance().getVizModel();
    }

    @Override
    public float[] getSelectionAreaRectancle() {
        float diameter = selectionManager.getMouseSelectionDiameter();
        if (diameter == 1) {
            //Point
            return RECT_POINT;
        } else {
            float size;
            if (selectionManager.isMouseSelectionZoomProportionnal()) {
                size = diameter * (float) Math.abs(drawable.getDraggingMarkerX());
            } else {
                size = diameter;
            }
            rectangle[0] = size;
            rectangle[1] = size;
            return rectangle;
        }
    }

    @Override
    public float[] getSelectionAreaCenter() {
        return null;
    }

    @Override
    public boolean mouseTest(Vecf distanceFromMouse, NodeModel nodeModel) {
        float diameter = selectionManager.getMouseSelectionDiameter();
        if (diameter == 1) {
            //Point
            return nodeModel.selectionTest(distanceFromMouse, 0);
        } else if (selectionManager.isMouseSelectionZoomProportionnal()) {
            return nodeModel.selectionTest(distanceFromMouse, diameter);
        } else {
            return nodeModel.selectionTest(distanceFromMouse, (float) (diameter / -drawable.getDraggingMarkerX()));
        }
    }

    @Override
    public void drawArea(GL2 gl, GLU glu) {<FILL_FUNCTION_BODY>}

    @Override
    public boolean isEnabled() {
        return selectionManager.isSelectionEnabled();
    }

    @Override
    public boolean blockSelection() {
        return false;
    }
}

        float diameter = selectionManager.getMouseSelectionDiameter();
        if (diameter == 1) {
            //Point
        } else {
            //Cylinder
            float radius;
            if (selectionManager.isMouseSelectionZoomProportionnal()) {
                radius = (float) (diameter * Math.abs(drawable.getDraggingMarkerX()));      //Proportionnal
            } else {
                radius = diameter;      //Constant
            }
            float[] mousePosition = graphIO.getMousePosition();
            float vectorX, vectorY, vectorX1 = mousePosition[0], vectorY1 = mousePosition[1];
            double angle;

            gl.glColor4f(0f, 0f, 0f, 0.2f);
            gl.glBegin(GL2.GL_TRIANGLES);
            for (int i = 0; i <= 360; i++) {
                angle = i / 57.29577957795135f;
                vectorX = mousePosition[0] + (radius * (float) Math.sin(angle));
                vectorY = mousePosition[1] + (radius * (float) Math.cos(angle));
                gl.glVertex2f(mousePosition[0], mousePosition[1]);
                gl.glVertex2f(vectorX1, vectorY1);
                gl.glVertex2f(vectorX, vectorY);
                vectorY1 = vectorY;
                vectorX1 = vectorX;
            }
            gl.glEnd();
        }
    
<no_super_class>