绘制圆内多边形,边数从键盘内获取
时间: 2023-04-05 14:02:02 浏览: 65
可以使用正多边形的内切圆来绘制圆内多边形,根据输入的边数n,计算出正多边形的内角度数为360/n,然后计算出内切圆的半径r,即r=sqrt(2-2*cos(360/n))/2,最后根据内切圆的半径和圆心坐标,计算出多边形各个顶点的坐标即可。
相关问题
使用EasyX库用C语言设计一个绘制多边形的程序。并且满足以下要求:用鼠标左键可以绘制任意个多边形;过程中要显示绘制路径,鼠标右键结束绘制,绘制结束后 ,填充多边形内部; 按键盘S键将已绘制完成的多边形坐标保存到文件中,按键盘L键从文件中读取已保存的多边形坐标,再显示在界面上。
好的,以下是实现该程序的代码:
```c
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 1000 // 最大顶点数
#define FILE_NAME "polygons.txt" // 保存多边形坐标的文件名
// 定义多边形结构体
typedef struct {
int num_vertices; // 顶点数
int x[MAX_VERTICES]; // 顶点的x坐标
int y[MAX_VERTICES]; // 顶点的y坐标
} Polygon;
Polygon polygons[MAX_VERTICES]; // 存放多边形的数组
int num_polygons = 0; // 已绘制的多边形数
// 绘制多边形
void DrawPolygon(Polygon *poly) {
int i;
moveto(poly->x[0], poly->y[0]); // 将光标移动到第一个顶点处
for (i = 1; i < poly->num_vertices; i++) {
lineto(poly->x[i], poly->y[i]); // 依次连接每个顶点
}
}
// 保存多边形坐标到文件中
void SavePolygons() {
int i, j;
FILE *fp = fopen(FILE_NAME, "w");
if (!fp) {
return;
}
fprintf(fp, "%d\n", num_polygons); // 先保存多边形数
for (i = 0; i < num_polygons; i++) {
fprintf(fp, "%d\n", polygons[i].num_vertices); // 保存顶点数
for (j = 0; j < polygons[i].num_vertices; j++) {
fprintf(fp, "%d %d\n", polygons[i].x[j], polygons[i].y[j]); // 保存每个顶点的坐标
}
}
fclose(fp);
printf("已保存到文件 %s\n", FILE_NAME);
}
// 从文件中读取多边形坐标
void LoadPolygons() {
int i, j;
FILE *fp = fopen(FILE_NAME, "r");
if (!fp) {
return;
}
fscanf(fp, "%d", &num_polygons); // 先读取多边形数
for (i = 0; i < num_polygons; i++) {
fscanf(fp, "%d", &polygons[i].num_vertices); // 读取顶点数
for (j = 0; j < polygons[i].num_vertices; j++) {
fscanf(fp, "%d %d", &polygons[i].x[j], &polygons[i].y[j]); // 读取每个顶点的坐标
}
}
fclose(fp);
}
int main() {
int gd = DETECT, gm, i, j;
int x, y;
char ch;
// 初始化图形界面
initgraph(&gd, &gm, "");
// 加载已保存的多边形坐标
LoadPolygons();
// 绘制多边形
for (i = 0; i < num_polygons; i++) {
DrawPolygon(&polygons[i]);
floodfill(polygons[i].x[0], polygons[i].y[0], getmaxcolor()); // 填充多边形内部
}
// 画布上的鼠标坐标
int mx = -1, my = -1;
// 绘制路径的起点坐标
int start_x = -1, start_y = -1;
// 当前正在绘制的多边形
Polygon *current_poly = NULL;
// 鼠标事件循环
while (1) {
// 获取鼠标状态
if (ismouseclick(WM_MOUSEMOVE)) {
mousemsg msg = getmouse();
mx = msg.x;
my = msg.y;
}
// 显示鼠标坐标和当前正在绘制的多边形的顶点数
setcolor(WHITE);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);
char str[100];
sprintf(str, "Mouse: (%d, %d)", mx, my);
outtextxy(10, 10, str);
if (current_poly) {
sprintf(str, "Vertices: %d", current_poly->num_vertices);
outtextxy(10, 25, str);
}
// 绘制路径
if (current_poly && start_x >= 0 && start_y >= 0) {
setcolor(RED);
moveto(start_x, start_y);
lineto(mx, my);
}
// 处理鼠标左键按下事件
if (ismouseclick(WM_LBUTTONDOWN)) {
mousemsg msg = getmouse();
x = msg.x;
y = msg.y;
// 如果还没有开始绘制多边形,则创建一个新的多边形
if (!current_poly) {
current_poly = &polygons[num_polygons++];
current_poly->num_vertices = 0;
start_x = x;
start_y = y;
}
// 添加新的顶点
current_poly->x[current_poly->num_vertices] = x;
current_poly->y[current_poly->num_vertices] = y;
current_poly->num_vertices++;
// 更新起点坐标
start_x = x;
start_y = y;
}
// 处理鼠标右键按下事件
if (ismouseclick(WM_RBUTTONDOWN)) {
// 结束当前正在绘制的多边形
if (current_poly) {
DrawPolygon(current_poly);
floodfill(current_poly->x[0], current_poly->y[0], getmaxcolor());
current_poly = NULL;
start_x = -1;
start_y = -1;
}
}
// 处理键盘事件
if (kbhit()) {
ch = getch();
if (ch == 's' || ch == 'S') {
// 保存多边形坐标到文件中
SavePolygons();
} else if (ch == 'l' || ch == 'L') {
// 重新加载多边形坐标并绘制
num_polygons = 0;
LoadPolygons();
cleardevice();
for (i = 0; i < num_polygons; i++) {
DrawPolygon(&polygons[i]);
floodfill(polygons[i].x[0], polygons[i].y[0], getmaxcolor());
}
}
}
}
// 关闭图形界面
closegraph();
return 0;
}
```
这段代码使用了 EasyX 图形库,因此需要在编译时链接该库。可以使用以下命令进行编译:
```
gcc main.c -o main.exe -Iinclude -Llib -lgraphics -lwinmm -lmsimg32
```
其中,`-Iinclude` 表示指定头文件的路径,`-Llib` 表示指定库文件的路径,`-lgraphics`、`-lwinmm` 和 `-lmsimg32` 表示链接 EasyX 库的三个动态链接库。如果使用的是其他 C 编译器,可以根据需要进行相应的修改。
mfc多边形输入点坐标绘制多边形 算法
在MFC(Microsoft Foundation Classes)环境中,绘制一个多边形通常涉及以下几个步骤:
1. **创建CDC对象**:首先,你需要获取一个设备上下文(CDC)对象,这是Windows图形API中用于绘图的基本单元。
2. **设置颜色和模式**:使用`CDC::SetPen()`和`CDC::SetBrush()`方法来设定画笔的颜色和线宽,以及填充刷的样式。
3. **开始路径**:使用`CDC::MoveTo()`和`CDC::LineTo()`方法,从第一个顶点开始建立路径,每次添加一个新的点就通过这两个函数连接起来。
4. **输入顶点坐标**:用户需要提供每个顶点的坐标,通常是屏幕上的像素坐标。你可以使用键盘输入、鼠标点击或者其他交互方式获取这些坐标。
5. **闭合路径**:在最后一个点之后,调用`CDC::CloseFigure()`以完成多边形的封闭。
6. **绘制多边形**:最后使用`CDC::DrawPolygon()`或者`CDC::Polygon()`方法来绘制多边形。
7. **提交到DC**:如果是在窗口上绘制,记得调用`CDC::BitBlt()`将绘图内容复制回窗口。
这是一个基本示例:
```cpp
CPaintDC dc(this); // 获取当前窗口的设备上下文
CPoint points[] = {/* 用户提供的顶点坐标数组 */};
int pointCount = sizeof(points) / sizeof(points[0]);
dc.MoveTo(points[0]);
for (int i = 1; i < pointCount; ++i)
{
dc.LineTo(points[i]);
}
dc.CloseFigure();
dc.Polygon(points, pointCount);
```