Qt cpp QPainter 实现绘制 。已知 point A(300, 300)、point B(800, 900)。以点B为圆心 求BA的弧度
时间: 2024-02-20 19:00:47 浏览: 65
首先需要计算出向量 BA 的坐标差 dx 和 dy,即:
dx = 800 - 300 = 500
dy = 900 - 300 = 600
然后可以通过 atan2 函数计算 BA 向量与 x 轴正方向之间的弧度,代码如下:
```cpp
#include <cmath>
// 计算弧度
double radian = std::atan2(dy, dx);
```
得到的弧度值是一个介于 [-π, π] 的值,如果需要将其转换为 [0, 2π] 的范围,可以使用如下代码:
```cpp
// 将弧度转换为 [0, 2π] 的范围
if (radian < 0) {
radian += 2 * M_PI;
}
```
其中 M_PI 是常量,表示圆周率 π 的值。最终得到的 radian 就是 BA 向量与 x 轴正方向之间的弧度了。
相关问题
Qt cpp QPainter 实现绘制 。已知 point A(300, 300)、point B(800, 900)。以点B为圆心 ,半径长度为 106画圆。以BA为方向向上30度,向下30度 绘制两条射线 BS1,BS2,求出S1、S2的坐标。
好的,根据你的要求,我来给你解答。
在 Qt cpp 中,我们可以使用 QPainter 类来进行绘图操作。首先,我们需要在绘图设备上创建一个 QPainter 对象,在这里我们可以使用 QWidget 或者 QPixmap 作为绘图设备。
下面是实现绘制的代码:
```cpp
QPainter painter(this); // 创建 QPainter 对象,并指定绘图设备为当前窗口
painter.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿
QPen pen(Qt::red); // 创建画笔对象,设置颜色为红色
pen.setWidth(2); // 设置画笔宽度为 2
painter.setPen(pen); // 设置画笔
QPointF pointA(300, 300); // 创建点 A
QPointF pointB(800, 900); // 创建点 B
painter.drawEllipse(pointB, 106, 106); // 以点 B 为圆心,半径长度为 106 画圆
QLineF lineBA(pointB, pointA); // 创建线段 BA
double angle = lineBA.angle(); // 计算 BA 与水平方向的夹角
QLineF lineS1 = lineBA.translated(0, -106); // 创建向上 30 度的射线 BS1
QPointF pointS1 = lineS1.p2(); // 计算 S1 的坐标
QLineF lineS2 = lineBA.translated(0, 106); // 创建向下 30 度的射线 BS2
QPointF pointS2 = lineS2.p2(); // 计算 S2 的坐标
painter.drawLine(lineS1); // 绘制射线 BS1
painter.drawLine(lineS2); // 绘制射线 BS2
painter.drawPoint(pointS1); // 绘制点 S1
painter.drawPoint(pointS2); // 绘制点 S2
```
其中,QPainter 对象的构造函数需要传入一个指向绘图设备的指针,这里我们使用 this 指针表示当前窗口。setRenderHint() 函数用于设置绘图选项,这里我们开启了抗锯齿选项,以获得更加平滑的绘图效果。QPen 对象用于设置画笔,其构造函数需要传入一个 Qt::GlobalColor 枚举值表示颜色,setWidth() 函数用于设置画笔宽度。drawEllipse() 函数用于绘制圆,其第一个参数为圆心坐标,第二个和第三个参数分别为椭圆的长轴和短轴。QLineF 对象用于表示线段,其构造函数需要传入两个 QPointF 对象表示起点和终点,angle() 函数用于计算线段与水平方向的夹角。translated() 函数用于创建平移后的线段,其第一个和第二个参数分别表示水平和竖直方向的平移距离。p2() 函数用于获取线段的终点,即 S1 和 S2 的坐标。drawLine() 函数用于绘制线段,drawPoint() 函数用于绘制点。
上面的代码可以实现绘制图形和计算 S1 和 S2 的坐标,如果你需要在窗口中显示这个图形,可以将上面的代码放在 paintEvent() 函数中,如下所示:
```cpp
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QPen pen(Qt::red);
pen.setWidth(2);
painter.setPen(pen);
QPointF pointA(300, 300);
QPointF pointB(800, 900);
painter.drawEllipse(pointB, 106, 106);
QLineF lineBA(pointB, pointA);
double angle = lineBA.angle();
QLineF lineS1 = lineBA.translated(0, -106);
QPointF pointS1 = lineS1.p2();
QLineF lineS2 = lineBA.translated(0, 106);
QPointF pointS2 = lineS2.p2();
painter.drawLine(lineS1);
painter.drawLine(lineS2);
painter.drawPoint(pointS1);
painter.drawPoint(pointS2);
}
```
这样,在窗口显示时,窗口会自动调用 paintEvent() 函数进行绘制。
Qt cpp QPainter 实现绘制 。已知 point A、point B。以点B为顶点绘制等腰三角形SA。SA的腰长为106,底边长为80,SA高的方向为BA所在直线。求出SA 三个顶点的坐标。 并使用QPainter绘制
以下是实现绘制的代码示例:
```cpp
void Widget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
// 已知点A和点B的坐标
QPoint A(100, 100);
QPoint B(200, 200);
// 求出BA直线的斜率k
qreal k = (B.y() - A.y()) / (B.x() - A.x());
// 求出SA底边的中点M坐标
QPoint M((A.x() + B.x()) / 2, (A.y() + B.y()) / 2);
// 求出SA高H的长度
qreal H = sqrt(pow(106, 2) - pow(80 / 2, 2));
// 求出SA顶点C的坐标
QPoint C(M.x() + H / sqrt(1 + pow(k, 2)), M.y() + k * (C.x() - M.x()));
// 求出SA另外一个顶点D的坐标
QPoint D(2 * M.x() - C.x(), 2 * M.y() - C.y());
// 使用QPainter绘制三角形
QPainter painter(this);
painter.setPen(QPen(Qt::black, 2));
painter.drawLine(A, B);
painter.drawLine(B, C);
painter.drawLine(C, D);
}
```
运行程序后,会绘制出以点B为顶点的等腰三角形SA,三个顶点的坐标分别为A、C、D。
阅读全文