INFO702 - TPs
Loading...
Searching...
No Matches
TP1 Traitement d'images en niveaux de gris (POO simple, surcharge d'opérateurs, entrées/sorties).

1 - Objectifs, pointeurs utiles

L'objectif de ce TP est de vous familiariser avec la programmation objet classique en C++. Il n'y aura pas explicitement de la généricité, mais on définira néanmoins des objets classiques en programmation générique (comme les itérateurs). Ce TP servira de base à l'écriture d'une classe générique image au TP suivant. A l'issue de cette séance, vous maîtriserez:

  • la déclaration d'une classe, de ses constructeurs, de ses données membre, dans un fichier entête.
  • la définition des méthodes de la classe dans un fichier source
  • l'écriture de programmes principaux pour faire des commandes en ligne
  • l'utilisation du container STL vector et du quasi-conteneur string
  • la déclaration de types et de classes internes à une autre classe
  • la lecture et l'écriture dans un flux
  • la surcharge de plusieurs opérateurs (incrémentation ++, décrémentation –, déréférencement *)

Le fil conducteur est l'écriture d'une classe pour représenter les images en niveaux de gris. Vous développerez un certain nombre de services autour de ces images:

  • création d'image vide
  • lecture/écriture d'images PGM (le format le plus simple possible de stockage)
  • filtrage médian
  • rehaussement de contraste par filtrage par convolution
  • histogramme de l'image
  • correction de contraste par égalisation d'histogramme

Les sites suivants pourront être utile pendant le TP:

Note: Tout bon logiciel de manipulation d'image peut importer ou exporter du portable pixmap (PBM, PGM, PPM). Le logiciel ImageMagick (commandes convert et display notamment) est bien pratique pour convertir en ligne de commande une image:

   prompt> convert toto.jpg toto.pgm 
   prompt> display toto.pgm 
Note
Il n'y a pas d'IDE recommandé plus particulièrement qu'un autre, mais je constate:
  • un étudiant sous Linux avec un éditeur de texte et la compilation via make démarre le TP en 5 minutes.
  • un étudiant avec son IDE déjà bien configuré avant d'arriver en TP gagne 1h sur l'étudiant qui installe son IDE pendant le TP.
  • la plupart des étudiants utilisent CodeBlocks, parfois Eclipse, parfois Visual C++
  • Windows entraîne des problèmes supplémentaires: bibliothèques manquantes, programme exécuté qui ne s'arrête jamais (vérifiez votre antivirus, certains avaient des problèmes avec AVAST), gestion des fichiers bizarre (Windows a deux modes: texte et binaire; il faut donc rajouter le mode ios::binary ou ios::text à l'ouverture des fichiers)

2 - Définition d'une classe pour représenter les images

Nous représenterons les images en niveaux de gris de façon classique, avec un tableau de taille W*H de caractères (les niveaux de gris sont un nombre entre 0 et 255), et W et H sont respectivement la largeur et la hauteur de l'image. Vous déclarerez donc la classe GrayLevelImage2D dans un fichier GrayLevelImage2D.hpp. Un extrait du fichier entête donne:

public:
typedef unsigned char GrayLevel; // le type pour les niveaux de gris.
typedef std::vector<GrayLevel> Container;// le type pour stocker les niveaux de gris de l'image.
// Constructeur par défaut
// Constructeur avec taille w x h. Remplit tout avec la valeur g (par défaut 0).
GrayLevelImage2D( int w, int h, GrayLevel g = 0 );
... // du boulot
private:
Container m_data; // mes données; évitera de faire les allocations dynamiques
int m_width; // ma largeur
int m_height; // ma hauteur
};
int w() const
int h() const

On utilisera la classe std::vector de la STL. Cela nous évitera toute allocation dynamique ! Il suffit soit de l'initialiser avec la bonne taille (i.e. donc largeur * hauteur), soit d'appeler vector::resize pour changer la taille. Ecrivez donc cette première version de la classe GrayLevelImage2D, avec les deux constructeurs précisés. Faut-il réécrire le constructeur par copie et l'affectation ?

NB: les méthodes seront écrites dans un fichier source GrayLevelImage2D.cpp.

3 - Accesseurs utiles (taille, valeurs de niveaux de gris).

Le principe est que les valeurs de l'image sont stockées les unes à la suite des autres en balayant l'axe des x d'abord. Par exemple, cela donne les indices suivants dans le tableau m_data:

Pixel (x,y): (0,0) (1,0) ... (w-1,0) (0,1) (1,1) ... (w-1,h-1)
Indice 0 1 w-1 w w+1 w*(h-1)+w-1

On écrira donc une méthode (privée) int index( int x, int y ) const qui retourne l'indice du pixel de coordonnées (x,y).

Cette fonction sera utilisée partout où il faut convertir les coordonnées en l'indice dans m_data.

On ajoutera aussi les méthodes suivantes:

/// @return la largeur de l'image.
int w() const;
/// @return la hauteur de l'image.
int h() const;
/**
Accesseur read-only à la valeur d'un pixel.
@return la valeur du pixel(i,j)
*/
GrayLevel at( int i, int j ) const;
/**
Accesseur read-write à la valeur d'un pixel.
@return une référence à la valeur du pixel(i,j)
*/
GrayLevel& at( int i, int j );

On testera les méthodes précédents en créant un fichier testGrayLevelImage2D.cpp. Vous pourrez utiliser le Makefile suivant:

#############################################################################
# Makefile for building: collider.app/Contents/MacOS/collider
# Generated by qmake (3.1) (Qt 6.5.1)
# Project:  collider.pro
# Template: app
# Command: /opt/homebrew/Cellar/qt/6.5.1_3/bin/qmake -o Makefile collider.pro
#############################################################################

MAKEFILE      = Makefile

EQ            = =

####### Compiler, tools and options

CC            = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
CXX           = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
DEFINES       = -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS        = -pipe -O2 $(EXPORT_ARCH_ARGS) -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk -mmacosx-version-min=13.0 -Wall -Wextra $(DEFINES)
CXXFLAGS      = -pipe -stdlib=libc++ -O2 -std=gnu++1z $(EXPORT_ARCH_ARGS) -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk -mmacosx-version-min=13.0 -Wall -Wextra $(DEFINES)
INCPATH       = -I. -I/opt/homebrew/lib/QtWidgets.framework/Headers -I/opt/homebrew/lib/QtGui.framework/Headers -I/opt/homebrew/lib/QtCore.framework/Headers -I. -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk/System/Library/Frameworks/AGL.framework/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk/System/Library/Frameworks/AGL.framework/Headers -I/opt/homebrew/share/qt/mkspecs/macx-clang -F/opt/homebrew/lib
QMAKE         = /opt/homebrew/Cellar/qt/6.5.1_3/bin/qmake
DEL_FILE      = rm -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p
COPY          = cp -f
COPY_FILE     = cp -f
COPY_DIR      = cp -f -R
INSTALL_FILE  = install -m 644 -p
INSTALL_PROGRAM = install -m 755 -p
INSTALL_DIR   = cp -f -R
QINSTALL      = /opt/homebrew/Cellar/qt/6.5.1_3/bin/qmake -install qinstall
QINSTALL_PROGRAM = /opt/homebrew/Cellar/qt/6.5.1_3/bin/qmake -install qinstall -exe
DEL_FILE      = rm -f
SYMLINK       = ln -f -s
DEL_DIR       = rmdir
MOVE          = mv -f
TAR           = tar -cf
COMPRESS      = gzip -9f
DISTNAME      = collider1.0.0
DISTDIR = /Users/lachaud/ownCloud\ -\ LACHAUD\ Jacques-Olivier@mycore.cnrs.fr/Cours/INFO702/Tests/TP0/.tmp/collider1.0.0
LINK          = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
LFLAGS        = -stdlib=libc++ -headerpad_max_install_names $(EXPORT_ARCH_ARGS) -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk -mmacosx-version-min=13.0 -Wl,-rpath,@executable_path/../Frameworks -Wl,-rpath,/opt/homebrew/lib
LIBS          = $(SUBLIBS) -F/opt/homebrew/lib -framework QtWidgets -framework QtGui -framework AppKit -framework ImageIO -framework Metal -framework QtCore -framework IOKit -framework DiskArbitration -framework AGL -framework OpenGL   
AR            = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar cq
RANLIB        = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib -s
SED           = sed
STRIP         = strip

####### Output directory

OBJECTS_DIR   = ./

####### Files

SOURCES       = collider.cpp \
		objects.cpp qrc_collider.cpp
OBJECTS       = collider.o \
		objects.o \
		qrc_collider.o
DIST          = /opt/homebrew/share/qt/mkspecs/features/spec_pre.prf \
		/opt/homebrew/share/qt/mkspecs/features/device_config.prf \
		/opt/homebrew/share/qt/mkspecs/common/unix.conf \
		/opt/homebrew/share/qt/mkspecs/common/mac.conf \
		/opt/homebrew/share/qt/mkspecs/common/macx.conf \
		/opt/homebrew/share/qt/mkspecs/common/sanitize.conf \
		/opt/homebrew/share/qt/mkspecs/common/gcc-base.conf \
		/opt/homebrew/share/qt/mkspecs/common/gcc-base-mac.conf \
		/opt/homebrew/share/qt/mkspecs/common/clang.conf \
		/opt/homebrew/share/qt/mkspecs/common/clang-mac.conf \
		/opt/homebrew/share/qt/mkspecs/qconfig.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3danimation.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3danimation_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dcore.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dcore_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dextras.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dextras_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dinput.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dinput_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dlogic.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dlogic_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickanimation.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickanimation_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickextras.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickextras_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickinput.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickinput_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickrender.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickrender_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickscene2d.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3drender.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3drender_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bluetooth.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bluetooth_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bodymovin_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_charts.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_charts_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_chartsqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_chartsqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_coap.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_coap_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_concurrent.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_concurrent_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core5compat.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core5compat_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualization.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualization_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualizationqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualizationqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_dbus.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_dbus_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_declarativeopcua.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_declarativeopcua_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designer.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designer_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designercomponents_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_example_icons_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_fb_support_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_grpc.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_grpc_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_gui.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_gui_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_help.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_help_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_httpserver.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_httpserver_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_hunspellinputmethod.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_hunspellinputmethod_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_jsonrpc_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsanimation.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsanimation_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsfolderlistmodel.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsfolderlistmodel_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsqmlmodels.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsqmlmodels_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssettings.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssettings_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssharedimage.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssharedimage_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labswavefrontmesh.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labswavefrontmesh_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_languageserver_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_linguist.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_linguist_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_location.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_location_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_mqtt.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_mqtt_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimedia.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimedia_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediaquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_network.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_network_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_networkauth.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_networkauth_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_nfc.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_nfc_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opcua.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opcua_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opengl.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opengl_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_openglwidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_openglwidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdf.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdf_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfwidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfwidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioning.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioning_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioningquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioningquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_printsupport.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_printsupport_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_protobuf.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_protobuf_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcompiler_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcore.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcore_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmldom_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlintegration.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlintegration_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmllocalstorage.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmllocalstorage_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlmodels.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltest.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltest_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltyperegistrar_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlxmllistmodel.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlxmllistmodel_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3d.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3d_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetimport.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetimport_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetutils.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetutils_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3deffects.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3deffects_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dglslparser_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpers.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpers_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpersimpl.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpersimpl_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3diblbaker.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3diblbaker_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticleeffects.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticleeffects_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticles.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticles_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysics.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysics_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysicshelpers.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysicshelpers_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3druntimerender.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3druntimerender_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dspatialaudio_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dutils.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dutils_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2impl.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2impl_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrolstestutilsprivate_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2quickimpl.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2quickimpl_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2utils.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2utils_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickeffects_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicklayouts.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicklayouts_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickshapes_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktemplates2.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktestutilsprivate_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktimeline.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktimeline_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickwidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjects.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjects_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjectsqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjectsqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_repparser.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_repparser_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxmlqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxmlqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensors.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensors_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensorsquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensorsquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialbus.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialbus_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialport.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialport_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_shadertools.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_shadertools_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_spatialaudio.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_spatialaudio_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sql.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sql_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachine.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachine_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachineqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachineqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svg.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svg_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svgwidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svgwidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_testlib.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_testlib_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_texttospeech.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_tools_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uiplugin.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uitools.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uitools_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_virtualkeyboard.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_virtualkeyboard_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webchannel.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webchannel_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginecore.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginecore_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequickdelegatesqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequickdelegatesqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginewidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginewidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_websockets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_websockets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webview.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webview_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webviewquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webviewquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_widgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_widgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_xml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_xml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinbluetoothpermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincalendarpermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincamerapermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincontactspermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinlocationpermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinmicrophonepermission.pri \
		/opt/homebrew/share/qt/mkspecs/features/qt_functions.prf \
		/opt/homebrew/share/qt/mkspecs/features/qt_config.prf \
		/opt/homebrew/share/qt/mkspecs/macx-clang/qmake.conf \
		/opt/homebrew/share/qt/mkspecs/features/spec_post.prf \
		.qmake.stash \
		/opt/homebrew/share/qt/mkspecs/features/exclusive_builds.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/sdk.prf \
		/opt/homebrew/share/qt/mkspecs/features/toolchain.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/toolchain.prf \
		/opt/homebrew/share/qt/mkspecs/features/default_pre.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/default_pre.prf \
		/opt/homebrew/share/qt/mkspecs/features/resolve_config.prf \
		/opt/homebrew/share/qt/mkspecs/features/default_post.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/default_post.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/objective_c.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/mac.prf \
		/opt/homebrew/share/qt/mkspecs/features/warn_on.prf \
		/opt/homebrew/share/qt/mkspecs/features/permissions.prf \
		/opt/homebrew/share/qt/mkspecs/features/qt.prf \
		/opt/homebrew/share/qt/mkspecs/features/resources_functions.prf \
		/opt/homebrew/share/qt/mkspecs/features/resources.prf \
		/opt/homebrew/share/qt/mkspecs/features/moc.prf \
		/opt/homebrew/share/qt/mkspecs/features/unix/opengl.prf \
		/opt/homebrew/share/qt/mkspecs/features/uic.prf \
		/opt/homebrew/share/qt/mkspecs/features/unix/thread.prf \
		/opt/homebrew/share/qt/mkspecs/features/qmake_use.prf \
		/opt/homebrew/share/qt/mkspecs/features/file_copies.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/rez.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/asset_catalogs.prf \
		/opt/homebrew/share/qt/mkspecs/features/testcase_targets.prf \
		/opt/homebrew/share/qt/mkspecs/features/exceptions.prf \
		/opt/homebrew/share/qt/mkspecs/features/yacc.prf \
		/opt/homebrew/share/qt/mkspecs/features/lex.prf \
		collider.pro objects.hpp collider.cpp \
		objects.cpp
QMAKE_TARGET  = collider
DESTDIR       = 
TARGET        = collider.app/Contents/MacOS/collider

####### Custom Variables
EXPORT_QMAKE_MAC_SDK = macosx
EXPORT_QMAKE_MAC_SDK_VERSION = 13.3
EXPORT_QMAKE_XCODE_DEVELOPER_PATH = /Applications/Xcode.app/Contents/Developer
EXPORT__QMAKE_STASH_ = /Users/lachaud/ownCloud - LACHAUD Jacques-Olivier@mycore.cnrs.fr/Cours/INFO702/Tests/TP0/.qmake.stash
EXPORT_VALID_ARCHS = arm64
EXPORT_DEFAULT_ARCHS = arm64
EXPORT_ARCHS = $(filter $(EXPORT_VALID_ARCHS), $(if $(ARCHS), $(ARCHS), $(if $(EXPORT_DEFAULT_ARCHS), $(EXPORT_DEFAULT_ARCHS), $(EXPORT_VALID_ARCHS))))
EXPORT_ARCH_ARGS = $(foreach arch, $(if $(EXPORT_ARCHS), $(EXPORT_ARCHS), $(EXPORT_VALID_ARCHS)), -arch $(arch))
EXPORT__PRO_FILE_ = /Users/lachaud/ownCloud - LACHAUD Jacques-Olivier@mycore.cnrs.fr/Cours/INFO702/Tests/TP0/collider.pro


include /opt/homebrew/share/qt/mkspecs/features/mac/sdk.mk
first: all
####### Build rules

collider.app/Contents/MacOS/collider:  $(OBJECTS)  
	@test -d collider.app/Contents/MacOS/ || mkdir -p collider.app/Contents/MacOS/
	$(LINK) $(LFLAGS) -o $(TARGET)  $(OBJECTS) $(OBJCOMP) $(LIBS)

Makefile: collider.pro /opt/homebrew/share/qt/mkspecs/macx-clang/qmake.conf /opt/homebrew/share/qt/mkspecs/features/spec_pre.prf \
		/opt/homebrew/share/qt/mkspecs/features/device_config.prf \
		/opt/homebrew/share/qt/mkspecs/common/unix.conf \
		/opt/homebrew/share/qt/mkspecs/common/mac.conf \
		/opt/homebrew/share/qt/mkspecs/common/macx.conf \
		/opt/homebrew/share/qt/mkspecs/common/sanitize.conf \
		/opt/homebrew/share/qt/mkspecs/common/gcc-base.conf \
		/opt/homebrew/share/qt/mkspecs/common/gcc-base-mac.conf \
		/opt/homebrew/share/qt/mkspecs/common/clang.conf \
		/opt/homebrew/share/qt/mkspecs/common/clang-mac.conf \
		/opt/homebrew/share/qt/mkspecs/qconfig.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3danimation.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3danimation_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dcore.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dcore_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dextras.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dextras_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dinput.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dinput_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dlogic.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dlogic_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickanimation.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickanimation_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickextras.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickextras_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickinput.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickinput_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickrender.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickrender_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickscene2d.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3drender.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3drender_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bluetooth.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bluetooth_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bodymovin_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_charts.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_charts_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_chartsqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_chartsqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_coap.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_coap_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_concurrent.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_concurrent_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core5compat.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core5compat_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualization.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualization_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualizationqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualizationqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_dbus.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_dbus_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_declarativeopcua.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_declarativeopcua_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designer.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designer_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designercomponents_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_example_icons_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_fb_support_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_grpc.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_grpc_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_gui.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_gui_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_help.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_help_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_httpserver.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_httpserver_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_hunspellinputmethod.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_hunspellinputmethod_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_jsonrpc_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsanimation.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsanimation_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsfolderlistmodel.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsfolderlistmodel_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsqmlmodels.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsqmlmodels_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssettings.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssettings_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssharedimage.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssharedimage_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labswavefrontmesh.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labswavefrontmesh_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_languageserver_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_linguist.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_linguist_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_location.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_location_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_mqtt.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_mqtt_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimedia.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimedia_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediaquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_network.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_network_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_networkauth.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_networkauth_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_nfc.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_nfc_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opcua.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opcua_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opengl.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opengl_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_openglwidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_openglwidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdf.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdf_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfwidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfwidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioning.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioning_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioningquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioningquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_printsupport.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_printsupport_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_protobuf.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_protobuf_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcompiler_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcore.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcore_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmldom_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlintegration.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlintegration_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmllocalstorage.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmllocalstorage_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlmodels.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltest.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltest_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltyperegistrar_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlxmllistmodel.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlxmllistmodel_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3d.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3d_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetimport.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetimport_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetutils.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetutils_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3deffects.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3deffects_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dglslparser_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpers.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpers_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpersimpl.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpersimpl_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3diblbaker.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3diblbaker_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticleeffects.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticleeffects_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticles.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticles_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysics.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysics_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysicshelpers.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysicshelpers_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3druntimerender.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3druntimerender_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dspatialaudio_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dutils.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dutils_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2impl.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2impl_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrolstestutilsprivate_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2quickimpl.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2quickimpl_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2utils.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2utils_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickeffects_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicklayouts.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicklayouts_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickshapes_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktemplates2.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktestutilsprivate_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktimeline.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktimeline_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickwidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjects.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjects_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjectsqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjectsqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_repparser.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_repparser_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxmlqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxmlqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensors.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensors_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensorsquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensorsquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialbus.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialbus_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialport.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialport_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_shadertools.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_shadertools_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_spatialaudio.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_spatialaudio_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sql.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sql_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachine.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachine_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachineqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachineqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svg.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svg_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svgwidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svgwidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_testlib.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_testlib_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_texttospeech.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_tools_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uiplugin.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uitools.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uitools_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_virtualkeyboard.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_virtualkeyboard_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webchannel.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webchannel_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginecore.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginecore_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequickdelegatesqml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequickdelegatesqml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginewidgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginewidgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_websockets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_websockets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webview.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webview_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webviewquick.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webviewquick_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_widgets.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_widgets_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_xml.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_lib_xml_private.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinbluetoothpermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincalendarpermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincamerapermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincontactspermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinlocationpermission.pri \
		/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinmicrophonepermission.pri \
		/opt/homebrew/share/qt/mkspecs/features/qt_functions.prf \
		/opt/homebrew/share/qt/mkspecs/features/qt_config.prf \
		/opt/homebrew/share/qt/mkspecs/macx-clang/qmake.conf \
		/opt/homebrew/share/qt/mkspecs/features/spec_post.prf \
		.qmake.stash \
		/opt/homebrew/share/qt/mkspecs/features/exclusive_builds.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/sdk.prf \
		/opt/homebrew/share/qt/mkspecs/features/toolchain.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/toolchain.prf \
		/opt/homebrew/share/qt/mkspecs/features/default_pre.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/default_pre.prf \
		/opt/homebrew/share/qt/mkspecs/features/resolve_config.prf \
		/opt/homebrew/share/qt/mkspecs/features/default_post.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/default_post.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/objective_c.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/mac.prf \
		/opt/homebrew/share/qt/mkspecs/features/warn_on.prf \
		/opt/homebrew/share/qt/mkspecs/features/permissions.prf \
		/opt/homebrew/share/qt/mkspecs/features/qt.prf \
		/opt/homebrew/share/qt/mkspecs/features/resources_functions.prf \
		/opt/homebrew/share/qt/mkspecs/features/resources.prf \
		/opt/homebrew/share/qt/mkspecs/features/moc.prf \
		/opt/homebrew/share/qt/mkspecs/features/unix/opengl.prf \
		/opt/homebrew/share/qt/mkspecs/features/uic.prf \
		/opt/homebrew/share/qt/mkspecs/features/unix/thread.prf \
		/opt/homebrew/share/qt/mkspecs/features/qmake_use.prf \
		/opt/homebrew/share/qt/mkspecs/features/file_copies.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/rez.prf \
		/opt/homebrew/share/qt/mkspecs/features/mac/asset_catalogs.prf \
		/opt/homebrew/share/qt/mkspecs/features/testcase_targets.prf \
		/opt/homebrew/share/qt/mkspecs/features/exceptions.prf \
		/opt/homebrew/share/qt/mkspecs/features/yacc.prf \
		/opt/homebrew/share/qt/mkspecs/features/lex.prf \
		collider.pro \
		collider.qrc \
		/opt/homebrew/lib/QtWidgets.framework/Resources/QtWidgets.prl \
		/opt/homebrew/lib/QtGui.framework/Resources/QtGui.prl \
		/opt/homebrew/lib/QtCore.framework/Resources/QtCore.prl
	$(QMAKE) -o Makefile collider.pro
/opt/homebrew/share/qt/mkspecs/features/spec_pre.prf:
/opt/homebrew/share/qt/mkspecs/features/device_config.prf:
/opt/homebrew/share/qt/mkspecs/common/unix.conf:
/opt/homebrew/share/qt/mkspecs/common/mac.conf:
/opt/homebrew/share/qt/mkspecs/common/macx.conf:
/opt/homebrew/share/qt/mkspecs/common/sanitize.conf:
/opt/homebrew/share/qt/mkspecs/common/gcc-base.conf:
/opt/homebrew/share/qt/mkspecs/common/gcc-base-mac.conf:
/opt/homebrew/share/qt/mkspecs/common/clang.conf:
/opt/homebrew/share/qt/mkspecs/common/clang-mac.conf:
/opt/homebrew/share/qt/mkspecs/qconfig.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3danimation.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3danimation_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dcore.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dcore_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dextras.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dextras_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dinput.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dinput_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dlogic.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dlogic_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquick.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquick_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickanimation.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickanimation_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickextras.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickextras_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickinput.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickinput_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickrender.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickrender_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickscene2d.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3dquickscene2d_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3drender.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_3drender_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bluetooth.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bluetooth_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_bodymovin_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_charts.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_charts_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_chartsqml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_chartsqml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_coap.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_coap_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_concurrent.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_concurrent_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core5compat.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core5compat_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_core_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualization.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualization_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualizationqml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_datavisualizationqml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_dbus.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_dbus_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_declarativeopcua.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_declarativeopcua_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designer.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designer_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_designercomponents_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_example_icons_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_fb_support_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_grpc.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_grpc_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_gui.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_gui_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_help.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_help_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_httpserver.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_httpserver_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_hunspellinputmethod.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_hunspellinputmethod_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_jsonrpc_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsanimation.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsanimation_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsfolderlistmodel.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsfolderlistmodel_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsqmlmodels.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labsqmlmodels_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssettings.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssettings_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssharedimage.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labssharedimage_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labswavefrontmesh.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_labswavefrontmesh_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_languageserver_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_linguist.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_linguist_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_location.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_location_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_mqtt.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_mqtt_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimedia.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimedia_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediaquick_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediawidgets.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_network.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_network_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_networkauth.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_networkauth_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_nfc.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_nfc_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opcua.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opcua_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opengl.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_opengl_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_openglwidgets.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_openglwidgets_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdf.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdf_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfquick.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfquick_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfwidgets.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_pdfwidgets_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioning.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioning_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioningquick.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_positioningquick_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_printsupport.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_printsupport_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_protobuf.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_protobuf_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcompiler_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcore.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlcore_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmldebug_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmldom_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlintegration.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlintegration_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmllocalstorage.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmllocalstorage_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlmodels.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltest.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltest_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmltyperegistrar_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlxmllistmodel.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_qmlxmllistmodel_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3d.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3d_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetimport.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetimport_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetutils.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dassetutils_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3deffects.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3deffects_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dglslparser_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpers.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpers_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpersimpl.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dhelpersimpl_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3diblbaker.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3diblbaker_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticleeffects.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticleeffects_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticles.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dparticles_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysics.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysics_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysicshelpers.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dphysicshelpers_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3druntimerender.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3druntimerender_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dspatialaudio_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dutils.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick3dutils_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quick_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2impl.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrols2impl_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickcontrolstestutilsprivate_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2quickimpl.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2quickimpl_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2utils.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickdialogs2utils_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickeffects_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicklayouts.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicklayouts_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickparticles_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickshapes_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktemplates2.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktestutilsprivate_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktimeline.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quicktimeline_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickwidgets.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjects.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjects_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjectsqml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_remoteobjectsqml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_repparser.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_repparser_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxmlqml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_scxmlqml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensors.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensors_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensorsquick.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sensorsquick_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialbus.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialbus_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialport.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_serialport_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_shadertools.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_shadertools_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_spatialaudio.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_spatialaudio_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sql.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_sql_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachine.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachine_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachineqml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_statemachineqml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svg.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svg_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svgwidgets.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_svgwidgets_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_testlib.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_testlib_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_texttospeech.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_texttospeech_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_tools_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uiplugin.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uitools.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_uitools_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_virtualkeyboard.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_virtualkeyboard_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webchannel.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webchannel_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginecore.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginecore_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequick.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequick_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequickdelegatesqml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginequickdelegatesqml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginewidgets.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webenginewidgets_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_websockets.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_websockets_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webview.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webview_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webviewquick.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_webviewquick_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_widgets.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_widgets_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_xml.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_lib_xml_private.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinbluetoothpermission.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincalendarpermission.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincamerapermission.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwincontactspermission.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinlocationpermission.pri:
/opt/homebrew/share/qt/mkspecs/modules/qt_plugin_qdarwinmicrophonepermission.pri:
/opt/homebrew/share/qt/mkspecs/features/qt_functions.prf:
/opt/homebrew/share/qt/mkspecs/features/qt_config.prf:
/opt/homebrew/share/qt/mkspecs/macx-clang/qmake.conf:
/opt/homebrew/share/qt/mkspecs/features/spec_post.prf:
.qmake.stash:
/opt/homebrew/share/qt/mkspecs/features/exclusive_builds.prf:
/opt/homebrew/share/qt/mkspecs/features/mac/sdk.prf:
/opt/homebrew/share/qt/mkspecs/features/toolchain.prf:
/opt/homebrew/share/qt/mkspecs/features/mac/toolchain.prf:
/opt/homebrew/share/qt/mkspecs/features/default_pre.prf:
/opt/homebrew/share/qt/mkspecs/features/mac/default_pre.prf:
/opt/homebrew/share/qt/mkspecs/features/resolve_config.prf:
/opt/homebrew/share/qt/mkspecs/features/default_post.prf:
/opt/homebrew/share/qt/mkspecs/features/mac/default_post.prf:
/opt/homebrew/share/qt/mkspecs/features/mac/objective_c.prf:
/opt/homebrew/share/qt/mkspecs/features/mac/mac.prf:
/opt/homebrew/share/qt/mkspecs/features/warn_on.prf:
/opt/homebrew/share/qt/mkspecs/features/permissions.prf:
/opt/homebrew/share/qt/mkspecs/features/qt.prf:
/opt/homebrew/share/qt/mkspecs/features/resources_functions.prf:
/opt/homebrew/share/qt/mkspecs/features/resources.prf:
/opt/homebrew/share/qt/mkspecs/features/moc.prf:
/opt/homebrew/share/qt/mkspecs/features/unix/opengl.prf:
/opt/homebrew/share/qt/mkspecs/features/uic.prf:
/opt/homebrew/share/qt/mkspecs/features/unix/thread.prf:
/opt/homebrew/share/qt/mkspecs/features/qmake_use.prf:
/opt/homebrew/share/qt/mkspecs/features/file_copies.prf:
/opt/homebrew/share/qt/mkspecs/features/mac/rez.prf:
/opt/homebrew/share/qt/mkspecs/features/mac/asset_catalogs.prf:
/opt/homebrew/share/qt/mkspecs/features/testcase_targets.prf:
/opt/homebrew/share/qt/mkspecs/features/exceptions.prf:
/opt/homebrew/share/qt/mkspecs/features/yacc.prf:
/opt/homebrew/share/qt/mkspecs/features/lex.prf:
collider.pro:
collider.qrc:
/opt/homebrew/lib/QtWidgets.framework/Resources/QtWidgets.prl:
/opt/homebrew/lib/QtGui.framework/Resources/QtGui.prl:
/opt/homebrew/lib/QtCore.framework/Resources/QtCore.prl:
qmake: FORCE
	@$(QMAKE) -o Makefile collider.pro

qmake_all: FORCE

collider.app/Contents/PkgInfo: 
	@test -d collider.app/Contents || mkdir -p collider.app/Contents
	@$(DEL_FILE) collider.app/Contents/PkgInfo
	@echo "APPL????" > collider.app/Contents/PkgInfo
collider.app/Contents/Info.plist: 
	@test -d collider.app/Contents || mkdir -p collider.app/Contents
	@$(DEL_FILE) collider.app/Contents/Info.plist
	@plutil -convert xml1 -o - /opt/homebrew/share/qt/mkspecs/macx-clang/Info.plist.app | sed -e "s,@SHORT_VERSION@,1.0,g" -e "s,\$${QMAKE_SHORT_VERSION},1.0,g" -e "s,@FULL_VERSION@,1.0.0,g" -e "s,\$${QMAKE_FULL_VERSION},1.0.0,g" -e "s,@TYPEINFO@,????,g" -e "s,\$${QMAKE_PKGINFO_TYPEINFO},????,g" -e "s,@BUNDLEIDENTIFIER@,com.yourcompany.collider,g" -e "s,\$${PRODUCT_BUNDLE_IDENTIFIER},com.yourcompany.collider,g" -e "s,\$${MACOSX_DEPLOYMENT_TARGET},13.0,g" -e "s,\$${IPHONEOS_DEPLOYMENT_TARGET},,g" -e "s,\$${TVOS_DEPLOYMENT_TARGET},,g" -e "s,\$${WATCHOS_DEPLOYMENT_TARGET},,g" -e "s,\$${IOS_LAUNCH_SCREEN},LaunchScreen,g" -e "s,@ICON@,,g" -e "s,\$${ASSETCATALOG_COMPILER_APPICON_NAME},,g" -e "s,@EXECUTABLE@,collider,g" -e "s,@LIBRARY@,collider,g" -e "s,\$${EXECUTABLE_NAME},collider,g" -e "s,@TYPEINFO@,????,g" -e "s,\$${QMAKE_PKGINFO_TYPEINFO},????,g" >collider.app/Contents/Info.plist

all: Makefile \
		collider.app/Contents/PkgInfo \
		collider.app/Contents/Info.plist collider.app/Contents/MacOS/collider

dist: distdir FORCE
	(cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR)

distdir: FORCE
	@test -d $(DISTDIR) || mkdir -p $(DISTDIR)
	$(COPY_FILE) --parents $(DIST) $(DISTDIR)/
	$(COPY_FILE) --parents collider.qrc $(DISTDIR)/
	$(COPY_FILE) --parents /opt/homebrew/share/qt/mkspecs/features/data/dummy.cpp $(DISTDIR)/
	$(COPY_FILE) --parents objects.hpp $(DISTDIR)/
	$(COPY_FILE) --parents collider.cpp objects.cpp $(DISTDIR)/


clean: compiler_clean 
	-$(DEL_FILE) $(OBJECTS)
	-$(DEL_FILE) *~ core *.core


distclean: clean 
	-$(DEL_FILE) -r collider.app
	-$(DEL_FILE) .qmake.stash
	-$(DEL_FILE) Makefile


####### Sub-libraries

xcodeproj:
	@$(QMAKE) -spec macx-xcode "$(EXPORT__PRO_FILE_)"

mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean

mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all

check: first

benchmark: first

compiler_rcc_make_all: qrc_collider.cpp
compiler_rcc_clean:
	-$(DEL_FILE) qrc_collider.cpp
qrc_collider.cpp: collider.qrc \
		/opt/homebrew/share/qt/libexec/rcc \
		images/asteroid.gif \
		images/stars.jpg
	/opt/homebrew/share/qt/libexec/rcc -name collider collider.qrc -o qrc_collider.cpp

compiler_moc_predefs_make_all: moc_predefs.h
compiler_moc_predefs_clean:
	-$(DEL_FILE) moc_predefs.h
moc_predefs.h: /opt/homebrew/share/qt/mkspecs/features/data/dummy.cpp
	/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -pipe -stdlib=libc++ -O2 -std=gnu++1z $(EXPORT_ARCH_ARGS) -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk -mmacosx-version-min=13.0 -Wall -Wextra -dM -E -o moc_predefs.h /opt/homebrew/share/qt/mkspecs/features/data/dummy.cpp

compiler_moc_header_make_all:
compiler_moc_header_clean:
compiler_moc_objc_header_make_all:
compiler_moc_objc_header_clean:
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all:
compiler_uic_clean:
compiler_rez_source_make_all:
compiler_rez_source_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean: compiler_rcc_clean compiler_moc_predefs_clean 

####### Compile

collider.o: collider.cpp /opt/homebrew/lib/QtWidgets.framework/Headers/QtWidgets \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtwidgetsglobal.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qabstractbutton.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qabstractitemdelegate.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qabstractitemview.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qabstractscrollarea.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qabstractslider.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qabstractspinbox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qaccessiblewidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qaction.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qactiongroup.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qapplication.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qboxlayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qbuttongroup.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcalendarwidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcheckbox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcolordialog.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcolormap.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcolumnview.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcombobox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcommandlinkbutton.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcommonstyle.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qcompleter.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qdatawidgetmapper.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qdatetimeedit.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qdial.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qdialog.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qdialogbuttonbox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qdockwidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qdrawutil.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qerrormessage.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qfiledialog.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qfileiconprovider.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qfilesystemmodel.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qfocusframe.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qfontcombobox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qfontdialog.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qformlayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qframe.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgesture.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgesturerecognizer.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsanchorlayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicseffect.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsgridlayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsitem.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsitemanimation.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicslayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicslayoutitem.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicslinearlayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsproxywidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsscene.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicssceneevent.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicstransform.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsview.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicswidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgridlayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgroupbox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qheaderview.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qinputdialog.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qitemdelegate.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qitemeditorfactory.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qkeysequenceedit.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qlabel.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qlayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qlayoutitem.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qlcdnumber.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qlineedit.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qlistview.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qlistwidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qmainwindow.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qmdiarea.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qmdisubwindow.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qmenu.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qmenubar.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qmessagebox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qplaintextedit.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qprogressbar.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qprogressdialog.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qproxystyle.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qpushbutton.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qradiobutton.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qrubberband.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qscrollarea.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qscrollbar.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qscroller.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qscrollerproperties.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qshortcut.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qsizegrip.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qsizepolicy.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qslider.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qspinbox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qsplashscreen.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qsplitter.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstackedlayout.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstackedwidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstatusbar.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstyle.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstyleditemdelegate.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstylefactory.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstyleoption.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstylepainter.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstyleplugin.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qsystemtrayicon.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtabbar.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtableview.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtablewidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtabwidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtextbrowser.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtextedit.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtoolbar.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtoolbox.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtoolbutton.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtooltip.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtreeview.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtreewidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtreewidgetitemiterator.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qtwidgetsversion.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qundoview.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qwhatsthis.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qwidget.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qwidgetaction.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qwizard.h \
		objects.hpp \
		/opt/homebrew/lib/QtWidgets.framework/Headers/QGraphicsItem
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o collider.o collider.cpp

objects.o: objects.cpp /opt/homebrew/lib/QtWidgets.framework/Headers/QGraphicsScene \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsscene.h \
		/opt/homebrew/lib/QtCore.framework/Headers/QRandomGenerator \
		/opt/homebrew/lib/QtCore.framework/Headers/qrandom.h \
		/opt/homebrew/lib/QtGui.framework/Headers/QPainter \
		/opt/homebrew/lib/QtGui.framework/Headers/qpainter.h \
		/opt/homebrew/lib/QtWidgets.framework/Headers/QStyleOption \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qstyleoption.h \
		objects.hpp \
		/opt/homebrew/lib/QtWidgets.framework/Headers/QGraphicsItem \
		/opt/homebrew/lib/QtWidgets.framework/Headers/qgraphicsitem.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o objects.o objects.cpp

qrc_collider.o: qrc_collider.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o qrc_collider.o qrc_collider.cpp

####### Install

install:  FORCE

uninstall:  FORCE

FORCE:

.SUFFIXES:

Il vous suffira alors à vous de taper la commande make dans votre terminal pour que tout soit compilé.

Le programme principal testGrayLevelImage2D.cpp contiendra au moins:

GrayLevelImage2D img( 8, 8, 5 ); // imagette 8x8 remplie de 5
for ( int y = 0; y < img.h(); ++y )
for ( int x = 0; x < img.w(); ++x )
std::cout << " " << (int) img.at( x, y ); // la conversion permet de voir les caractères sous forme d'entiers.
std::cout << std::endl;

qui devra fonctionner et afficher (bien sûr):

 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5

4 - Un iterateur pour les images

Le programme précédent montre comment accéder pixel par pixel à l'image. L'avantage est que l'on donne un sens géométrique aux indices dans le tableau. C'est donc tout à fait pertinent dans les cas où la position géométrique du pixel doit être exploité. En revanche, il existe un certain nombre d'algorithmes où l'on ne fait que traiter en séquence les valeurs de pixel, sans se préoccuper de leur position. On peut citer:

  • remplissage avec un valeur
  • seuillage de l'image (toutes les valeurs inférieurs à s sont noires, les autres blanches), par exemple par la méthode d'Otsu.
  • copie de l'image
  • calcul de l'histogramme
  • égalisation
  • correction gamma
  • import/export dans les formats de données "bruts".
  • ...

Dans ce cas, il est utile de pouvoir énumérer (le plus rapidement possible) les valeurs de l'image, comme si on parcourait directement le tableau m_data.

Pour faire tout cela proprement, on introduit une classe Iterator, interne à GrayLevelImage2D, que l'on fait dériver de std::vector<GrayLevelImage2D>::iterator. Cela permet de récupérer tous les services usuels des itérateurs, en ajoutant des possibilités supplémentaires si on veut faire évoluer nos itérateurs. On écrira donc:

...
struct Iterator : public Container::iterator {
// Constructeur à partir d'une image et des coordonnées d'un pixel (x,y).
// NB: doit appeler le constructeur de la superclasse.
Iterator( GrayLevelImage2D& Image, int x, int y );
};
...
};

Il ne reste plus qu'à écrire le constructeur de Iterator à partir d'une image et des coordonnées d'un pixel. Attention dans GrayLevelImage2D.cpp, le prototype du constructeur de Iterator est:

GrayLevelImage2D::Iterator::Iterator( GrayLevelImage2D& Image, int x, int y )
...

On utilisera d'une part la méthode std::vector::begin() appliquée au vecteur m_data pour récupérer un itérateur sur le début du tableau, puis il suffira d'additionner l'indice du pixel (x,y) pour décaler l'itérateur au bon endroit.

Il suffit maintenant d'écrire une méthode Iterator start( int x, int y ) dans GrayLevelImage2D qui fabrique l'itérateur qui pointe sur la valeur du pixel (x,y) (c'est juste le bon appel du constructeur de Iterator), puis les méthodes begin et end qui sont des cas particuliers de start.

Iterator begin(); // pixel (0,0) -> le tout premier
Iterator end(); // pixel (0,h) -> juste après le dernier (pareil que (w,h-1)).
Iterator start( int x, int y );

Avec cela, on peut remplacer l'affichage de la section précédente (3 - Accesseurs utiles (taille, valeurs de niveaux de gris).) par le code suivant:

for ( GrayLevelImage2D::Iterator it = img.begin(), itE = img.end(); it != itE; ++it )
std::cout << " " << (int) *it; // la conversion permet de voir les caractères sous forme d'entiers.

5 - Import / Export en format PGM

Le format PGM [http://fr.wikipedia.org/wiki/Portable_pixmap PBM image format] permet de stocker très simplement les images en niveaux de gris sous forme de fichier. Le format PGM a deux formes, selon que les valeurs sont stockées en clair sous forme ASCII (le fichier est lisible et éditable, mais prend 3 fois plus de place sur le disque), ou stockées en format brut octet par octet.

Exemple d'une image 256 x 256 stockée sous forme ascii.

P2
# CREATOR: XV Version 3.10a  Rev: 12/29/94 (PNG patch 1.2)
256 256
255
0 0 1 10 53 67 45 0 12 12 ...

Exemple d'une image 256 x 256 stockée sous forme brute.

P5
# CREATOR: XV Version 3.10a  Rev: 12/29/94 (PNG patch 1.2)
256 256
255
... le reste est illisible         

Nous allons utiliser les flux (stream) pour représenter les fichiers en entrée ou en sortie. On incluera les entêtes suivants:

#include <string> // chaînes de caractères
#include <fstream> // flux sur les fichiers
#include <sstream> // flux sur les chaînes de caractères

On écrira donc les méthodes suivantes pour la classe GrayLevelImage2D.

bool importPGM( std::istream & input );
bool exportPGM( std::ostream & output, bool ascii_mode = true ) const;

Maintenant, pour ouvrir un fichier "toto.pgm" en lecture on écrira:

// Ouvre le flux en entrée sur le fichier "toto.pgm"
ifstream input( "toto.pgm", std::ios::binary ); // le ios::binary est nécessaire seulement sous Windows.
// teste si tout va bien
if ( ! input.good() ) std::cerr << "Probleme !";

Une fois qu'un flux est ouvert, c'est facile de lire dedans avec les opérateuurs de flux >> et std::getline.

// par exemple, lit un entier:
int i;
input >> i;
// par exemple, lit un mot (s'arrête à un caractères de séparation.
std::string s;
input >> s;
// par exemple, lit toute une ligne dans une chaîne de caractères.
std::getline( input, str );
if (( str != "" ) && (str[0]=='#'))
std::cout << "C'est un commentaire ! J'ignore superbement";

On peut aussi utiliser une chaîne de caractères comme un flux, grâce aux classes istringstream et ostringstream. Ainsi, la chaîne "123 45 54" est décomposée en trois entiers ainsi:

std::string s( "123 45 54" );
std::istringstream istr( s );
int x,y,z;
istr >> x >> y >> z; // x=123, y=45, z=54.

Ecrire les méthodes bool importPGM( std::istream & input ) et bool exportPGM( std::ostream & output, bool ascii_mode ) const de la classe GrayLevelImage2D, en utilisant les flux.

On pourra maintenant lire un fichier image "lena.pgm" ainsi:

ifstream input( "lena.pgm" );
bool ok = img.importPGM( input );
if ( !ok ) std::cerr << "Hum !" << std::endl;
input.close();

On testera nos fonctions avec le mini-programme double-brightness.cpp suivant, qui double la brillance d'une image:

// double-brightness.cpp
#include <iostream>
#include <fstream>
#include "GrayLevelImage2D.hpp"
using namespace std;
int main( int argc, char** argv )
{
typedef GrayLevelImage2D::GrayLevel GrayLevel;
typedef GrayLevelImage2D::Iterator Iterator;
if ( argc < 3 )
{
std::cerr << "Usage: double-brightness <input.pgm> <output.pgm>" << std::endl;
return 0;
}
ifstream input( argv[1] ); // récupère le 1er argument.
bool ok = img.importPGM( input );
if ( !ok )
{
std::cerr << "Error reading input file." << std::endl;
return 1;
}
input.close();
for ( Iterator it = img.begin(), itE = img.end(); it != itE; ++it )
{
*it = ( 2 * (int)(*it) ) % 256;
}
ofstream output( argv[2] ); // récupère le 2ème argument.
ok = img.exportPGM( output, false );
if ( !ok )
{
std::cerr << "Error writing output file." << std::endl;
return 1;
}
output.close();
return 0;
}
Iterator begin()
[gli2d-sec3]

N'oubliez pas de mettre à jour le Makefile. Si vous l'exécutez sur l'image "lena.pgm", l'affichage donne:

Image lena.pgm après appel de double-brightness.
Note
Important. Lorsque vous lisez un fichier sous forme ASCII pour récupérez des nombres ou des chaînes de caractères, vous voulez que les espaces ne soient pas des données mais juste des séparateurs. Pour être sûr d'avoir ce comportement (qui est celui par défaut), on écrit la commande suivante dans le flux d'entrée:
input >> std::skipws;

A l'inverse, lorsque vous lisez des données brutes comme des suites d'octets, vous voulez que les espaces soient bien l'octet 32 et non des séparateurs, pareil pour les retours chariots (13). Pour être sûr d'avoir ce comportement, on écrit la commande suivante dans le flux d'entrée:

input >> std::noskipws;

N'oubliez pas des les utiliser à bon escient dans la fonction bool importPGM( std::istream & input ).

Note
Dans cette question, il suffit d'utiliser les itérateurs pour lire ou écrire dans les images.

6 - Filtrage médian

Le filtrage médian est un algorithme très simple d'élimination de bruit dans une image. Il est très pertinent pour ce que l'on appelle le bruit impulsionnel, causé par des capteurs défectueux, ce qui sature ou désature complètement la valeur de certains pixels (ils deviennent tout blanc ou tout noir).

Son principe est le suivant. On se donne un voisinage autour de chaque pixel (par exemple un voisinage 3x3). On met toutes les valeurs de ces pixels dans un tableau (ici 9 valeurs). On remplace la valeur du pixel par la valeur médiane des valeurs du tableau (On peut par exemple trier le tableau et prendre la 5ème valeur).

Implémenter un algorithme de filtrage médian sous forme de commande en-ligne filtrage-median similaire à double-brightness. On pourra donner en plus un paramètre entier k, qui indique la taille du voisinage (2k+1 x 2k+1) autour de chaque point.

pourcentage de pixels "bruités" image source taille voisinage résultat médian
10% 3x3
50% 7x7
90% 31x31
Note
Pour trier un tableau (ou un vector), n'oubliez pas d'utiliser la fonction std::sort définie dans le header <algorithm>. Par exemple, on peut écrire:
double x[] = { 0.4, 13.2, 5.7, 4.2, 8.6 };
std::sort( x, x+5 ); // x vaut { 0.4, 4.2, 5.7, 8.6, 13.2 };
double med = x[ 2 ]; // valeur médiane
Note
Attention, dans cette question, on ne peut se contenter des itérateurs pour parcourir l'image, il faudra aussi faire des accès directs dans l'image avec des coordonnées pour obtenir la valeur du pixel (méthode GrayLevelImage2D::at). Attention aussi aux pixels proches du bord de l'image, leur voisinage est alors plus limité.

7 - Histogramme et Histogramme cumulé d'une image.

L'histogramme d'une image \(I\) en 256 niveaux de gris est une fonction \(h_I\) qui associe à chaque niveau de gris i la proportion de pixels qui ont exactement ce niveau de gris:

\[ h_I: \{0,\ldots,255 \} \rightarrow \lbrack 0,1 \rbrack, \quad i \mapsto h_I( i ) = \frac{\#\{(x,y), I(x,y)=i \}}{\#\{(x,y)\}} \]

où # désigne le nombre d'éléments d'un ensemble et les (x,y) sont les pixels de l'image. En un sens, c'est la probabilité qu'un pixel pris au hasard ait un niveau de gris donné. Un autre outil important est l'histogramme cummulé \(H_I\) d'une image \(I\). Il s'agit simplement d'associer à chaque niveau de gris i la proportion de pixels qui ont ce niveau de gris ou moins.

\[ H_I: \{0,\ldots,255 \} \rightarrow \lbrack 0,1 \rbrack, \quad i \mapsto H_I( i ) = \frac{\#\{(x,y), I(x,y) \le i \}}{\#\{(x,y)\}} \]

On note facilement que \( H_I(g) = \sum_{i=0}^g h_I(i) \).

Un histogramme est dit bien balancé si à peu près tous les niveaux de gris sont équiprobables. En général, une bonne photo a un histogramme bien balancé. Une photo sous-exposée a tendance à avoir un histogramme décalé vers les niveaux de gris sombres, tandis qu'un photo sur-exposée a tendance à avoir un histogramme décalé vers les niveaux de gris clairs.

Image lena.pgm
Histogramme (à gauche) et histogramme cumulé (à droite)

Or, on peut corriger automatiquement une image pour que son histogramme soit bien balancé. Cette opération s'appelle égalisation d'histogramme. Comment est-ce possible ? Il suffit de trouver une fonction \( f: \{0,\ldots,255\} \rightarrow \{0,\ldots,255\} \) qui transforme les niveaux de gris de façon à éclaircir ou assombrir au besoin l'image. Quelle est la bonne fonction f ? On la trouve en remarquant que l'histogramme cumulé d'une image bien balancée est la simplement la fonction \( i \mapsto i/255 \). On écrit donc:

\[ \frac{i}{255} = H_{f \circ I}(i) \quad = \frac{\#\{(x,y), f \circ I(x,y) \le i \}}{\#\{(x,y)\}} \quad = \frac{\#\{(x,y), I(x,y) \le f^{-1}(i) \}}{\#\{(x,y)\}} \quad = H_{I}( f^{-1}(i)) \]

En posant \( j=f^{-1}(i) \), il vient \( i = f(j) \), et l'équation précédente s'écrit:

\[ \frac{f(j)}{255} = H_{I}( j ) \]

La fonction d'égalisation f est donc tout simplement :

\[ f : j \mapsto f(j) = 255 \times H_{I}( j ) \]

Ecrivez une classe Histogramme qui contiendra deux tableaux de 256 entrées double, l'un pour \(h_I\), l'autre pour \(H_I\). Cette classe aura une méthode void init( GrayLevelImage2D & img ), qui parcourera l'image pour calculer son histogramme et son histogramme cummulé.

Ecrivez alors la méthode int egalisation( int j ) const dans la classe Histogramme, qui est simplement la fonction f ci-dessus. Il ne vaut reste plus qu'à faire le programme egalise.cpp qui utilise cette fonction d'égalisation sur tous les pixels de l'image. Sur l'image lena.pgm (légèrement sous-exposée) cela donne:

NB: On pourra regarder avec gimp l'histogramme des images (menu Couleurs > Niveaux).

image source image égalisée
Note
Dans cette question, les itérateurs suffisent pour lire les valeurs des pixels ou ensuite les modifier dans l'égalisation.

8 - Rehaussement de contraste par filtrage par convolution

Une autre façon de traiter les images est de corriger les valeurs d'un pixel en fonction de la valeur de ses voisins et de lui-même. En générale la transformation ne dépend pas de la position du pixel dans l'image. On parle alors de convolution spatiale. Par exemple, si on suppose qu'on ne regarde que la valeur des 8 voisins plus de soi-même, on représente le filtre de convolution par une matrice 3x3:

\[ A := \begin{array}{|c|c|c|} \hline a_{-1,-1} & a_{0,-1} & a_{1,-1} \\ \hline a_{-1,0} & a_{0,0} & a_{1,0} \\ \hline a_{-1,1} & a_{0,1} & a_{1,1} \\ \hline \end{array}\]

La valeur du pixel \( p(x,y) \) est calculée en prenant les valeurs des pixels autour multipliées par le poids correspondant dans la matrice \(A\). Autrement dit:

\[ p(x,y) := a_{-1,-1} p(x-1,y-1) + a_{0,-1} p(x,y-1) + a_{1,-1} p(x+1,y-1) + \cdots + a_{1,1} p(x+1,y+1) \]

Pour implémenter un filtre de convolution, il suffit donc juste de faire le calcul précédent pour chaque pixel.

Ci-dessous, quelques exemples de filtre "classiques":

\[ M :=\begin{array}{|c|c|c|}\hline 1/9 & 1/9 & 1/9 \\ \hline 1/9 & 1/9 & 1/9 \\ \hline 1/9 & 1/9 & 1/9 \\ \hline \end{array} \qquad L :=\begin{array}{|c|c|c|}\hline 0 & -1/4 & 0 \\ \hline -1/4 & 1 & -1/4 \\ \hline 0 & -1/4 & 0 \\ \hline \end{array} \]

Le filtre M moyenne les valeurs autour de chaque pixel et rend l'image un peu plus floue, tout en éliminant des bruits dans l'image. Le filtre L, dit "Laplacien", produit une image avec des valeurs positives ou négatives. Il détecte en fait les contours de l'image. Il vaut 0 là où l'image est homogène (plus précisément là où l'image est un aplat linéaire), et est différent de 0 là où il y a des fortes variations.

Pour rehausser les contrastes, c'est-à-dire rendre l'image plus nette, un moyen est d'additionner à l'image ses propres contours (ou un coefficient fois les contours). On fabrique donc le filtre \( R_\alpha \) en additionnant au filtre identité Id un coefficient \( \alpha \) fois la matrice laplacien L. Le filtre identité vaut simplement 1 au milieu et 0 ailleurs. On obtient donc:

\[ R_\alpha := \begin{array}{|c|c|c|}\hline 0 & -\alpha/4 & 0 \\ \hline -\alpha/4 & 1+\alpha & -\alpha/4 \\ \hline 0 & -\alpha/4 & 0 \\ \hline \end{array} \]

Ci-dessous quelques exemples. Vous pourrez tester plusieurs \( \alpha \).

image source image floutée par M image plus nette par \( R_\alpha \)

Ecrivez donc un programme qui permet à l'utilisateur de rendre une image plus nette, en fonction d'un coefficient \( \alpha \) donné en paramètre par l'utilisateur.

Note
Attention, dans cette question, on ne peut se contenter des itérateurs pour parcourir l'image, il faudra aussi faire des accès directs dans l'image avec des coordonnées pour obtenir la valeur du pixel (méthode GrayLevelImage2D::at).

9 - Générateur de bruit

Mais pourquoi voudrait-on abîmer les images ? Une raison académique: pour tester ensuite les algorithmes de filtrage de bruit et de restauration. Une autre raison est parfois esthétique, par exemple pour donner l'illusion qu'une image fabriquée par ordinateur est une vraie photo. Le code ci-dessous vous montre comment on a généré le bruit impulsionnel ci-dessus.

// bruit-impulsionnel.cpp
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <algorithm>
#include "GrayLevelImage2D.hpp"
using namespace std;
double rand01()
{
return (double)random() / (double)RAND_MAX;
}
int main( int argc, char** argv )
{
typedef GrayLevelImage2D::GrayLevel GrayLevel;
typedef GrayLevelImage2D::Iterator Iterator;
if ( argc < 3 )
{
std::cerr << "Usage: bruit-impulsionnel <input.pgm> <output.pgm> <prob>" << std::endl;
return 0;
}
ifstream input( argv[1] ); // récupère le 1er argument.
bool ok = img.importPGM( input );
if ( !ok )
{
std::cerr << "Error reading input file." << std::endl;
return 1;
}
input.close();
double prob = (argc > 3) ? atof( argv[ 3 ] ) : 0.01; // récupère la probabilité de bruit
for ( Iterator it = img.begin(), itE = img.end(); it != itE; ++it )
{
if ( rand01() < prob )
{ // sature dans un sens (noir=0) ou l'autre (blanc=255)
*it = ( rand01() < 0.5 ) ? 0 : 255;
}
}
ofstream output( argv[2] ); // récupère le 2ème argument.
ok = img.exportPGM( output, false );
if ( !ok )
{
std::cerr << "Error writing output file." << std::endl;
return 1;
}
output.close();
return 0;
}

Il est plus réaliste d'appliquer un bruit Gaussien sur les images, c'est-à-dire une perturbation de la valeur de gris par un écart qui suit une loi normale (ou Gaussienne). La méthode de Box-Muller est la plus simple pour le faire. Elle créé deux valeurs aléatoires qui suivent une loi normale à partir de deux valeurs qui suivent une loi uniforme (genre rand01()).

Ecrivez donc la commande bruit-gaussien.cpp en modifiant le fichier bruit-impulsionnel.cpp ci-dessus.