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