举报

字符串的书写角度

1

字符串绕圆心转动,怎样使字符串的书写角度随着转动角度的变化而变化,即字符串的书写方向始终对着圆心

ava
酒窝里有酒

2019-11-17

举报
2

通过 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;
}

注意,文字输出的位置,是文字的左上角。因此,当文字旋转到反方向时,会发现与另一侧的文字没有水平对齐。可以进一步用图形学的知识对以上代码进行改进,步骤如下:

  1. 计算字符串弧度 a。
  2. 计算字符串宽 w、高 h。
  3. 计算输出字符串的左上角位置。
  4. 将字符串绕原点顺时针旋转 a 弧度。
  5. 将字符串向左上偏移 w/2、h/2。
  6. 将字符串绕原点逆时针旋转 a 弧度。
  7. 输出字符串。

以上步骤对应的代码如下:

#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;
}
ava
慢羊羊

2019-11-17

技术讨论社区