# project-1 **Repository Path**: lxx3/project-1 ## Basic Information - **Project Name**: project-1 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 9 - **Created**: 2022-06-16 - **Last Updated**: 2022-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 在线 SVG 编辑器 我这一个学期在参与CAD的开发,看到SVG的需求和CAD的类似。因此使用CAD进行完成。使用的是开源LibreCAD。在此基础上进行二次开发。共实现了两个功能,皆是为了本课程实现的。我的想法是做一个流程图,就是具备矩形、箭头、菱形、圆角矩形。目前实现了矩形、箭头、菱形三个功能。 ## 1.箭头的实现 因为在libreCAD基础上进行二次开发,所有的操作需要推倒重来。不能直接使用QT自带的工具,因为不能完全满足开发的需求。整个箭头分成两部分。 ![arrow](./assets/arrow.png) 1. 直线部分,记录下鼠标的点击的开始和结束位置,使用RS_Line数据结构新建一个line。 2. 箭头部分,采用固定角度,同直线部分45度角。且长度固定。这里需要通过几何计算来确定箭头的尾点。 ​ ```c++ double x = pPoints->corner1.x - pPoints->corner2.x; double y = pPoints->corner1.y - pPoints->corner2.y; double l = sqrt(x * x + y * y); double t = acos(x / l); double a = t * 180 / M_PI; //获取角度 double b = 90 - a; double realAngle = 45 - a; double realAngle2 = b - 45; double offsetX = 4 * cos(realAngle * M_PI / 180); double offsetY = 4 * sin(realAngle * M_PI / 180); ``` ## 2.菱形的实现 ![diamond](./assets/diamond.png) 菱形主要分成四条线段,这部分也可以通过鼠标点击的开始点和结束点,来找到另外两个点。下面是找到点的代码: ```c++ double x_off = pPoints->corner1.x - pPoints->corner2.x; double y_off = pPoints->corner1.y - pPoints->corner2.y; double len = sqrt(x_off * x_off + y_off * y_off); double mid_x = (pPoints->corner1.x + pPoints->corner2.x) / 2; double mid_y = (pPoints->corner1.y + pPoints->corner2.y) / 2; double k = (pPoints->corner1.y - pPoints->corner2.y) / (pPoints->corner1.x - pPoints->corner2.x); double k2 = -1 / k; double t = atan(k2); double angle = t * 180 / M_PI; //获取角度 double offsetX = len / 2 * cos(angle * M_PI / 180); double offsetY = len / 2 * sin(angle * M_PI / 180); double realX = mid_x - offsetX; double realY = mid_y - offsetY; ``` [视频链接](./assets/video.mp4)