@Override
    public boolean touches(@NonNull final Geopoint tapped, @Nullable final ToScreenProjector projector) {
        if (!isValid()) {
            return false;
        }

        final float lineWidthDp = GeoStyle.getStrokeWidth(getStyle());
        final boolean isFilled = GeoStyle.getAlpha(GeoStyle.getFillColor(getStyle())) > 0;
        switch (getType()) {
            case POLYLINE:
                if (GeoItemUtils.touchesMultiLine(getPoints(), tapped, lineWidthDp, projector)) {
                    return true;
                }
                break;
            case POLYGON:
                final boolean touches = GeoItemUtils.touchesPolygon(getPoints(), tapped, lineWidthDp, isFilled, projector);
                boolean touchesAnyHole = false;
                if (touches && getHoles() != null) {
                    for (List<Geopoint> hole : getHoles()) {
                        final boolean touchesHole = GeoItemUtils.touchesPolygon(hole, tapped, 0, true, projector);
                        final boolean touchesHoleLine = GeoItemUtils.touchesMultiLine(hole, tapped, lineWidthDp, projector);
                        if (touchesHole && ! touchesHoleLine) {
                            touchesAnyHole = true;
                            break;
                        }
                    }
                }
                if (touches && !touchesAnyHole) {
                    return true;
                }
                break;
            case CIRCLE:
                if (GeoItemUtils.touchesCircle(tapped, getCenter(), getRadius(), lineWidthDp, isFilled, projector)) {
                    return true;
                }
                break;
            default:
                break;
        }

        if (getIcon() != null) {
            return getIcon().touchesIcon(tapped, getCenter(), projector);
        }

        return false;
    }
This constructor is specifically for creating objects with applied default style
main/src/main/java/cgeo/geocaching/models/geoitem/GeoPrimitive.java