VS+C+++EasyX:实现贝塞尔曲线绘制,支持输入输出、鼠标交互与动态控制点添加
好的,下面是一个使用 C++ 和 EasyX 图形库实现的贝塞尔曲线绘制程序。这个程序允许用户输入控制点,绘制贝塞尔曲线,并支持鼠标交互和动态添加控制点。 ```cpp #include <graphics.h> #include <vector> #include <cmath> #include <iostream> // 计算贝塞尔曲线上的点 void bezierCurve(const std::vector<Point>& points, int numPoints) { for (int t = 0; t <= numPoints; ++t) { double u = static_cast<double>(t) / numPoints; double uu = u * u; double uuu = uu * u; Point p; if (points.size() == 2) { // 线性贝塞尔曲线 p.x = (1 - u) * points[0].x + u * points[1].x; p.y = (1 - u) * points[0].y + u * points[1].y; } else if (points.size() == 3) { // 二次贝塞尔曲线 p.x = (1 - u) * (1 - u) * points[0].x + 2 * (1 - u) * u * points[1].x + u * u * points[2].x; p.y = (1 - u) * (1 - u) * points[0].y + 2 * (1 - u) * u * points[1].y + u * u * points[2].y; } else if (points.size() == 4) { // 三次贝塞尔曲线 p.x = (1 - u) * (1 - u) * (1 - u) * points[0].x + 3 * (1 - u) * (1 - u) * u * points[1].x + 3 * (1 - u) * u * u * points[2].x + u * u * u * points[3].x; p.y = (1 - u) * (1 - u) * (1 - u) * points[0].y + 3 * (1 - u) * (1 - u) * u * points[1].y + 3 * (1 - u) * u * u * points[2].y + u * u * u * points[3].y; } setpixel(p.x, p.y, RED); } } // 主函数 int main() { initgraph(800, 600); // 初始化图形窗口 std::vector<Point> controlPoints; while (true) { cleardevice(); // 清除屏幕 // 绘制控制点 for (const auto& point : controlPoints) { circle(point.x, point.y, 5); settextcolor(BLACK); outtextxy(point.x + 10, point.y + 10, "Ctrl Point"); } // 绘制贝塞尔曲线 if (controlPoints.size() >= 2) { bezierCurve(controlPoints, 100); } // 处理鼠标事件 if (GetAsyncKeyState(VK_LBUTTON) & 0x8000) { POINT mousePos; GetCursorPos(&mousePos); ScreenToClient(getwindowhandle(), &mousePos); controlPoints.push_back({mousePos.x, mousePos.y}); continue; } // 处理键盘事件 if (_kbhit()) { char key = _getch(); if (key == 'x') { double x; std::cout << "请输入 x 值: "; std::cin >> x; double y = 0; // 计算对应的 y 值 for (int t = 0; t <= 100; ++t) { double u = static_cast<double>(t) / 100; double uu = u * u; double uuu = uu * u; if (controlPoints.size() == 2) { y = (1 - u) * controlPoints[0].y + u * controlPoints[1].y; } else if (controlPoints.size() == 3) { y = (1 - u) * (1 - u) * controlPoints[0].y + 2 * (1 - u) * u * controlPoints[1].y + u * u * controlPoints[2].y; } else if (controlPoints.size() == 4) { y = (1 - u) * (1 - u) * (1 - u) * controlPoints[0].y + 3 * (1 - u) * (1 - u) * u * controlPoints[1].y + 3 * (1 - u) * u * u * controlPoints[2].y + u * u * u * controlPoints[3].y; } if (fabs(x - ((1 - u) * controlPoints[0].x + u * controlPoints[1].x)) < 1e-6) { break; } } std::cout << "对应的 y 值: " << y << std::endl; } } // 拖动控制点 if (GetAsyncKeyState(VK_RBUTTON) & 0x8000) { POINT mousePos; GetCursorPos(&mousePos); ScreenToClient(getwindowhandle(), &mousePos); for (auto& point : controlPoints) { if (sqrt(pow(mousePos.x - point.x, 2) + pow(mousePos.y - point.y, 2)) < 10) { point.x = mousePos.x; point.y = mousePos.y; break; } } } // 退出条件 if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) { break; } Sleep(10); // 适当延时 } closegraph(); // 关闭图形窗口 return 0; } ``` 额外需要注意的逻辑点: 1. 边界检查:确保在拖动控制点时,不会超出窗口边界。 2. 多线程处理:如果需要更高的响应速度,可以考虑将部分计算任务放到单独的线程中。 3. 错误处理:在输入 x 值时,确保输入的是有效的数字,避免程序崩溃。 希望这段代码能满足你的需求!如果有任何问题或需要进一步优化的地方,请告诉我。 ######[AI写代码神器 | 1440点数解答 | 2024-12-09 14:38:23]
- 超详细!C# WinForm 变身 Web 服务器,实时数据局域网网页同步展示示例(字节豆包 | 635点数解答 | 2024-10-31 22:14:16)216
- 金银岛金属最优装载:部分背包问题详解与Python实现(DeepSeek | 1149点数解答 | 2026-03-15 18:31:56)36
- jQuery 实现动态操作 DOM:打造可增删任务的待办事项列表应用(百度文心 | 1015点数解答 | 2024-10-26 23:41:22)452
- jQuery 打造实用待办事项列表:输入添加、点击删除一步到位!(阿里通义 | 1139点数解答 | 2024-10-29 08:44:48)369
- jQuery 实现动态操作 DOM:打造带添加与删除功能的待办事项列表应用(阿里通义 | 687点数解答 | 2024-10-29 09:25:06)381
- jQuery 实战:打造可添加与删除任务的待办事项列表应用(字节豆包 | 499点数解答 | 2024-10-29 20:40:48)292
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)380
- C语言:利用EasyX实现鼠标交互绘图,新增Ctrl组合键绘制正方形功能(百度文心 | 770点数解答 | 2025-04-22 21:45:53)195
- 代码深度剖析:敌人与子弹实现、内存管理及 `mainSceneDraw` 函数示例(百度文心 | 699点数解答 | 2025-06-22 02:29:25)170
- 用 EASYX 库绘制代码,打造逼真发光物体效果!(字节豆包 | 662点数解答 | 2025-07-07 03:13:04)249
- Python实现:读入正整数后从大到小打印,代码详解!(字节豆包 | 165点数解答 | 2025-12-07 09:44:50)89
- Python求解n以内3的倍数:代码实现及开发注意事项 (字节豆包 | 222点数解答 | 2025-12-07 12:28:15)59