如何将三角形(顶点)朝Qt点旋转?

时间:2015-12-29 15:13:50

标签: c++ qt vector rotation

旋转物品存在问题。

我有一个点和一个三角形,需要以其顶点朝向taregt点旋转。图片的右侧表示应该如何,左侧表示它的工作原理。红色虚线箭头表示运动,三角形沿箭头移动。绿色虚线箭头表示旋转,三角形应沿其箭头旋转。 enter image description here

我如何进行计算:

计算所需的速度,即方向

velocity(direction) = Vec2DNormalize(targetPoint - locationPoint) * maxVelocity;

计算目标点和位置点的角度

float angleLoc = atan2(rect->location.y, rect->location.x);

float angleTarg = atan2(rect->target.y, rect->target.x);

减去angleLoc后旋转 - angleTarg

rotate((angleLoc - angleTarg) * 100);

这是源代码。

ster.cpp

#include "steer.h"
#include <QPointF>
#include <QBrush>
#include <QPen>
#include <vector2d.h>
#include <QGraphicsPolygonItem>
#include <QPolygonF>
#include <QPointF>
#include <QGraphicsItem>
#include <QDebug>
#include <cmath>
#include <vector>
#include <QtWidgets>


void Steer::seek()
{
    //calculating desired velocity aka direction
    rect->desired = Vec2DNormalize(rect->target - rect->location) * rect->maxspeed;

    //calculating steering force
    rect->steer = rect->desired - rect->velocity;

    //if the steer force is bgger than maxforce
    rect->steer.Truncate(rect->maxforce);

    //adding to acceleration steering force
    rect->acceleration += rect->steer;

    //add to velocity acceleration which has steering force only
    rect->velocity += rect->acceleration;

    //if the velocity is bgger than maxspeed
    rect->velocity.Truncate(rect->maxspeed);

    //changing our position
    rect->location += rect->velocity;

    //reset the acceleration
    rect->acceleration *= 0;


    viewport()->repaint();
}

Steer::Steer(QGraphicsView *parent)
    : QGraphicsView(parent)
{
    scene = new QGraphicsScene;
    rect = new Vehicle;

    scene->setSceneRect(0, 0, 500, 500);

    polygon <<  QPointF(5.0, 0.0) << QPointF(-5.0, 0.0) <<  QPointF(0.0, 20.0);
    rect->triangle = scene->addPolygon(polygon);

    this->setScene(scene);

    timer = new QTimer(this);
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(seek()));
    timer->start();

    this->show();
}

void Steer::paintEvent(QPaintEvent *)
{
    QPainter painter(viewport());

    painter.setBrush(QBrush(Qt::green));
    painter.setPen(QPen(Qt::black));

    painter.save();

    //moving to position
    painter.translate(rect->location.x, rect->location.y);

    //calculating angles for target point and location point
    float angleLoc = atan2(rect->location.y, rect->location.x);
    float angleTarg = atan2(rect->target.y, rect->target.x);

    //rotating after substracting angleLoc - angleTarg
    painter.rotate((angleLoc - angleTarg) * 100);

    painter.drawPolygon(polygon);

    painter.restore();

    for(int i = 0; i < vec.size(); i++)
        painter.drawEllipse(vec[i].x() - 1, vec[i].y() - 1, 1 * 2.0, 1 * 2.0);
}

void Steer::mousePressEvent(QMouseEvent * click)
{
    point = mapToScene(click->pos());

    vec.push_back(point);

    rect->target.x = point.x();
    rect->target.y = point.y();
}

Here整个项目。

1 个答案:

答案 0 :(得分:1)

问题在于从弧度到度数的转换,加上:您需要90度的偏移或在0度方向(右侧)绘制三角形:

// initially point right
polygon <<  QPointF(20, 0) << QPointF(0, -5) <<  QPointF(0, 5);

// angle -> degrees conversion
const float angle = atan2(vehicle->velocity.y, vehicle->velocity.x);
vehicle->triangle->setRotation(
     angle * 180./3.14);
// but in qt 5 they have this qRadiansToDegrees in <QtMath>