// // SWPosPointcut.h // DrawTest // // Created by 王阳阳 on 2022/9/6. // #ifndef SWPosPointcut_h #define SWPosPointcut_h #include #include #include #include enum SWPosStatus { SWPosRetFail = 0, SWPosRetSuccess = 1, }; typedef enum SWPosStatus SWPosStatus; struct SWPointcut { double x; double y; }; typedef struct SWPointcut SWPointcut; struct SWPosPoint { SWPointcut realPoint; double radius; }; typedef struct SWPosPoint SWPosPoint; struct SWLineSegment { SWPointcut startPoint; SWPointcut endPoint; SWPosStatus status; void *preSegment; SWLineSegment() { preSegment = nullptr; } }; typedef struct SWLineSegment SWLineSegment; /** * 三阶贝塞尔构造圆形 * @brief The SWCirclePoint struct */ struct SWCirclePoint { SWPointcut pointA; SWPointcut pointB; SWPointcut pointC; SWPointcut pointD; SWPointcut pointE; SWPointcut pointF; SWPointcut pointG; SWPointcut pointH; SWPointcut pointI; SWPointcut pointJ; SWPointcut pointK; SWPointcut pointL; SWPointcut pointM; }; typedef struct SWCirclePoint SWCirclePoint; struct SWPosRet { SWPointcut prevLeftPoint;//左侧切点 SWPointcut prevLeftIntersectPoint;//左侧切点交点 SWPointcut prevRightPoint;//右侧切点 SWPointcut prevRightIntersectPoint;//右侧切点交点 SWPointcut curLeftPoint;//当前点左侧切点 SWPointcut curRightPoint;//当前点右侧切点 QList circlePoints;//补点数据 int circleCount;//补点数量 SWPosStatus status;//计算结果状态 }; typedef struct SWPosRet SWPosRet; /** * 初始化 * @brief SWPosRest * @param pos */ void SWPosRest(SWPosPoint pos); /** * 计算切点 * @brief SWGetTangentcurPoint * @param prevPoint 上一个点 * @param curPoint 当前点 * @param leftLine 左侧线段 * @param rightLine 右侧线段 * @param circle 是否补点(1 true 0 false) * @return */ SWPosRet SWGetTangentcurPoint(SWPosPoint prevPoint,SWPosPoint curPoint,SWLineSegment leftLine,SWLineSegment rightLine,int circle); /** * 获取两点距离 * @brief GetPointDistance * @param start 开始点 * @param end 结束点 * @return */ double GetPointDistance(SWPosPoint start, SWPosPoint end); /** * 获取直线上某点位置 * @brief SWratioPoint * @param startPoint 线径开始点 * @param endPoint 线径结束点 * @param ratio 指定点所占线径长度百分比 * @return */ SWPointcut SWratioPoint(SWPointcut startPoint, SWPointcut endPoint, double ratio); /** * 根据中心点进行角度旋转 * @brief SWrotatePoint * @param point 圆上某一点 * @param center 圆心点 * @param angle 旋转角度(逆时针旋转) * @return */ SWPointcut SWrotatePoint(SWPointcut point, SWPointcut center, double angle); /** * 获取线段交点(线段为向量) * @brief SWgetEdgePoint * @param a 第一条线段开始点 * @param b 第一条线段结束点 * @param c 第二条线段开始点 * @param d 第二条线段结束点 * @param e 设备点 * @param directionLine 线径方位(1左侧线段0右侧线段) * @return */ SWPointcut SWgetEdgePoint(SWPointcut a, SWPointcut b, SWPointcut c, SWPointcut d,SWPointcut e,int directionLine); /** * 构造无效线段 * @brief SWLineMakeZero * @return */ SWLineSegment SWLineMakeZero(void); /** * 构造无效设备点 * @brief SWPosPointMakeZero * @return */ SWPosPoint SWPosPointMakeZero(void); /** * 构造有效线段 * @brief SWLineMake * @param x1 * @param y1 * @param x2 * @param y2 * @return */ SWLineSegment SWLineMake(double x1,double y1,double x2, double y2); /** * 构造点 * @brief SWPointCutMake * @param x * @param y * @return */ SWPointcut SWPointCutMake(double x,double y); /** * 构造设备点 * @brief SWPosPointMake * @param x * @param y * @param radius * @return */ SWPosPoint SWPosPointMake(double x,double y,double radius); /** * 获取延长线交点(线段为向量) * @brief SWExtendPoint * @param a 第一条线段开始点 * @param b 第一条线段结束点 * @param c 第二条线段开始点 * @param d 第二条线段结束点 * @return */ SWPointcut SWExtendPoint(SWPointcut a, SWPointcut b, SWPointcut c,SWPointcut d); /** * 计算两条直线夹角(弧度,线段为向量) * @brief SWBetweenLinesrads * @param line1Start 第一条线段开始点 * @param line1End 第一条线段结束点 * @param line2Start 第二条线段开始点 * @param line2End 第二条线段结束点 * @return */\ double SWBetweenLinesrads(SWPointcut line1Start, SWPointcut line1End, SWPointcut line2Start, SWPointcut line2End); /** * 根据速度 压感 计算点半径 * @brief CalculatePointradius * @param speed 速度 * @param prevPointradius 上一个半径值 * @param radius 半径 * @param force 实时压感 * @param maxForce 最大压感 * @param stressSpl 压力灵敏度 * @param forceEnable 是否开启(1开启0关闭) * @param distance 点距离 * @return */ double CalculatePointradius(double speed,double prevPointradius,double radius, double force ,double maxForce,double stressSpl, int forceEnable,double distance); /** * 计算笔锋 * @brief CalculateStroke * @param posAry 线径点集合 * @param length * @param preRadius 上一个半径 * @return */ SWPosPoint * CalculateStroke(SWPosPoint posAry[],int length,double preRadius); /** * 防抖处理 * @brief CalculateShake * @param prePoint * @param curPoint * @param nextPoint * @return */ SWPosStatus CalculateShake(SWPosPoint prePoint,SWPosPoint curPoint,SWPosPoint nextPoint); /** * 坐标点比较 * @brief SWPosEqualToPos * @param pos1 * @param pos2 * @return */ SWPosStatus SWPosEqualToPos(SWPosPoint pos1,SWPosPoint pos2); SWPointcut GetMaleTangentPointValue(SWPosPoint point, double a); /** 判断落点是否在矩形内 */ SWPosStatus IsPointInMatrix(SWPointcut p1 ,SWPointcut p2,SWPointcut p3 ,SWPointcut p4,SWPointcut p); double GetCross(SWPointcut p1, SWPointcut p2,SWPointcut p); SWPointcut ExPandLine(SWPointcut pt1,SWPointcut pt2,double nLen); /** 构建圆形贝塞尔曲线 */ SWCirclePoint SWCircleMake(SWPosPoint center); double getAngle(double x1, double y1, double x2, double y2); SWPointcut getSamllAngleVertex(SWPointcut b, SWPointcut c,double cosAngle); SWPointcut calcNewPoint(SWPointcut p, SWPointcut pCenter, double theta); /** * 获取线径补充圆点 * @brief getCircleSegments * @param prevPoint * @param curPoint * @param leftLine * @param rightLine * @param distance * @param step * @return */ SWPosRet getCircleSegments(SWPosPoint prevPoint,SWPosPoint curPoint, SWLineSegment leftLine,SWLineSegment rightLine, double distance,int step); int isPointOnLine(double x, double y, SWPointcut start, SWPointcut end); /** * 填充设备点 * @brief fillPoints * @param prevPoint * @param curPoint * @param distance * @return */ QList fillPoints(SWPosPoint prevPoint,SWPosPoint curPoint,double distance); #endif /* SWPosPointcut_h */