File indexing completed on 2024-06-16 04:16:47

0001 /*
0002  * This file is part of Krita
0003  *
0004  * SPDX-FileCopyrightText: 2020 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
0005  *
0006  *  SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #ifndef MULTIGRID_PATTERN_GENERATOR_H
0010 #define MULTIGRID_PATTERN_GENERATOR_H
0011 
0012 #include <QObject>
0013 #include <QVariant>
0014 #include "generator/kis_generator.h"
0015 
0016 class KisConfigWidget;
0017 
0018 /*
0019  * This is de Bruijn's 1981 multigrid approach for generating aperiodic tilings
0020  * of the plane with rhombs. At dimensions 5, offset .2 and .4 this generator
0021  * makes penrose tilings.
0022  * Other configurations show up in nature as quasicrystals.
0023  * 
0024  * Based off the explanation of the algorithm here:
0025  * http://www.physics.emory.edu/faculty/weeks//software/exquasi.html
0026  * With extra explanation here: https://www.schoengeometry.com/c-infintil.html
0027  */
0028 
0029 class KritaMultigridPatternGenerator : public QObject
0030 {
0031     Q_OBJECT
0032 public:
0033     KritaMultigridPatternGenerator(QObject *parent, const QVariantList &);
0034     ~KritaMultigridPatternGenerator() override;
0035 };
0036 
0037 struct KisMultiGridRhomb {
0038     QPolygonF shape;
0039     int parallel1;
0040     int parallel2;
0041     int line1;
0042     int line2;
0043 };
0044 
0045 class KisMultigridPatternGenerator : public KisGenerator
0046 {
0047 public:
0048 
0049     enum Connector{
0050         None,
0051         Acute,
0052         Obtuse,
0053         Cross,
0054         CenterDot,
0055         CornerDot
0056     };
0057 
0058     KisMultigridPatternGenerator();
0059 
0060     using KisGenerator::generate;
0061 
0062     void generate(KisProcessingInformation dst,
0063                   const QSize& size,
0064                   const KisFilterConfigurationSP config,
0065                   KoUpdater* progressUpdater
0066                  ) const override;
0067 
0068     static inline KoID id() {
0069         return KoID("multigrid", i18n("Multigrid"));
0070     }
0071     
0072     KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override;
0073     KisConfigWidget * createConfigurationWidget(QWidget* parent, const KisPaintDeviceSP dev, bool useForMasks) const override;
0074 
0075     // XXX: Fix the generation to work with tiles
0076     virtual bool allowsSplittingIntoPatches() const override { return false; }
0077 
0078 private:
0079     QList<KisMultiGridRhomb> generateRhombs(int lines, int divisions, qreal offset) const;
0080 
0081     QList<int> getIndicesFromPoint(QPointF point, QList<qreal> angles, qreal offset) const;
0082 
0083     /**
0084      * Projects the 5d vertice to a point.
0085      */
0086     QPointF getVertice(QList<int> indices, QList<qreal> angles) const;
0087 };
0088 
0089 #endif