|
|
|
|
|
//
|
|
|
|
|
|
// SWPosPointcut.h
|
|
|
|
|
|
// DrawTest
|
|
|
|
|
|
//
|
|
|
|
|
|
// Created by 王阳阳 on 2022/9/6.
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef SWPosPointcut_h
|
|
|
|
|
|
#define SWPosPointcut_h
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
#include <QList>
|
|
|
|
|
|
|
|
|
|
|
|
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<SWCirclePoint> 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<SWPosPoint> fillPoints(SWPosPoint prevPoint,SWPosPoint curPoint,double distance);
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* SWPosPointcut_h */
|
|
|
|
|
|
|