Qt cpp QPainter 实现绘制 。已知 point A(300, 300)、point B(800, 900)。以点B为圆心 ,半径长度为 106画圆。以BA为方向向上30度,向下30度 绘制两条射线 BS1,BS2,求出S1、S2的坐标。
时间: 2024-02-20 20:00:31 浏览: 74
好的,根据你的要求,我来给你解答。
在 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() 函数进行绘制。
阅读全文