initial commit
This commit is contained in:
34
DoP.pro
Normal file
34
DoP.pro
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
QT += quick
|
||||||
|
|
||||||
|
CONFIG += c++11
|
||||||
|
|
||||||
|
# The following define makes your compiler emit warnings if you use
|
||||||
|
# any Qt feature that has been marked deprecated (the exact warnings
|
||||||
|
# depend on your compiler). Refer to the documentation for the
|
||||||
|
# deprecated API to know how to port your code away from it.
|
||||||
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
|
|
||||||
|
# You can also make your code fail to compile if it uses deprecated APIs.
|
||||||
|
# In order to do so, uncomment the following line.
|
||||||
|
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||||
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
Painty.cpp \
|
||||||
|
main.cpp
|
||||||
|
|
||||||
|
RESOURCES += qml.qrc
|
||||||
|
|
||||||
|
# Additional import path used to resolve QML modules in Qt Creator's code model
|
||||||
|
QML_IMPORT_PATH =
|
||||||
|
|
||||||
|
# Additional import path used to resolve QML modules just for Qt Quick Designer
|
||||||
|
QML_DESIGNER_IMPORT_PATH =
|
||||||
|
|
||||||
|
# Default rules for deployment.
|
||||||
|
qnx: target.path = /tmp/$${TARGET}/bin
|
||||||
|
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||||
|
!isEmpty(target.path): INSTALLS += target
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
Painty.h
|
||||||
61
Painty.cpp
Normal file
61
Painty.cpp
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
#include "Painty.h"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
Painty::Painty()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Painty::setXY(int idx, float x, float y) {
|
||||||
|
if (points.size() < idx+1) {points.resize(idx+1);}
|
||||||
|
points[idx] = QPointF(x,y);
|
||||||
|
emit update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Painty::setSigma(double s) {
|
||||||
|
this->sigma = s;
|
||||||
|
emit update();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
void Painty::paint(QPainter* p) {
|
||||||
|
|
||||||
|
p->setPen(Qt::blue);
|
||||||
|
p->drawLine(0,0,100,100);
|
||||||
|
|
||||||
|
const double s = sigma;
|
||||||
|
|
||||||
|
static QImage img(width(), height(), QImage::Format_ARGB32);
|
||||||
|
std::vector<double> vec;
|
||||||
|
|
||||||
|
if (points.size() < 3) {return;}
|
||||||
|
|
||||||
|
double max = 0;
|
||||||
|
for (int y = 0; y < height(); ++y) {
|
||||||
|
for (int x = 0; x < width(); ++x) {
|
||||||
|
double sum = 0;
|
||||||
|
for (const QPointF p : points) {
|
||||||
|
const double dx = x-p.x();
|
||||||
|
const double dy = y-p.y();
|
||||||
|
const double dist = std::sqrt(dx*dx+dy*dy);
|
||||||
|
sum += 1.0 / std::sqrt(2*M_PI*s*s) * std::exp(- (dist*dist)/(2*s*s) );
|
||||||
|
}
|
||||||
|
vec.push_back(sum);
|
||||||
|
if (sum > max) {max = sum;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t idx = 0; idx < vec.size(); ++idx) {
|
||||||
|
int x = idx % (int) width();
|
||||||
|
int y = idx / width();
|
||||||
|
double h = 1.0 - vec[idx]/max;
|
||||||
|
QColor c = QColor::fromHsvF(h, 0.5, 1);
|
||||||
|
img.setPixelColor(x, y, c);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
p->drawImage(0, 0, img);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
34
Painty.h
Normal file
34
Painty.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef PAINTY_H
|
||||||
|
#define PAINTY_H
|
||||||
|
|
||||||
|
#include <QQuickPaintedItem>
|
||||||
|
#include <QVariant>
|
||||||
|
#include <QObject>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class Painty : public QQuickPaintedItem {
|
||||||
|
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
//Q_PROPERTY(QVariant valX WRITE setX)
|
||||||
|
//Q_PROPERTY(QVariant valY WRITE setY)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<QPointF> points;
|
||||||
|
double sigma = 10;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Painty();
|
||||||
|
void paint(QPainter *painter) override;
|
||||||
|
|
||||||
|
Q_INVOKABLE void setXY(int idx, float x, float y);
|
||||||
|
Q_INVOKABLE void setSigma(double s);
|
||||||
|
|
||||||
|
// void setX(QVariant v);
|
||||||
|
// void setY(QVariant v);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PAINTY_H
|
||||||
22
main.cpp
Normal file
22
main.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
|
#include "Painty.h"
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
|
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
qmlRegisterType<Painty>("bla", 1, 0, "Painty");
|
||||||
|
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
const QUrl url(QStringLiteral("qrc:/main.qml"));
|
||||||
|
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
|
||||||
|
&app, [url](QObject *obj, const QUrl &objUrl) {
|
||||||
|
if (!obj && url == objUrl)
|
||||||
|
QCoreApplication::exit(-1);
|
||||||
|
}, Qt::QueuedConnection);
|
||||||
|
engine.load(url);
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
114
main.qml
Normal file
114
main.qml
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
import QtQuick 2.12
|
||||||
|
import QtQuick.Window 2.12
|
||||||
|
import QtQuick.Controls 2.12
|
||||||
|
import bla 1.0
|
||||||
|
|
||||||
|
Window {
|
||||||
|
visible: true
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
title: qsTr("Hello World")
|
||||||
|
|
||||||
|
property var valuesX: [];
|
||||||
|
property var valuesY: [];
|
||||||
|
|
||||||
|
property int numBalls: 3;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Painty {
|
||||||
|
|
||||||
|
id: painty;
|
||||||
|
anchors.fill: parent;
|
||||||
|
|
||||||
|
Row {
|
||||||
|
Button {
|
||||||
|
text: "+";
|
||||||
|
onClicked: {
|
||||||
|
++numBalls;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
text: "-";
|
||||||
|
onClicked: {
|
||||||
|
--numBalls;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Slider {
|
||||||
|
from: 10;
|
||||||
|
to: 200;
|
||||||
|
onValueChanged: {
|
||||||
|
painty.setSigma(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
|
||||||
|
model: numBalls;
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: 16;
|
||||||
|
height: 16;
|
||||||
|
x: (index+3) * 32;
|
||||||
|
y: (index+3) * 32;
|
||||||
|
color: "red"
|
||||||
|
//Drag.active: parent
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent;
|
||||||
|
drag.target: parent;
|
||||||
|
onPositionChanged: {
|
||||||
|
//valuesX[index] = parent.x;
|
||||||
|
//valuesY[index] = parent.y;
|
||||||
|
//console.log(parent.x + " " + parent.y);
|
||||||
|
//can.requestPaint();
|
||||||
|
painty.setXY(index, parent.x, parent.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
onPaint: {
|
||||||
|
var ctx = getContext("2d");
|
||||||
|
ctx.fillStyle = Qt.rgba(0, 0, 0, 1);
|
||||||
|
ctx.fillRect(0, 0, width, height);
|
||||||
|
|
||||||
|
var w = 300;
|
||||||
|
var h = 300;
|
||||||
|
var img = context.createImageData(w, h);
|
||||||
|
var s = 1;
|
||||||
|
|
||||||
|
for (var y = 0; y < h; ++y) {
|
||||||
|
for (var x = 0; x < w; ++x) {
|
||||||
|
var sum = 0;
|
||||||
|
for (var idx in valuesX) {
|
||||||
|
var x1 = valuesX[idx];
|
||||||
|
var y1 = valuesY[idx];
|
||||||
|
var dx = x-x1;
|
||||||
|
var dy = y-y1;
|
||||||
|
var dist = Math.sqrt(dx*dx + dy*dy);
|
||||||
|
//var p = 1/Math.sqrt(2*Math.PI*s*s)*Math.exp(-(dist*dist)/(2*s*s));
|
||||||
|
sum += 0;
|
||||||
|
}
|
||||||
|
img.data[(x+y*w)*4+0] = 128;
|
||||||
|
img.data[(x+y*w)*4+1] = 64;
|
||||||
|
img.data[(x+y*w)*4+2] = 32;
|
||||||
|
img.data[(x+y*w)*4+3] = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.putImageData(img, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user