Chapter 24 · 基础图元

弧线

绘制圆弧——进度环、仪表盘、加载动画的核心图元。理解弧度制与角度参数。

24

概念:弧度制

XGE 的弧线使用弧度(radians)而非角度。完整圆 = 2π 弧度 = 360°。0 弧度指向右方(3 点钟方向),顺时针增长(Y 轴向下时)。

角度转弧度:弧度 = 角度 × π / 180。XGE 提供 3.14159265f 常量。

API 速查

函数说明
void xgeShapeArc(float fX, float fY, float fRadius, float fStartRadians, float fEndRadians, float fWidth, uint32_t iColor)绘制弧线(世界坐标)
void xgeShapeArcPx(float fX, float fY, float fRadius, float fStartRadians, float fEndRadians, float fWidth, uint32_t iColor)绘制弧线(像素坐标)

编译本章示例

gcc -O2 -I. -o ch24.exe ch24_main.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch24.exe

示例 1:基本弧线

// 半圆弧(上半圆):从 180° 到 360°
xgeShapeArc(400, 300, 100.0f,
    3.14159265f,           // 起始:180°(左)
    2 * 3.14159265f,     // 结束:360°(右)
    4.0f,            // 线宽
    0x4FD8C2FF);

// 四分之一弧(右下角)
xgeShapeArc(400, 300, 60.0f,
    0,               // 0°(右)
    3.14159265f / 2,   // 90°(下)
    3.0f, 0xFFB454FF);

示例 2:加载动画(旋转弧)

static int onFrame(void* pUser) {
    xgeClear(0x081114FF);

    double t = xgeTimer();
    float start = (float)(t * 3.0);  // 旋转速度
    float sweep = 3.14159265f * 1.5f;     // 270° 弧

    xgeShapeArc(400, 300, 50.0f,
        start, start + sweep,
        6.0f, 0x6DB3F2FF);

    return XGE_OK;
}

示例 3:进度环

float fProgress = 0.72f;  // 72%
float fEnd = fProgress * 2.0f * 3.14159265f;

// 背景环(灰色完整圆)
xgeShapeArc(400, 300, 80.0f, 0, 2*3.14159265f, 10.0f, 0x333333FF);

// 进度弧(从顶部开始,-90° 偏移)
float offset = -3.14159265f / 2.0f;
xgeShapeArc(400, 300, 80.0f, offset, offset + fEnd, 10.0f, 0x4FD8C2FF);

完整代码

将以下代码保存为 ch24_main.c,编译后运行即可看到动态弧线进度环:

#include "xge.h"
#include <math.h>

static int onFrame(void* pUser) {
    (void)pUser;
    double t = xgeTimer();
    xgeClear(0x081114FF);

    // 动态进度环(0~360° 循环)
    float progress = (float)fmod(t * 0.3, 1.0);
    float endAngle = progress * 360.0f;

    // 背景环(完整圆)
    xgeShapeArc(400, 300, 100, 0.0f, 360.0f, 8.0f, 0x1A2A30FF);

    // 进度弧线
    xgeShapeArc(400, 300, 100, -90.0f, endAngle, 8.0f, 0x4FD8C2FF);

    return XGE_OK;
}

int main(void) {
    xge_desc_t d = {0};
    d.iWidth  = 800;
    d.iHeight = 600;
    d.sTitle  = "ch24 - Arc";
    d.iFlags  = XGE_INIT_VSYNC;
    xgeInit(&d);
    xgeRun(onFrame, NULL);
    xgeUnit();
    return 0;
}

代码讲解

  • xgeShapeArc(cx, cy, r, startAngle, sweepAngle, width, color) 绘制圆弧,角度单位为度。
  • 起始角 -90° 使弧线从12点方向开始(类似时钟)。
  • fmod(t*0.3, 1.0) 生成 0~1 循环进度,约 3.3 秒一圈。
  • 背景环用深色绘制完整 360°,进度环叠加在其上。

要点与陷阱

  • 弧度不是角度:90° = π/2 ≈ 1.5708。忘记转换是最常见的错误。
  • 起始方向:0 弧度 = 右方(3 点钟)。要从顶部开始需偏移 -π/2。
  • 弧线没有填充:Arc 只有描边(线宽)。需要填充扇形用 xgeShapePieFill(第 27 章)。
  • Start > End:允许起始角大于结束角,此时弧线逆时针绘制。
  • 超过 2π:End - Start > 2π 时绘制完整圆。

进阶练习

  1. 实现一个倒计时环:弧线从满到空,最后 3 秒变红。
  2. 绘制仪表盘:270° 弧 + 指针,根据数值变化。
  3. 实现多段彩色弧:将一个圆分成 N 段,每段不同颜色。
弧线效果
图:弧线渲染效果