Qt之绘制椭圆、椭圆弧上任意点

参考代码

void MainWindow::paintEvent(QPaintEvent *event)
{
    event->accept();
 
    QPainter painter(this);
    painter.setPen(QPen(Qt::red,2));
    //移动坐标中心点到窗口中心,默认左上角为起点,往右下为正方向
    painter.translate(width()/2,height()/2);
    //画一个圆,圆心为起点(上一步移动到的正中),半径100px
    const int A=150; //横轴
    const int B=100; //竖轴
    painter.drawEllipse(QPoint(0,0),A,B);
    //计算45度角圆边上的点,角度需要转换为弧度
    const double a=qDegreesToRadians((double)45);
    const int R=A*B/sqrt(pow(A*sin(a),2)+pow(B*cos(a),2)); //计算对应角度的半径
    const int x=0+R*cos(a);
    const int y=0+R*sin(a);
    //因为屏幕坐标系y轴正方向和笛卡尔坐标系相反,所以y取反就是我们要的结果了
    painter.drawLine(QPoint(0,0),QPoint(x,-y)); //y取反
}

运行效果

在这里插入图片描述

参考

Qt绘图:求圆和椭圆上任意角度点的坐标

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Qt的绘图功能来利用dxf文件中的信息绘制椭圆。以下是一个基本的示例代码: ```cpp #include <QtWidgets> QList<QPointF> parseDXF(const QString& filePath) { QList<QPointF> points; QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return points; QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); if (line.startsWith("ELLIPSE")) { // 解析椭圆的参数 qreal centerX, centerY, majorAxisX, majorAxisY, minorAxisRatio, startAngle, endAngle; // 解析代码略,根据DXF文件格式解析出参数值 // 将椭圆的中心坐标添加到列表中 points.append(QPointF(centerX, centerY)); } } file.close(); return points; } class Widget : public QWidget { public: Widget(QWidget* parent = nullptr) : QWidget(parent) { setFixedSize(400, 400); } protected: void paintEvent(QPaintEvent* event) override { Q_UNUSED(event) QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QList<QPointF> points = parseDXF("your_file.dxf"); for (const QPointF& point : points) { // 绘制椭圆 painter.drawEllipse(point, 50, 30); } } }; int main(int argc, char** argv) { QApplication app(argc, argv); Widget widget; widget.show(); return app.exec(); } ``` 上述代码中的 `parseDXF` 函数用于解析dxf文件,并从文件中提取椭圆的中心坐标。`Widget` 类是一个继承自 `QWidget` 的自定义窗口部件,其中的 `paintEvent` 函数用于绘制椭圆。您需要将 `your_file.dxf` 替换为您实际的dxf文件路径。 请注意,上述代码仅提供了一个基本的示例,您可能需要根据您的具体需求进行适当的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值