正五角星可分解為 5 個等腰三角形,中心角 72°,頂角 36°。給定一條邊(用戶繪制線段),可推導出其餘 4 個頂點。
P1(x1,y1)、P2(x2,y2),作為五角星的一條邊。L = distance(P1, P2) 和角度 θ = atan2(y2-y1, x2-x1)。R = L / (2 * sin(36°))。O 在邊的中垂線上,距中點 d = R * cos(36°)。O 為圓心,R 為半徑,每隔 72° 取一點,得到 5 個頂點。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));
}
qSin/qCos 使用弧度,QLineF::angle() 返回角度,需 qDegreesToRadians 轉換。