У меня проблема с вращающимися деталями.Как повернуть треугольник (точка вершины) к точке в Qt?
У меня есть точка и треугольник, который необходимо повернуть с его вершиной в сторону точки тарегта. Правая часть изображения представляет собой то, как она должна быть, а левая сторона представляет, как она работает. Красные пунктирные стрелки представляют движение, треугольник перемещается вдоль его стрелки. Зеленая пунктирная стрелка представляет собой поворот, треугольник должен вращаться вдоль его стрелки.
Как мне делать расчеты:
счетные нужную скорость ака направление
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 весь проект.
Это проще, чтобы сформировать вектор от середины базы в треугольнике до точки к точке. Затем вы можете просто нормализовать этот вектор и умножить его на высоту треугольника, чтобы вычислить вектор от середины до кончика треугольника. – user2672165
Как получить положение средней точки в Qt? Я думал о предложенном вами решении, но как получить точную позицию? – Mikhail