字符串绕圆心转动,怎样使字符串的书写角度随着转动角度的变化而变化,即字符串的书写方向始终对着圆心
举报
字符串的书写角度
举报
通过 settextstyle 函数,可以设置字符串的书写角度与每个字符的书写角度。以下代码是个简单例子:
#include <graphics.h>
#include <conio.h>
#include <math.h>
const double PI = 3.1415926536;
int main()
{
initgraph(640, 480); // 初始化图形窗口
circle(320, 240, 99);
TCHAR s[10];
double a;
int x, y;
for(int i = 0; i < 12; i++)
{
// 设置文字样式
settextstyle(24, 0, "Verdana", i * 3600 / 12, i * 3600 / 12, 0, false, false, false);
// 生成文字字符串
_itot(i + 101, s, 10);
// 计算圆周位置
a = i * PI * 2 / 12;
x = int(320 + 100 * cos(a));
y = int(240 - 100 * sin(a));
// 输出字符串
outtextxy(x, y, s);
}
getch();
closegraph();
return 0;
}
注意,文字输出的位置,是文字的左上角。因此,当文字旋转到反方向时,会发现与另一侧的文字没有水平对齐。可以进一步用图形学的知识对以上代码进行改进,步骤如下:
- 计算字符串弧度 a。
- 计算字符串宽 w、高 h。
- 计算输出字符串的左上角位置。
- 将字符串绕原点顺时针旋转 a 弧度。
- 将字符串向左上偏移 w/2、h/2。
- 将字符串绕原点逆时针旋转 a 弧度。
- 输出字符串。
以上步骤对应的代码如下:
#include <graphics.h>
#include <conio.h>
#include <math.h>
const double PI = 3.1415926536;
int main()
{
initgraph(640, 480); // 初始化图形窗口
circle(320, 240, 99);
TCHAR s[10];
double a;
int x, y, w, h, x0, y0;
for(int i = 0; i < 12; i++)
{
// 设置文字样式
settextstyle(24, 0, "Verdana", i * 3600 / 12, i * 3600 / 12, 0, false, false, false);
// 生成文字字符串
_itot(i + 101, s, 10);
// 1. 计算字符串弧度 a
a = i * PI * 2 / 12;
// 2. 计算字符串宽 w、高 h
w = textwidth(s);
h = textheight(s);
// 3. 计算输出字符串的左上角位置
x = 100 * cos(a);
y = 100 * sin(a);
// 4. 将字符串绕原点顺时针旋转 a 弧度
x0 = x * cos(-a) - y * sin(-a);
y0 = y * cos(-a) + x * sin(-a);
// 5. 将字符串向左上偏移 w/2、h/2
x0 -= w / 2;
y0 += h / 2; // 绘图坐标向下为正
// 6. 将字符串绕原点逆时针旋转 a 弧度
x = x0 * cos(a) - y0 * sin(a);
y = y0 * cos(a) + x0 * sin(a);
// 7. 输出字符串
outtextxy(int(320 + x + 0.5), int(240 - y + 0.5), s); // 绘图坐标向下为正
}
getch();
closegraph();
return 0;
}