2015-12-29 5 views
0

У меня проблема с вращающимися деталями.Как повернуть треугольник (точка вершины) к точке в Qt?

У меня есть точка и треугольник, который необходимо повернуть с его вершиной в сторону точки тарегта. Правая часть изображения представляет собой то, как она должна быть, а левая сторона представляет, как она работает. Красные пунктирные стрелки представляют движение, треугольник перемещается вдоль его стрелки. Зеленая пунктирная стрелка представляет собой поворот, треугольник должен вращаться вдоль его стрелки. 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 весь проект.

+0

Это проще, чтобы сформировать вектор от середины базы в треугольнике до точки к точке. Затем вы можете просто нормализовать этот вектор и умножить его на высоту треугольника, чтобы вычислить вектор от середины до кончика треугольника. – user2672165

+0

Как получить положение средней точки в Qt? Я думал о предложенном вами решении, но как получить точную позицию? – Mikhail

ответ

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> 
+0

Я пытался сделать это в течение недели! – Mikhail

Смежные вопросы