旋转物品存在问题。
我有一个点和一个三角形,需要以其顶点朝向taregt点旋转。图片的右侧表示应该如何,左侧表示它的工作原理。红色虚线箭头表示运动,三角形沿箭头移动。绿色虚线箭头表示旋转,三角形应沿其箭头旋转。
我如何进行计算:
计算所需的速度,即方向
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整个项目。
答案 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>