QT绘图螺旋形

#include <QtWidgets>

class SpiralWidget : public QWidget
{
public:
    SpiralWidget(QWidget *parent = nullptr) : QWidget(parent) {}

protected:
    void paintEvent(QPaintEvent *event) override
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.translate(width() / 2, height() / 2); // 将原点移动到窗口中心

        // 绘制螺旋线
        painter.setPen(Qt::black);
        const int numPoints = 1000;
        const qreal step = 0.1;
        qreal angle = 0;
        qreal radius = 0;
        QPoint prevPoint;

        for (int i = 0; i < numPoints; ++i) {
            angle += step;
            radius += 1 * step; // 控制螺旋线的密度和扩展
            int x = radius * cos(angle);
            int y = radius * sin(angle);
            QPoint point(x, y);

            if (i > 0) {
                painter.drawLine(prevPoint, point);
            }

            prevPoint = point;
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    SpiralWidget widget;
    widget.resize(400, 400);
    widget.show();

    return app.exec();
}
  • 方形螺旋线
#include <QtWidgets>

class SquareSpiralWidget : public QWidget
{
public:
    SquareSpiralWidget(QWidget *parent = nullptr) : QWidget(parent) {}

protected:
    void paintEvent(QPaintEvent *event) override
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.translate(width() / 2, height() / 2); // 将原点移动到窗口中心

        // 绘制方形螺旋形
        painter.setPen(Qt::black);

        const int numSteps = 100; // 螺旋的步数
        const qreal stepSize = 10; // 每步的大小

        qreal x = 0, y = 0; // 起始点
        qreal length = stepSize; // 每次扩展的长度

        QPointF prevPoint(x, y);

        // 绘制方形螺旋形
        for (int i = 0; i < numSteps; ++i) {
            // 向右移动
            x += length;
            QPointF point(x, y);
            painter.drawLine(prevPoint, point);
            prevPoint = point;

            // 向上移动
            y += length;
            point = QPointF(x, y);
            painter.drawLine(prevPoint, point);
            prevPoint = point;

            // 增加步长
            length += stepSize;

            // 向左移动
            x -= length;
            point = QPointF(x, y);
            painter.drawLine(prevPoint, point);
            prevPoint = point;

            // 向下移动
            y -= length;
            point = QPointF(x, y);
            painter.drawLine(prevPoint, point);
            prevPoint = point;

            // 增加步长
            length += stepSize;
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    SquareSpiralWidget widget;
    widget.resize(400, 400);
    widget.show();

    return app.exec();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值