首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Qt 圖形算法實現:根據用戶繪制的線段生成正五角星的幾何構造方法

     編輯:程式設計疑難解答

幾何原理

正五角星可分解為 5 個等腰三角形,中心角 72°,頂角 36°。給定一條邊(用戶繪制線段),可推導出其餘 4 個頂點。

算法步驟

  1. 獲取線段端點 P1(x1,y1)、P2(x2,y2),作為五角星的一條邊。
  2. 計算邊長 L = distance(P1, P2) 和角度 θ = atan2(y2-y1, x2-x1)。
  3. 五角星外接圓半徑 R = L / (2 * sin(36°))。
  4. 中心點 O 在邊的中垂線上,距中點 d = R * cos(36°)。
  5. 以 O 為圓心,R 為半徑,每隔 72° 取一點,得到 5 個頂點。
  6. 按順序連線(跳一個頂點)繪製星形。

Qt 實現關鍵代碼

QPolygonF buildStar(const QLineF& baseLine) {
    qreal L = baseLine.length();
    qreal angle = baseLine.angle(); // 角度制
    qreal R = L / (2 * qSin(qDegreesToRadians(36)));
    QPointF mid = baseLine.center();
    qreal d = R * qCos(qDegreesToRadians(36));
    // 中垂線方向:angle + 90
    QPointF center = mid + QPointF(d * qCos(qDegreesToRadians(angle+90)),
                                   d * qSin(qDegreesToRadians(angle+90)));

    QPolygonF star;
    for (int i = 0; i < 5; ++i) {
        qreal a = qDegreesToRadians(angle + 90 + i * 72); // 起始相位需校準
        star << center + QPointF(R * qCos(a), R * qSin(a));
    }
    // 重排頂點順序以繪製星形(0,2,4,1,3)
    QPolygonF result;
    int order[] = {0,2,4,1,3};
    for (int idx : order) result << star[idx];
    return result;
}

// 繪製
void paintEvent(QPaintEvent*) {
    QPainter painter(this);
    painter.drawPolygon(buildStar(userLine));
}

注意事項

  • 角度單位:Qt qSin/qCos 使用弧度,QLineF::angle() 返回角度,需 qDegreesToRadians 轉換。
  • 頂點順序:直接按圓周序連線得到五邊形,需按「跳一個」順序連線得到星形。
  • 用戶線段方向影響星形朝向,可根據需求固定朝上。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved